MyBatis 高级映射
局部懒加载: 在association 标签中添加fecthType = “lazy”
多对一: private Student student;
全局懒加载: lazyLoadingEnabled = true
延迟加载的全局开关。当开启时,所有关联对象都会延迟加载。
特定关联关系中可通过设置 fetchType
属性来覆盖该项的开关状态
一对多:
private List student ;
第一种方式:collection
第二种分步查询:可复用性增强,支持延迟加载
Mybatis 缓存
cache
作用:缓存通过减少sql 查询的操作,来提高程序的执行效率,mybatis 语句的查询结果放到缓存中,当下一次还是还是这一条sql 语句时,直接从缓存中取,不再查询数据库,效率得到大幅度的提升。
mybatis 缓存:
一级缓存: 将查新到的数据存储到sqlSession中 ,一级缓存默认开启,不需要做任何的配置,只要使用同一个sqlSession 对象执行同一条SQL 语句,就会走缓存。
什么时候不走缓存?
1,SqlSession 对象不是同一个,
2,查询条件不一样也不走缓存
什么时候一级缓存失效?
第一次查询语句和第二次查询语句之间,做一下任意的一件事都会让缓存清空
1,执行 了sqlSession 的clearChace 方法,这是手动清除缓存
2,执行了Insert, 或delete 或, update 任意一个语句
二级缓存:
将查询到的数据存储到sqlSessionFactory 中
1,<setting name = "cacheEnabled " value = " true " 全局性的开启或者关闭所有的映射配置文件中已经配置的任何缓存,默认就是true .
2,在需要使用二级缓存的SqlMapper.xml 文件中添加配置: <cache /》
3,使用二级缓存的实体类对象必须是可序列化的,也就是必须实现serializable 接口
4,sqlsession 对象关闭或者提交之后,一级缓存中的数据才会被写入二级缓存中去,此时二级缓存才可用。
=====> 默认情况下:二级缓存机制是开启的,只需要在对应的sqlMapper 文件中 使用<cache/》 标签,来表明我使用二级缓存。
动态sql
当if 传递的三个值均为空的情况下
where 标签:可以动态的裁剪and
trim 标签的属性:
prefix:在trim 标签中的语句前添加内容
suffix:在trim 标签中的语句后添加内容
prefixOverrides : 前缀覆盖去掉
suffixOverrides : 后缀覆盖掉
set标签:
主要是使用在update 语句当中,用来生成set 关键字,同时去掉最后多余的“ , ”
比如我们只提交不为空的字段,如果提交的数据是空,或者选择性的添加修改数据,那个这个字段将不会更新。
这三个标签在一起使用: 都不需要加 and 因为只会走一条语句
等同与:
if (){ } else if (){ } else { }
只有一个分支会被选择
foreach 标签:
循环数组或集合,动态生成SQL
批量删除:
第二种方式:
批量插入:
Mybatis 分页插件
pageHelper ( limit 当前页码 一 1)* 每页显示记录条数 , 每页显示记录条数
#{} 和$ {} 的区别:
#{} :先编译sql 语句,再给占位符传参数,底层是prepareStatement 实现,可以防止sql 注入,比较常用。
${} : 先进行sql 语句拼接,然后再编译SQL语句,底层是statement ,存在SQL 注入现象。只有在需要SQL语句关键字拼接的情况下才会用到。
什么时候使用$ {} ??
拼接表名
现实业务中,可能会出现分表存储数据的情况
Mybatis 参数处理
多参数:要使用@param 注解
大Map
列名跟Java 对象的属性名对应不上怎么办?
1:使用as 起别名
2:使用resultMap 进行结果映射
3:是否开启驼峰命名自动映射(配置settings) mapUnderscoreToCamelCase
0933)]
大Map
列名跟Java 对象的属性名对应不上怎么办?
1:使用as 起别名
2:使用resultMap 进行结果映射
3:是否开启驼峰命名自动映射(配置settings) mapUnderscoreToCamelCase