MyBatis to use dynamic SQL
Dynamic sql: SQL stitching solve a lot of work
1.sql
可以利用<sql>将一些公共sql语句抽取为公共部分,要用的时候用<include>标签包含
<sql id="base_user">
id,name,password
</sql>
<select id="getUserById" resultMap="userMap">
select <include refid="base_user"/> from t_user where id = #{id}
</select>
2.if
判断,字符串要判断两种情况,null和''
需求:我们在做用户查询时,有可能带用户名,有可能不带
<select id="findUser" resultMap="userMap">
select
<include refid="base_user"/>
from
t_user
where 1=1
<if test="username != null and username != ''">
and name = like concat("%",#{username},"%")
</if>
</select>
Query time by giving or value does not give the username to observations
3.where
会自动加where关键字
会自动删除掉多余的and
<select id="findUser2" resultMap="userMap">
select
<include refid="base_user"/>
from
t_user
<where>
<if test="id != null">
and id = #{id}
</if>
<if test="username != null and username != ''">
and name like concat("%",#{username},"%")
</if>
<if test="password != null and password != ''">
and password = #{password}
</if>
</where>
</select>
4.set suppose a table has more than one field, but we only need to update the fields that need updating, reducing network bandwidth
会自动加set关键字
会自动删除掉多余的逗号
<update id="updateUser">
update
t_user
<set>
<if test="username != null and username != ''">
name=#{username},
</if>
<if test="password != null and password != ''">
password=#{password},
</if>
</set>
where id=#{id}
</update>
5.trim
可以替代where和set,利用prefix、prefixOverrides、suffix、suffixOverrides
<!--
prefix:在trim标签内sql语句加上前缀。
suffix:在trim标签内sql语句加上后缀
prefixOverrides:指定去除多余的前缀内容
suffixOverrides:指定去除多余的后缀内容
-->
<select id="findUser3" resultMap="userMap">
select
<include refid="base_user"/>
from
t_user
<trim prefix="where" prefixOverrides="and">
<if test="id != null">
and id = #{id}
</if>
<if test="username != null and username != ''">
and name like concat("%",#{username},"%")
</if>
<if test="password != null and password != ''">
and password = #{password}
</if>
</trim>
</select>
<update id="updateUser2">
update
t_user
<trim prefix="set" suffixOverrides="," >
<if test="username != null and username != ''">
name=#{username},
</if>
<if test="password != null and password != ''">
password=#{password},
</if>
</trim>
where id=#{id}
</update>
6.choose
类似于switch case default
里面用<when>,最后用<otherwise>
<select id="findUser4" resultMap="userMap">
select
<include refid="base_user"/>
from
t_user
<where>
<choose>
<!-- 如果第一个when执行了,name后面的when不会执行,以此类推,前面的when执行了,那后面的when不会执行 -->
<when test="username != null and username != ''">
and name like concat("%",#{username},"%")
</when>
<when test="password != null and password != ''">
and password = #{password}
</when>
<otherwise>
and name is not null
</otherwise>
</choose>
</where>
</select>
7.foreach
循环遍历
collection:集合名称
a)数组:arry
b)集合(list):list
c)map:用key获取集合
d)设置别名了就用别名
open:循环开始执行
close:循环结束执行
item:当前循环的对象
separator:每循环一次添加的内容
<delete id="deleteUser">
DELETE FROM t_user WHERE id IN
<foreach collection="list" open="(" close=")" item="id" separator="," >
#{id}
</foreach>
</delete>