Mybatis
本文从mybatis 初始化流程开始,根据源码逐步剖析
首先先思考一下这几个问题
Mybatis解决了什么问题? 无非是简化数据库操作、实现封装、让程序员更关注SQL本身、维护便利
它是如何解决这些问题的?
Mybatis是运行在什么样的环境下的?
它如何读取解析用户定义的配置信息?即如何初始化的
它的环境结构是什么样的?
在这一环境下如何 实现做增删查改
如何执行SQL
如何执行动态SQL
如何拼接查询参数等等
我知道了这些原理后,我能做些什么?
例如用 Mybatis来扩展一个分页插件
Mybatis存在哪些我觉得可以改进的地方
正经的分割线
带着这些问题,我们从一个TestCase开始
传统jdbc流程
注册驱动
获取连接
准备SQL执行statement
设置SQL参数
执行SQL,获取到结果集
解析结果集
依次关闭结果集,statement,数据库连接
Class.forName(Driver.class.getName());
Connection connection = DriverManager.getConnection("jdbc:mysql://localhost:3306/xxx?characterEncoding=utf-8", "root", "root");
PreparedStatement preparedStatement = connection.prepareStatement("select * from test where id=?");
preparedStatement.setString(1,"1");
ResultSet resultSet = preparedStatement.executeQuery();
while (resultSet.next()) {
String columnName1 = resultSet.getMetaData().getColumnName(1);
String columnName2 = resultSet.getMetaData().getColumnName(2);
System.out.println(columnName1+":"+resultSet.getString(1));
System.out.println(columnName2+":"+resultSet.getString(2));
}
resultSet.close();
preparedStatement.close();
connection.close();
Mybatis初始化,主体流程
解析config.xml,读取主配置文件,解析及下所有内容
获取 设置的 别名,对象工厂,对象反射信息
解析 各个mappers 信息, 包括:xml 和 注解形式, 封装成 MapperedStatement 放入Map中待用, 解析信息包括:
自定义的缓存标签设置解析
自定义的参数映射解析
resultMap标签映射配置
sql标签解析
解析各个CRUD 标签
先从一段测试代码开始,以xml配置为例(注解方式流程解析思想都相同)
注意 阅读 序号 (1)、(2)、(3)、(4)、(5)、(6)
Test.java
(1)通过SqlSessionFactoryBuilder构建mybatis初始化组件,见下一代码栏 解释
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(“xxx/mybatis.xml”);
// 使用一个SqlSession作为此次连接, 主要讲这儿,初始化流程
SqlSession sqlSession = sqlSessionFactory.openSession();
// 动态代理 执行SQL
CustomMapper mapper = sqlSession.getMapper(DemoMapper.class);
Map map = new HashMap<>();
map.