Mybatis的动态SQL讲解

用mybatis对一张表进行CRUD操作时,进行无条件的查询所用的sql都是很简单的,但是假使有很多条件呢,这些条件都要逐一地写一条sql吗?No,这时就要提到mybatis的动态查询了。

MyBatis中用于实现动态SQL的元素主要有:

  • if
  • where
  • set
  • choose(when,otherwise)
  • trim
  • foreach

下面以学生表进行操作:

1、动态查询

<!-- mapper的xml中对表字段的一个映射 -->
    <resultMap type="com.java.pojo.Student" id="studentMap">
        <id property="id" column="id"/>
        <result property="sname" column="sname"/>
        <result property="sage" column="sage"/>
        
    </resultMap>
<!-- 查询语句 -->
    <select id="select" parameterType="com.java.pojo.Student" resultMap="studentMap" >
        select * from student 
        <where>
            <if test="sname !=null">
                and sname=#{sname}
            </if>
            <if test="sage !=null">
                and sage=#{sage}
            </if>
        </where>
    </select>

有时候,我们不想用到所有的查询条件,只想选择其中的一个,查询条件有一个满足即可,使用 choose 标签可以解决此类问题,类似于 Java 的 switch 语句

<select id="selectUserByChoose" resultMap="studentMap" parameterType="com.java.pojo.Student">
      select * from student
      <where>
          <choose>
              <when test="id !='' and id != null">
                  id=#{id}
              </when>
              <when test="sname !='' and sname != null">
                  and sname=#{sname}
              </when>
              <otherwise>
                  and sage=#{sage}
              </otherwise>
          </choose>
      </where>
  </select>

2、动态插入

<sql id="key">
        <trim suffixOverrides=",">
            <if test="sname !=null">
                sname,
            </if>
            <if test="sage !=null">
                sage,
            </if>    
        </trim>        
    </sql>
    
    <sql id="values">
        <trim suffixOverrides=",">
            <if test="sname !=null">
                #{sname},
            </if>
            <if test="sage !=null">
                #{sage},
            </if>    
        </trim>
    </sql>
    
    <insert id="add" parameterType="com.java.pojo.Student">
        insert into student(<include refid="key"></include>) values(<include refid="values"></include>)
    </insert>

 prefix:前缀      

 prefixoverride:去掉第一个and或者是or

 suffix:后缀  

 suffixoverride:去掉最后一个逗号(也可以是其他的标记)

 3 、动态更新

<update id="update" parameterType="com.java.pojo.Student">
        update student
        <set>
            <trim suffixOverrides=",">
                <if test="sname !=null">
                    sname=#{sname},
                </if>
                <if test="sage !=null">
                    sage=#{sage},
                </if>    
            </trim>
        </set>
        <where>
            and id=#{id}
        </where>
    </update>

 

4、动态删除

4.1、按id删除

<delete id="delete" parameterType="student">
            <if test="id !=null">
                delete from student 
                <where>
                    <if test="id !=null">
                        and id=#{id}
                    </if>
                </where>    
            </if>
</delete>

4.2、批量删除

foreach 属性详解
collection 表示参数类型 比如是数组或者集合
open 表示以神符号开始
close 表示以什么符号结束
separator 表示分隔符
item 表示要遍历的名称

<!-- 动态删除之集合版本 -->
<delete id="dynaDeleteList">
   delete from student where id in
   <foreach collection="array" open="(" close=")" separator="," item="ids" >
        #{ids}
   </foreach>
</delete>
<!-- 动态删除之集合版本 -->
<delete id="dynaDeleteList">
   delete from student where id in
   <foreach collection="list" open="(" close=")" separator="," item="ids" >
          #{ids}
   </foreach>
 </delete>
原文地址:https://www.cnblogs.com/hhhwj/p/11384932.html