目录
- 了解MyBatis
- 掌握MyBatis与Hibernate的区别
- 安装使用MyBatis
- 了解MyBatis的基本构架
- 掌握以XML和Java使用MyBatis
- 掌握MyBatis的XML配置文件的使用
- 完成第一个MyBatis程序的编写
什么是MyBatis
- MyBatis 是一款优秀的持久层框架,它支持定制化 SQL、存储过程以及高级映射。
- MyBatis 避免了几乎所有的 JDBC 代码和手动设置参数以及获取结果集。
- MyBatis 可以使用简单的 XML 或注解来配置和映射原生信息,将接口和 Java 的 POJOs(Plain Old Java Objects,普通的 Java对象)映射成数据库中的记录。
MyBatis的发展历史
- MyBaits的前身是Apache的一个开源项目iBatis
- 2010年这个项目由Apache Software Foundation 迁移到了 Google Code 并且改名为MyBatis
- 2013年11月迁移到GitHub,目前MyBaits是由GitHub维护的
MyBatis和Hibernate与JDBC的对比
- MyBatis和Hibernate都是ORM框架,都是对JDBC的封装,能够简化DAO层代码的编写
- MyBatis是基于SQL的半自动化ORM框架,使用原生SQL,支持对SQL的高度定制,弱化了表间关联关系的使用
- Hibernate是面向对象的ORM框架,可使用原生SQL, HQL,严重依赖于表间的关联关系
- MyBatis相比Hibernate拥有更好的性能
- MyBatis只需要提供DAO接口,DAO接口的实现类会由MyBatis自动生成
- Hibernate需要开发者编写DAO接口的实现类
- MyBatis一般与SpringMVC, Spring结合使用,组成”SSM”框架
- Hibernate一般与Struts2, Spring结合使用,组成”SSH”框架
MyBatis的使用场景
- 与SpringMVC和Spring框架整合的应用
- 追求高度定制化SQL的应用
- 对性能有一定要求的应用
- 大部分的互联网项目会选择使用”SSM”框架
MyBatis的安装使用
下载JAR包的方式
只需要把下载的
zip
文件里的
mybatis-x.x.x.jar
加入到
Classpath
路径中(本课程中使用
3.4.5
版本)。下载地址:
Releases · mybatis/mybatis-3 · GitHub
Maven构建的方式
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.4.5</version>
</dependency>
注意:同时需要把数据库驱动JAR引用到项目中,本课程中使用的是MySQL5.5及以上版本
MyBatis的基本构架
MyBatis的基本架构
- SqlMapConfig.xml,此文件作为MyBatis的全局配置文件,配置了MyBatis的运行环境等信息。mapper.xml文件即sql映射文件,文件中配置了操作数据库的sql语句,此文件需要在SqlMapConfig.xml中加载。
- 通过MyBatis环境等配置信息构造SqlSessionFactory(即会话工厂)。
- 由会话工厂创建SqlSession即会话,操作数据库需要通过SqlSession进行。
- MyBatis底层自定义了Executor执行器接口操作数据库,Executor接口有两个实现,一个是基本执行器、一个是缓存执行器。
- MappedStatement也是MyBatis一个底层封装对象,它包装了MyBatis配置信息及sql映射信息等。mapper.xml文件中一个sql对应一个MappedStatement对象,sql的id即是MappedStatement的id。
- MappedStatement对sql执行输入参数进行定义,包括HashMap、基本类型、pojo,Executor通过MappedStatement在执行sql前将输入的Java对象映射至sql中,输入参数映射就是JDBC编程中对PreparedStatement设置参数。
- MappedStatement对sql执行输出结果进行定义,包括HashMap、基本类型、pojo,Executor通过MappedStatement在执行sql后将输出结果映射至java对象中,输出结果映射过程相当于JDBC编程中对ResultSet的解析处理过程。
MyBatis的核心类
- SqlSessionFactoryBuilder:SqlSession工厂构建器,使用SqlSessionFactoryBuilder创建SqlSessionFactory类的实例,一旦创建了 SqlSessionFactory类的实例,就不再需要SqlSessionFactoryBuilder了。
- SqlSessionFactory:SqlSession工厂类,用于创建SqlSession类实例的工厂。 SqlSessionFactory类的实例一旦被创建就应该在应用的运行期间一直存在,不能对它进行清除或重建。
- SqlSession:Sql会话,用于获取Mapper映射。SqlSession类的实例是非线程安全的,当访问完数据库后需要及时关闭SqlSession。
- Mapper: 映射器是创建用来绑定映射语句的接口。映射器接口的实例是从 SqlSession 中获得的。一个映射器实例对应一个SQL映射文件。
- Mapper映射器就是MVC框架中的DAO接口。
以上四个核心类的关系为:
- 1、由SqlSessionFactoryBuilder创建SqlSessionFactory
- 2、由SqlSessionFactory获取SqlSession
- 3、由SqlSession获取Mapper映射器(DAO接口)实例
- 4、由Mapper映射器(DAO接口)实例调用指定的SQL语句
- 3、由SqlSession获取Mapper映射器(DAO接口)实例
- 2、由SqlSessionFactory获取SqlSession
创建即将使用的数据库及数据库表
创建d_mybatis数据库:
create database if not exists d_mybatis default charset utf8 collate utf8_general_ci;
创建t_department部门数据表:
create table t_department (
id int primary key auto_increment,
title varchar(20) not null,
des varchar(200)
);
从Java代码开始使用MyBatis
- 第一步:在com.gs.bean包中创建t_department表对应的JavaBean对象Department,提供属性的getter/setter方法,并重写toString()方法,此处省略JavaBean的创建代码
- 第二步:在com.gs.mybatis包中使用MyBatis提供的PooledDataSource创建数据源,并封装成一个工具类
-
package com.mybatis; import org.apache.ibatis.datasource.pooled.PooledDataSource; import javax.sql.DataSource; public class DataSourceFactory { public static DataSource getDataSource(){ //驱动 String driver="com.mysql.jdbc.Driver"; //连接字符串 String url="jdbc:mysql://localhost:3306/practice?allowMultiQueries=true&useUnicode=true&characterEncoding=UTF-8&useSSL=false&allowPublicKeyRetrieval=true"; //用户名 String username="root"; //密码 String password="1234"; return new PooledDataSource(driver,url,username,password); } }
-
第三步:在 com.gs.dao 包中创建 Mapper 映射器接口也即 DAO 接口 DepartmentDAO
- 第四步:在com.gs.mybatis包中编写一个MyBatisJava类,在main方法中使用数据源和SqlSessionFactoryBuilder获取SqlSessionFactory
- 第五步:由SqlSessionFactory获取SqlSession
- 第六步:由SqlSession获取映射器接口并调用方法执行相应的SQL语句
- 第七步:在第六步中,获取到了DepartmentDAO接口,并调用listAll方法,但是listAll究竟会执行哪个SQL呢?此时我们需要在com.gs.dao包中创建Mapper映射器接口对应的SQL映射文件DepartmentDAO.xml
说明 1 : xml 映射文件名与 DAO 接口名相同,并且此文件与 DepartmentDAO 接口类在同一个包中说明 2 : <mapper> 标签的 namespace 属性值必须是对应的 DAO 接口类的全限定名说明 3 : <select> 标签的 id 属性值必须与 DAO 接口中的方法名相同且唯一说明 4 : MyBatis 会自动生成 DAO 接口的实现类,不需要开发者手动实现。 MyBatis 使用 DAO 接口调用方法时,通过与之对应的映射文件就可以唯一确定需要运行的 SQL 语句说明5:如果是maven项目,xml文件要放在resources对应的文件夹
- 第八步:执行第四步到第六步写完的main方法,查看结果,发现已经把所有的Department信息都查询出来了。注意:执行前请先往数据库表增加几条记录
从XML配置文件开始使用MyBatis
- 第一步:在src根目录下创建jdbc.properties配置文件,存储DataSource数据源信息
jdbc.driverClassName=com.mysql.jdbc.Driver
jdbc.driverUrl=jdbc:mysql://localhost:3306/d_mybatis?useUnicode=true&characterEncoding=utf-8
jdbc.user=root
jdbc.password=root
- 第二步:在com.gs.dao包中创建Mapper映射器接口对应的SQL映射文件DepartmentDAO.xml,可直接使用前面Java代码中创建好的DepartmentDAO.xml
- 第三步:在src根目录中添加MyBatis的XML配置文件mybatis.xml
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configuration
PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
<properties resource="jdbc.properties" /> <!-- 引用jdbc配置文件 -->
<environments default="development">
<environment id="development">
<transactionManager type="JDBC"/> <!-- 声明jdbc事务处理 -->
<dataSource type="POOLED">
<property name="driver" value="${jdbc.driverClassName}"/>
<property name="url" value="${jdbc.driverUrl}"/>
<property name="username" value="${jdbc.user}"/>
<property name="password" value="${jdbc.password}"/>
</dataSource>
</environment>
</environments>
<mappers>
<mapper resource="com/gs/dao/DepartmentDAO.xml"/> <!-- 引用Mapper接口的sql映射文件 -->
</mappers>
</configuration>
- 第四步:在com.gs.dao包中创建Mapper映射器接口也即DAO接口DepartmentDAO。可直接使用前面Java代码中创建好的DepartmentDAO接口
- 第五步:在com.gs.mybatis包中编写一个MyBatisXML类,在main方法中由MyBatis配置文件和SqlSessionFactoryBuilder获取SqlSessionFactory
- 第六步:由SqlSessionFactory获取SqlSession
- 第七步:由SqlSession获取映射器接口并调用方法执行相应的SQL语句
- 第八步:执行第四步到第六步写完的main方法,查看结果,发现已经把所有的Department信息都查询出来了。
两种使用MyBatis方式的区别
使用
Java
代码和
XML
配置文件的方式使用
MyBatis
,唯一的区别就在于数据源和
MyBatis
的配置上,前者使用纯
Java
代码,而后者通过
XML
文件来配置,我们推荐使用
XML
配置文件的方式。在后期框架的整合过程中也都是使用
XML
配置文件。
本人从事软件项目开发20多年,2005年开始从事Java工程师系列课程的教学工作,录制50多门精品视频课程,包含java基础,jspweb开发,SSH,SSM,SpringBoot,SpringCloud,人工智能,在线支付等众多商业项目,每门课程都包含有项目实战,上课PPT,及完整的源代码下载,有兴趣的朋友可以看看我的在线课堂
讲师课堂链接:https://edu.csdn.net/lecturer/893