一.动态sql
什么是动态sql?
动态sql就是根据用户输入的不同,产生不同的sql语句
使用场景:
比如下图:我们有一个用户管理系统,我们可以根据姓名、籍贯、邮箱信息查询用户,我们输入的信息不同查询出来的结果就不同,我们可以只通过姓名查询,也可以通过籍贯,也可以三个条件都输入进行查询。
mybatis为了实现动态sql,为我们提供了动态标签:
主要有:
- if
- where
- foreach
- sql
动态sql的实现:
条件查询:
<select id="selectByUserCondition" parameterType="user" resultType="user">
select * from tb_userinfo
<where><!--这里的where标签会自动去除第一个and-->
<if test="user!=null">
<if test="user.name!=null and user.name!=''"> <!--只有满足test中的条件 if标签中的内容才会拼接上去-->
and name like #{user.name}
</if>
<if test="user.address!=null and user.address!=''">
and address = #{user.address}
</if>
<if test="user.email!=null and user.email!=''">
and email = #{user.email}
</if>
</if>
</where>
</select>
效果:
foreach的使用:
我们这个用户管理中的批量删除使用到了foreach标签
批量删除:
<delete id="delseleceAll">
delete from tb_userinfo where
<foreach collection="array" item="id" open="id in(" separator="," close=")">
<!--注意如果parameterType是List的话,则在标签体内引用这个List,只能用变量名list,如果parameterType是数组,则只能用变量名array-->
#{id}
</foreach>
</delete>
效果:
删除前:
选中:
删除:
sql标签可以将重复的SQL片段提取出来,然后在需要的地方,使用<include>
标签进行引用
<select id="findUser" parameterType="user" resultType="user">
SELECT * FROM user
<include refid="whereClause"/>
</select>
<sql id="whereClause">
<where>
<if test="user != null">
AND username like '%${user.name}%'
</if>
</where>
</sql>
二.mybatis缓存
一级缓存:
默认开启,只用同一个SqlSesion能够访问,在同一个SqlSesion生命周期内,如果执行两次相同的sql语句,则第二次sql会直接从缓存中拿取数据,不会走数据库,减小了数据库的压力,但是,如果第一次sql之后,执行了增、删、改,一级缓存就会被清空,第二次sql仍然会走数据库。
二级缓存:
默认关闭,可通过全局配置文件中的<settings name="cacheEnabled" value="true"/>开启二级缓存总开关,然后在某个具体的mapper.xml中增加<cache />,即开启了该mapper.xml的二级缓存。二级缓存是mapper级别的缓存,只有有提交SqlSesion后二级缓存才会有数据。