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>