含义

动态的SQL语句,就是指在运行的时候,根据Mapper.xml中的语句,来决定方法传入参数的使用。

使用

<if test=""></if>标签

Mapper.xml中的配置 if 判断 参数传入的值,判断是否可以使用,再执行SQL语句,

缺点

如何传入的值分别是null,1时or 符号不会消失,这样sql语句识别不出来。

<select id="queryUserByUser" resultType="com.atguigu.pojo.User" parameterType="com.atguigu.pojo.User">
        select
              `id` ,`last_name` lastName ,`sex`
        from
              t_user
        where
        <if test="lastName!=null">
             last_name=#{lastName}
        </if>
        <if test="sex==0||sex==1">
        or sex=#{sex}
        </if>
    </select>

<where ></where>标签

Mapper.xml中的配置where能有效帮助我们,添加和去除查询条件前面的关键字。

缺点

不能去除查询条件后面的多余的关键。

<select id="queryUserByUser" resultType="com.atguigu.pojo.User" parameterType="com.atguigu.pojo.User">
        select
              `id` ,`last_name` lastName ,`sex`
        from
              t_user
        <where>
            <!-- 
              where 它可以判断查询条件前面多余的and 或 or ,它会帮我们去掉
              如果where里有内容,还会帮我们添加where关键字,如果没有内存关键where也不会存在
            -->
        <if test="lastName!=null">
             last_name=#{lastName}
        </if>
        <if test="sex==0||sex==1">
        or sex=#{sex}
        </if>
        </where>
    </select>

<trim></trim>标签
Mapper.xml文件中的trim标签,可以通过设置——perfix、suffix、perfixOverrides、suffixOverrides四个属性来,帮助我们很好在条件上,进行关键字的添加和去除。

<select id="queryUserByUser" resultType="com.atguigu.pojo.User" parameterType="com.atguigu.pojo.User">

        select
              `id` ,`last_name` lastName ,`sex`
        from
              t_user
        <!--
           trim标签可以动态的再语句的前后添加内容
           prefix :前面添加内容
           suffix :后面添加内容
           suffixOverrides :去掉后面的内容
           prefixOverrides :去掉前面的内容
        -->
      <trim prefix="where" suffixOverrides="or" prefixOverrides="or">
        <if test="lastName!=null">
             last_name=#{lastName}
        </if>
        <if test="sex==0||sex==1">
        or sex=#{sex}
        </if>
      </trim>
    </select>

<choose></choose>、<when></when>、<otherwise></otherwise>标签
Mapper.xml中的choose、when、otherwise标签可以很好的帮助我们,做到多路判断,满足一个条件后就不会向下执行,
都不满足的情况下,会执行otherwise里面的条件。

<select id="queryUserByUser" resultType="com.atguigu.pojo.User" parameterType="com.atguigu.pojo.User">

        select
              `id` ,`last_name` lastName ,`sex`
        from
              t_user
        <!--
           trim标签可以动态的再语句的前后添加内容
           prefix :前面添加内容
           suffix :后面添加内容
           suffixOverrides :去掉后面的内容
           prefixOverrides :去掉前面的内容
        -->
        <!--
              where 它可以判断查询条件前面多余的and 或 or ,它会帮我们去掉
              如果where里有内容,还会帮我们添加where关键字,如果没有内存关键where也不会存在
            -->
   <where>
       <choose>
           <!-- choose、when、otherwise这三个标签是组合使用的
                如果判断的时候,遇到第一个条件满足的话,就不会往下判断
                如果都不满足就会有,otherwise就会执行里面的条件
           -->
           <when test="lastName!=null">
             last_name=#{lastName}
           </when>
           <when test="sex==0||sex==1">
              sex=#{sex}
           </when>
           <otherwise>
               id=#{id}
           </otherwise>
       </choose>
   </where>
    </select>

<set></set>标签
Mapper.xml中的set标签可以,在判断后去除更新列后多余的逗号,自动添加set标签,当然也可以用trim标签来解决。

<update id="updateUser" parameterType="com.atguigu.pojo.User">
        update
              t_user
        <set>
           <!--set标签可以去除,判断后跟新列后面多余的逗号
               同时还会自动添加set
           --> 
            <if test="lastName!=null">
               `last_name`=#{lastName},
            </if>
            <if test="sex==0||sex==1">
               `sex`=#{sex}
            </if>
        </set>
         where
              id=#{id}
        
    </update>

<foreach></foreach>标签
Mapper.xml文件中可以通过foreach标签实现,对数据库的批量插入。

<insert id="insertUsers" >
        insert into
        t_user(`last_name`,`sex`)
        values
           <!-- foreach标签是做循环遍历
                collection 属性表示的是集合的类型,包括遍历的元素
                item  表示当前遍历到的数据
                separator 表示分隔符
                -->
        <foreach collection="list" item="user" separator=",">
            (#{user.lastName},#{user.sex})
        </foreach>
    </insert>

sql片段
Mapper.xml文件中可以通过sql标签,来抽取sql语句,在通过include标签进行加载。

<sql id="唯一的识别属性">
相应的SQL语句
</sql>
<include refid="唯一的id标识"></include>