图灵学院 java架构师学习路线-MyBatis中的一些概念
1.MyBatis是个什么东西
在使用MyBatis的项目中,日志中通常会有许多拼接的SQL语句,这实际上表明MyBatis的底层仍是使用JDBC实现的。基于JDBC,出于性能考虑,所有语句均基于SqlSession。顾名思义,维护此类的实例实际上是维护与数据库连接的会话,并且该会话中可能有缓存。
2.mapper接口是怎么映射成SQL语句的
目前多数开发者还是会使用XML来进行MyBatis的配置,包括MyBatis的核心配置和SQL映射配置。其实和注解一样,XML本身只不过是一个元数据的载体,最终起作用的还是MyBatis的核心类。其中有这样几个比较重要的:
SqlSessionFactoryBuilder,用来创建SqlSessionFactory的实例,之后就没有用了,其生命周期只是在初始化的时候有作用。
SqlSessionFactory,MyBatis最基础的类,用来创建会话(即SqlSession的实例),其生命周期与整个系统的生命周期相同,在系统运行的任何时候都可以使用它查询到当前数据库的配置信息等。
SqlSession,真正的和数据库之间的会话,线程不安全,所以其生命周期和使用它的线程相同。
各种Mapper,承载了实际的业务逻辑,其生命周期比较短,由SqlSession创建。
3.Spring环境中MyBatis的初始化过程
实际情况中MyBatis往往是在Spring的环境中使用的,MyBatis本身并不依赖Spring,但是使用Spring可以极大的提高开发效率,由于Spring进行了控制反转,所以其中MyBatis的初始化过程和正常过程稍稍有些不同:
Spring发现需要创建SqlSessionFactory实例,会在classpath下找到MyBatis的核心配置文件,使用它来初始化一个SqlSessionFactory实例。当然,这一步完全可以使用代码来完成,或者使用注解,就更加清晰明了。
往往mapper类也会作为bean注入到代码中去的,那么Spring会使用上一步中的SqlSessionFactory实例来创建SqlSession的实例。
然后再使用SqlSession尝试创建各个mapper对象。
于此同时,MyBatis会扫描classpath下的mapper映射XML文件(此路径可以自定义),对于每一个mapper接口,它的「类全名」会作为命名空间,来和映射文件中的mapper标签进行匹配。
对于每一个映射文件中的一个执行语句标签(如select、delete),MyBatis会把他们映射到SqlSession的方法上,创建mapper接口的一个实现类。
如果mapper接口和其映射文件一一匹配,则bean创建成功。