目录
一、高级查询+分页:
核心代码示意图
Notes:
1.动态SQL语句中<WHERE>可以使用<trim>标签表示,要配置好前缀和后缀
2.采用include可以外部引入资源标签
3.limit #{start}通过类接口中的getStart()赋值
分页 start: (page-1)*row
还需要额外定义一个服务类和服务接口:
二、#和$的区别
#通过占位符的方式.
$直接拼接到SQL中.
三、使用注解的方式
1.配置映射
Notes:
1.使用注解的方式写起来的确很方便,但是并不利于理解
2.采用@Options()标签可以设置自增长的字段
3.别名问题采用@Results()
2.使用@Param的注解:
mybatis中的方法都是只支持传入一个参数的. 如果想传入多个参数.
1.在方法参数定义Map集合,把需要传入的参数放入map中.
2.使用@Param注解来解决.
四、many2One
1.目录:
2.EmployeeMapper.xml 、test类
1.新建resultdMap来映射关联关系.
many方:
Notes:
1.在配置文件的时候,mapper namespace要正确:
否则在初始化时会报错
Caused by: java.lang.IllegalArgumentException: Mapped Statements collection already contains value for com.mybatis02.EmployeeMapper.save
2.新增加的XML文件记得注入进去<mappers>中
3.对于关联关系在mang那方配置额外一次查询
4.保存操作保存少的 在保存多的
5.注意resultType和resultMap
五、延时加载
回顾hibernate中的延时加载.
many方是正常的对象,one是代理代理.当调用one的非ID和非Class属性的时候采取调用session去查询出结果出来.
myBatis中的延时加载.
1.在myBatis中默认的延时加载时禁用的.
在主配置文件中开启延时加载 lazyLoadingEnabled:默认为false,禁用延时加载.
<setting name="lazyLoadingEnabled" value="true"/>
2.many变成代理对象.
class com.day02.many2one.Employee$$EnhancerByCGLIB$$42c5091f
当调用many方的任意属性,都会触发one方的加载. aggressiveLazyLoading:当启用时, 有延迟加载属性的对象在被调用时将会完全加载任意属性。否则, 每种属性将会按需要加载。
//配置如下属性,按需加载
<setting name="aggressiveLazyLoading" value="false"/>
3.在many方默认的调用equals,clone,hashCode,toString 方法都会出发one方的加载.
//配置只有调用many方的clone方法才会触发one方加载,.
<setting name="lazyLoadTriggerMethods" value="clone"/>
六、N+1问题
1.在查询所有many记录,每个many对应的one都是不同,查询N个many对象,总共会发出N+1条SQL.(性能特别不友好) 使用leftJoin的方式来解决.
七、一级缓存
生命周期:
和session一样的生命周期.
通过session.get(1L),session.get(1L),总共两次get方法只会发一条SQL.第二次使用的是一级缓存的内容
//清除一级缓存中内容
session.clearCache();
针对数据量大的时候,使用分页+clearCache()及时清除缓存