MyBatis知识简介

来源:互联网 发布:mac六国循环重启 恢复 编辑:程序博客网 时间:2024/06/06 04:03
一、模糊查询时动态参数的两种写法
1、select * from table where name like CONCAT('%',#{name},'%')
2、select * from table where name like '%' #{占位符} '%'

二、写sql语句时,#和$的区别:
#使用的是PreparedStatment,可以防止sql注入
$使用的是Statement,不能防止sql注入,$会将参数直接拼接到sql语句中
三、Mybatis中用到的OGNL表达式
常用到的表达式有<if></if>、<choose></choose>、<foreach></foreach>、<choose>等
例如:
1、 <select>
select * from table
<where>1=1
<if>
and name=#{name}
</if>
</where>
</select>
2、<choose>标签中只可以包含<when><othercase>,实现java中的switch...case的效果,例:
<select>
select * from table
<where> 1=1
<choose>
<when test="name !=null and name != '' " >
and name=#{name}
<when>
<when test="age>0 " >
and age &gt; #{age}
<when>
<otherwise>
1!=1
</otherwise>
</choose>
</where>
</select>
3、在OGNL中List使用list表示,长度使用list.size表示。例如:
<select>
select * from table
<if test="list!= null and list.size>0">
where id in
<foreach collection="list" item="myId" open="(" close=")" separator=",">
#{myId}
</foreach>
</if>
</select>

四、表连接查询
1、一对多关联查询
方式一:多表连接查询

方式二:多表单独查询

2、多对一关联查询
方式一:多表关联查询

方式二:多表单独查询方式:

五、Mybatis中的延迟加载(懒加载)
Mybatis中的懒加载只对关联查询有用,并且只会对子表进行懒加载,而不会对主表进行懒加载,懒加载可以减少对数据库的压力。
Mybatis中关联对象的加载时机:
(1)直接加载:执行完主加载对象,就立即执行关联对象的查询
(2)侵入式延迟加载:执行完主加载对象,不会立即查询子对象,只有访问主加载对象的详情时,才会查询关联对象
(3)深度延迟加载:执行完主加载对象,不会立即查询子对象,即使访问主加载对象的详情时,也不会对关联对象进行查询,只有当真正访问子对象时,才会对子对象进行查询
注:只有主加载对象与关联对象的select语句分开时,才能使用懒加载,如果是写在一起的(例如:多表关联查询),则懒加载不起作用
(4)懒加载的总开关:在Mybatis的配置文件中,在<settings>中可以设置,将lazyLoadingEnabled设置为true,即可开启懒加载;当lazyLoadingEnabled=true时,并且aggressiveLazyLoading=true,既开启了侵入式延迟加载,aggressiveLazyLoading=false,既开启了深度延迟加载

六、Mybatis中的查询缓存(分为一级查询缓存和二级查询缓存,查询缓存是按namespace划分的,不同的namespace之间数据互不干扰)
1、一级查询缓存:它是一个Map,该Map中的key是一个hash值加select查询的id值,再加查询结果,在同一个sqlSession下,进行相同的查询,第二次查询走缓存,当sqlSession结束,一级缓存也就不存在了,mybatis的一级缓存默认存在,且不能关闭;另外,增删改会使sqlSession清空缓存
2、二级查询缓存:
(1) 二级缓存默认是开启的,但可以在mapper文件中使用<cache/>手动开启,因为增删改也会刷新二级缓存,所以我们可以设置不使用二级缓存;可以全局关闭,只需要在mybatis.xml文件中加上cacheEnabled=false就可以了,另外,也可以设置局部关闭,即让某个增删改方法不刷新二级缓存,可以在sql上加useCache=false,因为一级缓存和二级缓存都是按照sql的id在缓存中取结果,所以使用二级缓存的目的就是防止统一查询的反复执行,增删改刷新缓存,并不是把key和value都删了,而是根据sql的id将它对应的value置为null,当从缓存中拿到数据的时候,发现值为null,就会从数据库中查询;例如:
(2)、二级缓存的使用原则
a、因为查询缓存是按照namespace划分的,不同的namespace之间数据互不干扰,所以,如果用户在某个namespace下对表执行了增删改操作,改操作只会刷新当前的namespace,而不会改变其他namespace的缓存,就会出现多个namespace下同一张表的数据不一致,因此,多个namespace不要操作同一张表
b、不要在关联关系表上执行增删改
c、当查询多于修改时可以使用二级缓存(因为对二级缓存的频繁刷新会降低系统性能)
原创粉丝点击