Mybatis

Mybatis基础

resultType和resultMap

resultType

映射简单关系,sql字段在相应的pojo中必须有属性与之对应。
使用注意事项:
1)sql列名和javaBean的属性一致。
2)如列名为下划线,javaBean为驼峰命名,则需要将mapUnderscoreToCamelCase的值设置为true。
3)resultType的值如用简写,需要配置别名。

resultMap

对复杂语句进行联合映射。
使用场景:
1)字段有自定义的转换规则。
2)复杂的多表查询。

不推荐用resultType 当返回参数,即使所有类属性名与数据库字段一一对应,也需要定义;反过来,每一个表也必然有一个 POJO 类与之对应。
配置映射关系,使字段与 DO 类解耦,方便维护。

传递多个参数

传递多个参数的方式有三种:
Mybatis_第1张图片

获取主键

通过insert/update标签相关属性获取

Mybatis_第2张图片

Mybatis_第3张图片

通过selectKey标签

Mybatis_第4张图片

sql参数

sql参数包括预编译(#{})和直接传值(${})。

预编译

将传入的值当成一个字符串,自动加上单引号,很大程度上能够防止sql注入。

直接传值

传入的数据直接显示生成在sql中,无法防止 sql 注入。适用场景:动态报表,表名、选取的列是动态的,order by 和 in 等操作。

动态sql

动态sql元素

Mybatis_第5张图片

动态sql元素的使用

if
Mybatis_第6张图片
set
Mybatis_第7张图片
foreach
Mybatis_第8张图片
where、choose、when、otherwise
Mybatis_第9张图片

Mybatis批量操作

动态拼接批量操作语句
Mybatis_第10张图片
使用BATCH类型的excutor
Mybatis_第11张图片

关联查询

关联查询需要注意的细节:

  1. 超过3个表禁止join。
  2. 需要join的字段类型必须一致。
  3. 多表关联时保证关联的字段有索引。
  4. 字段允许适当冗余,以提高查询性能,但必须考虑数据一致。

一对一

嵌套结果

属性:

  1. property 对应实体类中的属性名,必填项。
  2. javaType 属性对应的 Java 类型 。
  3. resultMap 可以直接使用现有的 resultMap ,而不需要在这里配置映射关系。
  4. columnPrefix
    查询列的前缀,配置前缀后,在子标签配置result的column时可以省略前缀。

在这里插入图片描述Mybatis_第12张图片

嵌套查询

association属性:
1)select 另一个映射查询的 id, MyBatis会额外执行这个查询获取嵌套对象的结果。
2)column 列名(或别名),将主查询中列的结果作为嵌套查询的参数。
3)fetchType 数据加载方式,可选值为lazy和eager,分别为延迟加载和积极加载,这个配置会覆盖全局的lazyLoadingEnabled 配置。
Mybatis_第13张图片
Mybatis_第14张图片
Mybatis_第15张图片

嵌套查询会导致N+1问题,解决办法是开启懒加载。

一对多

嵌套结果
Mybatis_第16张图片
Mybatis_第17张图片

嵌套查询
Mybatis_第18张图片
Mybatis_第19张图片

多对多

嵌套结果
Mybatis_第20张图片
Mybatis_第21张图片
嵌套查询
同一对多

缓存

一级缓存

一级缓存默认开启(若要关闭需要在select标签配置flushCache=true),存在于sqlSession的生命周期中。任何的insert、update、delete操作都会清空一级缓存。

二级缓存

二级缓存也叫应用缓存,存在于sqlSessionFactory的生命周期中,以namespace为单位,不同namespace下操作互不影响。
使用二级缓存容易出现脏读,避免使用。

开启二级缓存步骤:
1)在全局配置文件mybatis-config.xml中添加cache标签。
在这里插入图片描述

2)在XXMapper.xml中添加cache标签。
在这里插入图片描述

文件中所有select语句都会被缓存。
文件中所有insert、update、delete语句都会刷新缓存。

eviction取值:LRU(最近最少使用)、FIFO(先进先出)、SOFT(软引用)、WEAK(弱引用,采用LRU移除策略)。
flushInterval:刷新间隔时间。
size:缓存大小,代表缓存可以存储多少个对象。

缓存调用过程

Mybatis_第22张图片

1)每次与数据库的连接都会优先从缓存中获取数据。
2)先查二级缓存,再查一级缓存。
3)二级缓存以 namespace 为单位的,是 SqlSession 共享的,容易出现脏读,建议避免使用。
4)一级缓存是 SqlSession 独享的,建议开启。

你可能感兴趣的:(java进阶知识总结,mybatis,数据库)