Mybatis执行流程
获取配置文件的文件流–Resources。
实例化SqlSessionFactoryBuilder构建器
实例化SqlSessionFactory
-
调用build,实例化XMLConfigBuilder 解析配置文件
-
根据传入的inputStream解析Configuration对象
创建SqlSession
获取Mapper映射
- Mapper接口的包路径名-------映射文件的namespace。
- Mapper接口的方法名----------映射文件中Mapper的Statement的Id值。
- Mapper接口没有实现类,当调用接口方法时,接口全包名+方法名拼接作为key值,可定位一个唯一的MapperStatement
- Mapper中方法不能重载,因为需要接口全名+方法名来保存和寻找执行策略。
- 工作原理:JDK动态代理,拦截接口方法执行MapperStatement代表的sql,然后将结果返回。
采用HashMap存放mapper。
执行CRUD,结果封装。
SQL执行结果如何封装
- 根据标签,逐一对照数据库列名与对象属性名之间映射关系。
- SQL的别名功能,将别名书写到对象属性名。
- 有了列名与属性名映射关系后,Mybatis通过反射创建对象,并给对象的属性赋值,找不到映射关系的属性,无法赋值。
executor内部判断SQL类型,对结果进行封装
SqlSessionFactoryBuilder生命周期
一旦创建SqlSessionFactory后,SqlSessionFactoryBuilder就不再需要。
//读取资源配置类
InputStream resourceAsStream = Resources.getResourceAsStream("mybatis-config.xml");
//由文件流生成SqlSessionFactory
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(resourceAsStream);
SqlSessionFactory
- 生命周期:一旦创建,它会一直存在。
适合单例模式或静态单例模式。 - 作用域:整个应用程序。
SqlSession
- 生命周期:创建会话开始到数据操作结束关闭。
- 作用域:请求方法内,用完就关。
- 线程不安全的。
获取SqlSession,核心的执行器executor
跟着执行器进入doUpdate方法。执行SQL语句需要创建Statement
通过Connection创建prepareStatement
通过传入参数transaction获取Connection
最后进入JdbcTransaction类,只能Connection为空时才再次创建,
可以看到一次SqlSession的执行最终是通过是通过事务获取了连接,而一个session中只能有一个事务,一个事务又只能有一个连接,所以一个session中只有一个connection。