parameterType
1.单个参数基本数据类型(包装类)参数,名称任意,可以省略写parameterType
2.多个基本数据类型可以省略写parameterType
- @param注解
- param1,param2/0,1
3.pojo类型
parameterType=包名.pojo,#{属性名} 取值
4.list
parameterType=list,foreach取值
<foreach collection="list" open="(" separator="," close=")" item="value">
#{value}
</foreach>
5.map
parameterType=map,map中则是#{key}
6.数组
使用foreach取值
<foreach collection="array" open="(" separator="," close=")" item="value">
#{value}
</foreach>
TO:如果多个参数不是业务模型中的数据,但是经常要使用,推荐编写TO(Transfer Object)数据传输对象
resultType与resultMap
resultType与resultMap的区别:
实体类与表名不影响映射(实体类名可以随意起)
一、resultType只可以映射实体类属性的简单类型成员变量(八种,对应数据库的列),而resultType还可以映射复杂类型的成员变量(pojo,对应数据库的整张表)
二、resultType的映射关系是自动完成的,实体类属性与表字段映射的差别只能是大小写(下划线,后一个大写),否则不能映射。resultMap的映射是手动指定的,故不存在不能映射的情况。
resultType当有复杂成员变量的时候,它仍然当作普通类型来映射。由于表中根本不存在复杂类型的成员变量名称的字段所以无法完成映射,造成复杂类型结果为null。
所以除了一对一和一对多关联查询,其余可以通过起别名,达到resultType与resultMap均可以使用。
特别的resultType类型HashMap,它把sql查询出来的字段用key-val保存起来,并没有映射到实体类。
@Mapkey当查询结果有多条记录Map<String, Map<String, Object>>使用@Mapkey指定key
foreach
item:集合中元素迭代时的别名,该参数为必选。相当于for(Object i:collections)中的i
index:在list和数组中,index是元素的序号,在map中,index是元素的key,该参数可选
缓存
一级缓存SqlSession级别,二级缓存namespace级别。
一级缓存无法显式关闭。二级缓存默认关闭
- 一级缓存
一级缓存失效的四种情况:
不同的SqlSession对应不同的一级缓存
同一个SqlSession但是查询条件不同
同一个SqlSession两次查询期间执行了任何一次增删改操作
同一个SqlSession两次查询期间手动清空了缓存
一级缓存脏数据
sqlSession1第一次读取数据==>sqlSession2修改数据==>sqlSession1再次读取数据
sqlSession1得到的是脏数据 - 二级缓存
MyBatis提供二级缓存的接口以及实现,缓存实现要求 POJO实现Serializable接口
二级缓存开关mybatis配置文件xml开关
<settings>
<setting name="cacheEnabled" value="false"/>
</settings>
二级缓存开关mapper.xml开关
<cache></cache>
- sql语句的缓存设置
select标签的useCache属性:
- 配置这个select是否使用二级缓存。一级缓存一直是使用的
每个增删改标签的flushCache属性:
– 增删改默认flushCache=true。sql执行以后,会同时清空一级和二级缓存(相当于部分隐式的关闭一级缓存)。查询默认flushCache=false。