本文将通过对 MyBatis 基础知识的总结,加深对 MyBatis 的理解与应用。
一、MyBatis 框架概述
mybatis 是一个优秀的基于 java 的持久层框架,它内部封装了 jdbc,使开发者只需要关注 sql 语句本身,而不需要花费精力去处理加载驱动、创建连接、创建 statement 等繁杂的过程。
mybatis 通过 xml 或注解的方式将要执行的各种 statement 配置起来,并通过 java 对象和 statement 中sql 的动态参数进行映射生成最终执行的 sql 语句,最后由 mybatis 框架执行 sql 并将结果映射为 java 对象并返回。
它封装了jdbc 操作的很多细节,使开发者只需要关注sql语句本身,而无需关注注册驱动,创建连接等繁杂过程
采用了ORM 思想解决了实体和数据库映射的问题,实现了结果集的封装。
ORM
- Object Relational Mappging 对象关系映射
简单的说:
- 就是把数据库表和实体类及实体类的属性对应起来
- 让我们可以操作实体类就实现操作数据库表。
| 数据库 |
实体类 |
| user |
User->User |
| id |
userId->id |
| user_name |
userName->user_name |
二、JDBC 的回顾与分析
三、MyBatis 框架快速入门
编写 User 实体类
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34
| package gavino.mybatis.domain; import java.io.Serializable; import java.util.Date; /** * @author Yan weigang */ public class User implements Serializable { private Integer userId; private String userName; private String userAddress; private String userSex; private Date userBirthday;
public Integer getUserId() { return userId; } public void setUserId(Integer userId) { this.userId = userId; } //......此处为节省篇幅省去部分Getter and Setter public void setUserBirthday(Date userBirthday) { this.userBirthday = userBirthday; } @Override public String toString() { return "User{" + "userId=" + userId + ", userName='" + userName + '\'' + ", userAddress='" + userAddress + '\'' + ", userSex='" + userSex + '\'' + ", userBirthday=" + userBirthday + '}'; } }
|
编写持久层接口 IUserDao
1 2 3 4 5 6 7 8 9
| package gavino.mybatis.dao; import gavino.mybatis.domain.User; import java.util.List; /** * @author Yan weigang */ public interface IUserDao { List<User> findAll(); }
|
编写持久层接口的映射文件 IUserDao.xml
1 2 3 4 5 6 7 8 9 10
| <?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd"> <mapper namespace="gavino.mybatis.dao.IUserDao"> <!--配置查询所有--> <select id="findAll" resultType="lut.dats.mybatis.test.domain.User"> select * from user </select> </mapper>
|
编写测试类
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39
| package gavino.mybatis.test;
import gavino.mybatis.dao.IUserDao; import gavino.mybatis.domain.User; import org.apache.ibatis.io.Resources; import org.apache.ibatis.session.SqlSession; import org.apache.ibatis.session.SqlSessionFactory; import org.apache.ibatis.session.SqlSessionFactoryBuilder; import org.junit.jupiter.api.Test;
import java.io.IOException; import java.io.InputStream; import java.util.List;
/** * @author Yan weigang */ public class MybatisTest { @Test public void testMybatis() throws IOException { //读取配置文件 InputStream is = Resources.getResourceAsStream("SqlMapConfig.xml"); //创建 SqlSessionFactory 的构建者对象 SqlSessionFactoryBuilder builder = new SqlSessionFactoryBuilder(); //使用构建者创建工厂对象 SqlSessionFactory SqlSessionFactory factory = builder.build(is); //使用 SqlSessionFactory 生产 SqlSession 对象 SqlSession session = factory.openSession(); //使用 SqlSession 创建 dao 接口的代理对象 IUserDao mapper = session.getMapper(IUserDao.class); //使用代理对象执行查询所有方法 List<User> users = mapper.findAll(); users.forEach(user -> System.out.println(user)); session.commit(); //释放资源 session.close(); is.close(); } }
|
总结
- mybatis的环境搭建
- 第一步:创建maven工程并导入坐标
- 第二步:创建实体类和dao的接口
- 第三步:创建Mybatis的主配置文件 SqlMapConifg.xml
- 第四步:创建映射配置文件 IUserDao.xml
- 环境搭建的注意事项:
- 第一个:创建IUserDao.xml 和 IUserDao.java时名称是为了和我们之前的知识保持一致。
在Mybatis中它把持久层的操作接口名称和映射文件也叫做:Mapper
所以:IUserDao 和 IUserMapper是一样的
- 第二个:在idea中创建目录的时候,它和包是不一样的
包在创建时:lut.gavino.dao它是三级结构
目录在创建时:lut.gavino.dao是一级目录
- 第三个:mybatis的映射配置文件位置必须和dao接口的包结构相同
- 第四个:映射配置文件的mapper标签namespace属性的取值必须是dao接口的全限定类名
- 第五个:映射配置文件的操作配置(select),id属性的取值必须是dao接口的方法名
注意
不要忘记在映射配置中告知mybatis要封装到哪个实体类中
配置的方式:指定实体类的全限定类名
明确
我们在实际开发中,都是越简便越好,所以都是采用不写dao实现类的方式。
不管使用XML还是注解配置。
但是Mybatis它是支持写dao实现类的。
四、MyBatis 中的设计模式
1 2 3 4 5 6 7 8
| /创建 SqlSessionFactory 的构建者对象 SqlSessionFactoryBuilder builder = new SqlSessionFactoryBuilder(); //使用构建者创建工厂对象 SqlSessionFactory SqlSessionFactory factory = builder.build(is); //使用 SqlSessionFactory 生产 SqlSession 对象 SqlSession session = factory.openSession(); //使用 SqlSession 创建 dao 接口的代理对象 IUserDao mapper = session.getMapper(IUserDao.class);
|
构建者模式
创建工厂mybatis 使用了构建者模式
把对象的创建细节隐藏,使使用者直接调用方法即可拿到对象
工厂模式
生产SqlSession 使用了工厂模式
优势:解耦(降低类之间的依赖关系)
代理模式
创建Dao接口实现类使用了代理模式
优势: 不修改源码的基础上对已有方法增强
五、MyBatis 底层原理及其自定义分析
六、基于代理 DAO 实现 CRUD 操作
七、MyBatis 的参数深入
八、MyBatis 的输出结果封装
九、SqlMapConfig.xml 配置文件
十、MyBatis 连接池与事务深入
十一、MyBatis 的动态 SQL 语句
十二、MyBatis 多表查询之一对多
十三、MyBatis 多表查询之多对多
十四、MyBatis 延迟加载策略
十五、MyBatis 缓存
Mybatis 一级缓存
Mybatis 二级缓存
注意:
- 针对每次查询都需要最新的数据 sql,要设置成 useCache=false,禁用二级缓存。
- 当我们在使用二级缓存时,所缓存的类一定要实现 java.io.Serializable 接口,这种就可以使用序列化方式来保存对象。
十六、MyBatis 注解开发
mybatis 的常用注解说明
@Insert:实现新增
@Update:实现更新
@Delete:实现删除
@Select:实现查询
@Result:实现结果集封装
@Results:可以与
@Result 一起使用,封装多个结果集
@ResultMap:实现引用
@Results 定义的封装
@One:实现一对一结果集封装
@Many:实现一对多结果集封装
@SelectProvider: 实现动态 SQL 映射
@CacheNamespace:实现注解二级缓存的使用