几个关键点:
1.parameterType,一般默认可以省略,要注意的地方是如何给sql里面的属性赋值,${},#{arg0,arg1...,param1,param2,...}
2.resultType ,insert语句,update语句,delete语句默认会返回Long,Integer,boolean类型的数值 ,当查询出来的列名和封装的对象
属性不一致时,一个可以给sql列名取别名,另一个可以用resultMap,自定义映射规则。mybatis有默认的自动映射 (列名和属性名完全一致,自动映射) 或者开启严格驼峰映射(满足驼峰映射对应规则)
3.resultMap type="要映射的javabean全路径类名或别名" id="取的id"
|a) id : javabean里面的哪个属性,对应数据库表的主键
|b) result : javabean里面普通属性,对应数据库表普通列
|c) 当存在一对一映射时,可以使用result column="" property="dept.prop" 或者使用association
| 1) association :当javabean里面有引用对象属性时,association解决一对一关联,property,javabean里面的哪一个属 性,javatype,映射类的全路径类名
| 2) collection : 解决一对多映射 property 对应javabean里面的哪一个属性,oftype,collection属性的每个元素的全路径类名
| 3) 分步association : 在association里面写了property 后,写select属性,引用到具体的select上,然后写column属性,即用哪个column当作select语句的输入
|4)分步collection 同上
|5) 懒加载,延迟加载的全局配置和每一个上面的单独配置fetchtype
4. 动态sql
1.if
2.where 只能去掉紧随其后多余的and,or
3.trim 通过指定prefixOverrides,suffixOverrides 来显示去掉可能会出现的多余and,or, 或者 逗号等
4.choose,when,otherwise 只会执行一个
5.set 用于设置更改值时使用,可以去掉多余的逗号
6.foreach (List,map批量查询,List,map批量修改,批量插入)
7. bind 用于osgl表达式值引用
8.sql片段
5.缓存机制
两级缓存
一级缓存: 本地缓存:
与数据库同一次会话期间查询到的数据会放到本地缓存中,
以后如果需要获取相同的数据,直接从缓存中拿,没必要再去查询数据库
是sqlsession级别的缓存, 其实是根据查询条件,存储了一个map,如果缓存有效就直接根据查询条件到map里面查结果
缓存失效的4种情况:
1.用不同的sqlsession
2.同一个sqlsession不同的查询条件
3.调用session.clearCache()方法使得清空缓存
4.同一个session,同样的查询条件,如果两个中间有增删改操作,缓存无效(因为可能会更改到缓存中的数据)
二级缓存:全局缓存
1.二级缓存是namspace级别的缓存,即属于一个mapper的查询结果都存在该mapper的缓存中进行管理
2.二级缓存的机制: 一个session会话的查询结果会先存储在该session中,如果session关闭,会被转移到二级缓存中,即该查询条件和结果对应的mapper中。如果一个session生成了多个不同的mapper,同样的,也是会把结果按照对应的mapper进行缓存。
注意:查出的数据都会先放在一级缓存中,只有会话关闭后,才会转移到二级缓存中,所以如果没关闭会话,不同session还是自己取自己的。
readonly就是是否由mybatis发送序列化的结果还是直接返回缓存中的对象引用。序列化的每个对象都是不同的,引用来的对象相等==,但是由于可能被修改,不安全。
二级缓存的使用:
1.在全局settings文件中设置:
<setting name="cacheEnabled" value="true"/>
2.在具体的mapper中设置缓存策略
<cache eviction="" flushInterval="" readOnly="" blocking="" size="" type=""></cache>
1.eviction:缓存回收策略,
LRU: 最近最久未使用,默认方式
FIFO:先进先出策略
SOFT: 软引用,移除基于垃圾回收器状态和软引用规则的对象
WEAK:弱引用,更积极地基于垃圾回收器状态和弱引用规则的对象
2.flushInterval:缓存刷新间隔,缓存多长时间清空一次,默认不清空,单位毫秒
3.readOnly: 是否只读
true: 只读:mybatis 认为所有从缓存中获取的数据的操作都是只读操作,不会修改数据,mybatis为了加快获取速度,直接会将数据在缓存中的引用交给用户,不安全,速度快
false: 非只读,mybatis觉得获取的数据可能会被修改,会利用序列化和反序列化技术克隆一份新的数据,安全,速度慢。
4.size:缓存存放多少元素
5.type="",指定自定义缓存的全类名,需要自己实现cache接口
3)pojo需要实现序列化接口
==========================================================================================
1.与缓存相关的几个设置
1.如果在一个session中间执行了session.clearCache()那么两个相同的查询是不能使用到缓存的。但是当session.close()后,另外的session,在同一个mapper下能够得到二级缓存。
2.当全局的cacheEnabled = false时,会关闭二级缓存
3.每次增,删,改后,一级缓存,二级缓存都会被关闭。
4.每个select标签下的useCache=true,如果被设置为false,二级缓存关闭,一级缓存始终打开
5.localCacheScope 本地缓存作用域,一级缓存SESSION,如果设置为STATEMENT,为执行一条语句,相当于禁用一级缓存
在全局settings中配置。
==========================================================================================
当执行一条查询sql时,流程为:
1.查看二级缓存有没有记录,如果有直接用
2.查看一级缓存有没有记录,如果有直接用
3.查JDBC
当使用第三方缓存时,主要是由第三方缓存实现mybatis的cache接口,用于实现二级缓存。