映射简单关系,sql字段在相应的pojo中必须有属性与之对应。
使用注意事项:
1)sql列名和javaBean的属性一致。
2)如列名为下划线,javaBean为驼峰命名,则需要将mapUnderscoreToCamelCase的值设置为true。
3)resultType的值如用简写,需要配置别名。
对复杂语句进行联合映射。
使用场景:
1)字段有自定义的转换规则。
2)复杂的多表查询。
不推荐用resultType 当返回参数,即使所有类属性名与数据库字段一一对应,也需要定义;反过来,每一个表也必然有一个 POJO 类与之对应。
配置映射关系,使字段与 DO 类解耦,方便维护。
sql参数包括预编译(#{})和直接传值(${})。
将传入的值当成一个字符串,自动加上单引号,很大程度上能够防止sql注入。
传入的数据直接显示生成在sql中,无法防止 sql 注入。适用场景:动态报表,表名、选取的列是动态的,order by 和 in 等操作。
if
set
foreach
where、choose、when、otherwise
关联查询需要注意的细节:
属性:
association属性:
1)select 另一个映射查询的 id, MyBatis会额外执行这个查询获取嵌套对象的结果。
2)column 列名(或别名),将主查询中列的结果作为嵌套查询的参数。
3)fetchType 数据加载方式,可选值为lazy和eager,分别为延迟加载和积极加载,这个配置会覆盖全局的lazyLoadingEnabled 配置。
嵌套查询会导致N+1问题,解决办法是开启懒加载。
一级缓存默认开启(若要关闭需要在select标签配置flushCache=true),存在于sqlSession的生命周期中。任何的insert、update、delete操作都会清空一级缓存。
二级缓存也叫应用缓存,存在于sqlSessionFactory的生命周期中,以namespace为单位,不同namespace下操作互不影响。
使用二级缓存容易出现脏读,避免使用。
开启二级缓存步骤:
1)在全局配置文件mybatis-config.xml中添加cache标签。
文件中所有select语句都会被缓存。
文件中所有insert、update、delete语句都会刷新缓存。
eviction取值:LRU(最近最少使用)、FIFO(先进先出)、SOFT(软引用)、WEAK(弱引用,采用LRU移除策略)。
flushInterval:刷新间隔时间。
size:缓存大小,代表缓存可以存储多少个对象。
1)每次与数据库的连接都会优先从缓存中获取数据。
2)先查二级缓存,再查一级缓存。
3)二级缓存以 namespace 为单位的,是 SqlSession 共享的,容易出现脏读,建议避免使用。
4)一级缓存是 SqlSession 独享的,建议开启。