mybatis介绍
Java编写的持久层框架
- 实质:就是对jdbc的优化
- 避免了几乎所有的JDBC代码和手动设置参数以及获取结果集
- 可以用简单的xml或注解来配置和映射原生类型,
缓存
一级缓存(默认开启)
- 针对每个sqlsession而言
二级缓存
- namespace
延迟加载
是否支持延迟加载 :
- 支持association关联对象(一对一)和collection关联集合对象(一对多)
- mybatis配置文件中,可以配置是否启用延迟加载
- lazyLoadingEnabled=true|false
原理:
- 使用 CGLIB 创建目标对象的代理对象,
- 当调用目标方法时,进入拦截器方法,
- 比如调用 a.getB().getName(),拦截器 invoke()方法发现 a.getB()是 null 值,那么就会单独发送事先保存好的查询关联 B 对象的 sql,把 B 查询上来,然后调用 a.setB(b),于是 a 的对象 b 属性就有值了,接着完成 a.getB().getName()方法的调用。
- 不光是mybatis,Hibernate延迟加载原理也一样
mybatis是怎么和数据库交互的
-
通过dao层进入到mapper,它们之间是用id去关联的。resulttype是它所在的pojo路径。常用的还有resultMap。如果是使用的mybatisPlus,我们可以直接调save等方法,不用手写sql,会用plus封装好的方法直接查询数据。
-
当使用resultType做SQL语句返回结果类型处理时,对于SQL语句查询出的字段在相应的pojo中必须有和它相同的字段对应,而resultType中的内容就是pojo在本项目中的位置。
-
resultMap(适合多表–在mapper中进行返回字段处理)
-
当使用resultMap做SQL语句返回结果类型处理时,通常需要在mapper.xml中定义resultMap进行pojo和相应表字段的对应。
-
常用的sql标签还有test,if,choose,when等
Mapper接口是没有实现类的,当调用接口方法时,接口全限名+方法名拼接字符串作为 key 值,可唯一定位一个MappedStatement,
//举例:
com.mybatis.mappers.StuDao.findStuById
//可以唯一找到 namespace 为com.mybatis.mappers.StuDao下面id = findStuById的MappedStatement。
//在 MyBatis 中,每一个<select>、<insert>、<update>、<delete>标签,
//都会被解析为一个MappedStatement对象。而它们的关联是通过id来唯一确定的
重载
Dao 接口里的方法可以重载,但是Mybatis的XML里面的ID不允许重复。
public interface StuMapper {
List<Student> getStu();
List<Student> getStu(@Param