mybatis是一个持久层框架,底层封装了JDBC,程序员只需要做简单的配置,和完成接口开发,就能实现CRUD操作,简化了开发。同时减少了硬编码,将sql在配置文件中配置,修改sql也不用重编译,便于系统的维护。
mybaitis也有自己的缓存,但是很少用,它的一级缓存是session级别的,二级缓存是mapper级别的,session级别是默认开启的,而二级缓存是默认关闭的,如果使用的话,需要在配置文件中进行开启;
mybatis中#{}和${}的区别,#{}这个是mybatis底层在加载配置文件的时候通过反射机制解析成?号,而${}这个是在执行过程中通过OGNL表达式解析成具体的值student.name这样的,#{}这个是相对安全一下,${}有可能引起sql注入的问题,在使用like的时候一般使用${}例如:like '%${student.name}%'
mybatis中有两个配置文件,全局配置文件sqlMapConfig.xml和映射配置文件mapper.xml,全局配置文件中配置数据源,事务等,配置文件中配置sql语句信息。
mybatis的执行流程
加载配置文件信息(全局配置文件和映射配置文件),全局配置文件加载成Configration对象,映射配置文件加载成MapperedStatement对象,
sqlsession的执行过程
1、获取连接,找到Configration对象,获取对象中的DataSource,通过DataSource获取连接
2、获取sql信息,找到Configration对象,通过传入的statementid找到对应的MapperedStatement对象
3、通过MapperedStatement对象找到,获取SqlSource对象,进而找到BoundSql对象,BoundSql封装的是JDBC可以执行的sql
4、解析参数信息,根据MapperedStatment找到配置的参数类型和参数数据,将参数信息通过反射,或者OGNL手段放入到Sql语句中的指定位置
5、向数据库发出执行查询,查询出结果集映射到MapperedStatement中配置的结果集对象中
6、解析结果集可以进行其他逻辑操作
mybatis中有逆向工程的功能,可以通过执行逆向工程,会生成指定表的单表的CRUD操作映射文件及接口,程序员只需要关注多表的关联查询即可,单表的都可以生成
mybatis有延迟加载功能,延迟加载就是为了提升性能,延迟加载分为:侵入式延迟加载和深度延迟加载
侵入式延迟加载:访问主对象的时候,不仅要加载主对象,同时也会加载到辅助对象
深度延迟加载:访问主对象的时候,只会加载主对象,只有当访问关联对象属性的时候,才会真正的加载辅助对象
延迟加载会产生N+1的问题,只有关联查询才会有这种问题,是因为主表的信息比较少,但是附表的信息很多,查询一次主表,会查询多次附表,这样就会产生N+1的问题
mybatis使用了动态代理,动态代理分为JDK动态代理,CGLIB动态代理
JDK动态代理:用接口实现
CGLIB动态代理:底层是通过继承来实现的