MyBatis原理分析
参考博客: 深入理解mybatis原理: http://blog.csdn.net/luanlouis/article/details/40422941
一 . JDBC的工作流程:
加载数据库的驱动程序->创建数据连接对象->创建Statement对象->执行SQL语句->处理返回结果集->关闭数据库连接
二 . mybatis和数据库交互的方式
1 . 使用传统的mybatis提供的API:此方式创建一个SqlSession对象,根据传入的StatementId和参数操作数据库
2 . 使用Mapper接口:将配置文件中的每一个<mapper>节点抽象为一个Mapper接口,这个接口中声明的方法对应<mapper>中节点的id值,parameterType 为方法的入参,resultMap为返回值。根据MyBatis 的配置规范配置好后,通过SqlSession.getMapper(XXXMapper.class)
方法,MyBatis 会根据相应的接口声明的方法信息,通过动态代理机制生成一个Mapper 实例,我们使用Mapper 接口的某一个方法时,MyBatis 会根据这个方法的方法名和参数类型,确定StatementId,底层还是通过SqlSession.select("statementId",parameterObject)
或者SqlSession.update("statementId",parameterObject)
等来实现对数据库的操作。
三 . SqlSession的工作过程分析
1.开启一个数据库访问会话---创建SqlSession对象:MyBatis使用SQLSession对象来封装一次数据库的会话访问。通过该对象实现对事务的控制和数据查询。SqlSession sqlSession = factory.openSession();
2.为SqlSession传递一个配置的Sql语句 的StatementId和参数params,然后返回结果:List<User> result = sqlSession.selectList("com.pepper.dao.UserMapper.selectByName",params);
SqlSession的职能是:SqlSession根据Statement Id, 在mybatis配置对象Configuration中获取到对应的MappedStatement对象,然后调用mybatis执行器来执行具体的操作。
3.MyBatis执行器Executor根据SqlSession传递的参数执行query()
方法。Executor.query()
方法会创建一个StatementHandler对象,然后将必要的参数传递给StatementHandler,使用StatementHandler来完成对数据库的查询,最终返回List结果集。
Executor的功能和作用是:
(1)、根据传递的参数,完成SQL语句的动态解析,生成BoundSql对象,供StatementHandler使用;
(2)、为查询创建缓存,以提高性能;
(3)、创建JDBC的Statement连接对象,传递给StatementHandler对象,返回List查询结果。
4.StatementHandler对象负责设置Statement对象中的查询参数、处理JDBC返回的resultSet,将resultSet加工为List 集合返回:StatementHandler对象主要完成两个工作:
(1). 对于JDBC的PreparedStatement类型的对象,创建的过程中,SQL语句字符串会包含 若干个`?` 占位符,之后再对占位符进行设值。StatementHandler通过parameterize(statement)
方法对Statement进行设值;
(2).StatementHandler通过List<E> query(Statement statement, ResultHandler resultHandler)
方法来完成执行Statement,和将Statement对象返回的resultSet封装成List;
5.StatementHandler 的parameterize(statement)
方法调用了 ParameterHandler的setParameters(statement)
方法,
6.ParameterHandler的setParameters(Statement)
方法负责 根据我们输入的参数,对statement对象的` ? `占位符处进行赋值。
StatementHandler 的List<E> query(Statement statement, ResultHandler resultHandler)
方法调用了ResultSetHandler的handleResultSets(Statement)
方法。ResultSetHandler的handleResultSets(Statement)
方法会将Statement语句执行后生成的resultSet 结果集转换成List<E> 结果集.