MyBatis4:动态SQL

询问的就是studentId>0且studentName=”杰克”的装有学生音信,如果换一种调用形式:

<select id="selectInCondition" parameterType="student" resultType="student">
    select * from student
    <trim prefix="WHERE" prefixOverrides="AND |OR ">
        <if test="studentName != null and studentName != 'Jack' ">
            and studentName = #{studentName}
        </if>
        <if test="studentAge != 0">
            and studentAge = #{studentAge};
        </if>
    </trim>
</select>

 

特别要注意,prefixOverrides中的空白也是很重大的

其它,test里面可以断定字符串、整型、浮点型,大胆地写判断标准吧。如若属性是复合类型,则足以动用A.B的艺术去赢得复合类型中的属性来举行相比较。

 

 

有时我们不想采用具有的采取条件,相反大家想采取过多场面下的一种。和Java中的switch…case…类似,MyBasit提供choose元素。

OK,介绍就到这时,下边来进入动态SQL的读书吧。

首先个例子已经示例了if的用法,可是这种用法有个缺陷—-动态SQL外必须有where子句。

三个where子句也是一致的,比如:

trim、where、set

五个when只可以知足一个,都不知足则走other。仍然小心一下这边的”<![CDATA[
… ]]>”,不可以包围所有讲话。

<select id="selectInCondition" parameterType="student" resultType="student">
    <![CDATA[
        select * from student where studentId > #{studentId}
    ]]>
    <if test="studentName != null and studentName != 'Jack' ">
        and studentName = #{studentName}
    </if>
    <if test="studentAge != 0">
        and studentAge = #{studentAge};
    </if>
</select>

 

在动态SQL中所做的最通用的工作就是富含部分where子句的规范,比如:

<trim prefix="WHERE" prefixOverrides="AND |OR ">
…
</trim>

if

倘使where元素没有做出你想要的,那么可以选用trim元平素自定义。比如,和where元素相等的trim元素是:

这边,set元素会动态前置set关键字,而且也会去掉任意无关的逗号。固然您对和这里对等的trim元素好奇,它看起来是这般的:

 

<trim prefix="SET" prefixOverrides=",">
…
</trim>

 

where元素知道借使由被含有的标志重临任意内容,就唯有插入where。而且,倘诺以”and”或”or”最先的情节,那么就会跳过where不插入。

 

即:

因为”1 =
1″永远满意,所以一定于给where加了一层true而已,此时动态SQL生成咋样where判断标准就是哪些。

choose、when、otherwise

 

一旦具有规则都不兼容,那么生成的SQL语句将是:

 

平时采取动态SQL不容许是独自的一有些,MyBatis当然使用一种强大的动态SQL语言来立异那种气象,那种语言可以被用在任意映射的SQL语句中。

<update id=”updateStudentAgeById” parameterType=”Student”>
    <!–update student set studentAge = #{studentAge} where
        studentId = #{studentId}; –>
    <![CDATA[
        update student
    ]]>
    <set>
        <if test=”studentAge != 0″>studentAge =
#{studentAge}</if>
    </set>
    where studentId = #{studentId}
</update>

select * from student where and studentName = #{studentName};

终极一个小内容,和动态更新语句相似的缓解方案是set。set元素可以被用来动态包含更新的列,而不含有不需要更新的。比如:

具体贯彻不写了,那么只要自身如此调用:

可以相比较一下,注释掉的是原update语句,没有注释的是加盟动态SQL之后的说话。

<select id=”selectInCondition” parameterType=”student”
resultType=”student”>
    <![CDATA[
        select * from student where 1 = 1
    ]]>
    <if test=”studentName != null and studentName != ‘Jack’ “>
        and studentName = #{studentName}
    </if>
    <if test=”studentAge != 0″>
        and studentAge = #{studentAge};
    </if>
</select>

<select id=”selectPostIn” resultType=”domain.blog.Post”>
    <![CDATA[
        SELECT * FROM POST P WHERE ID in
    ]]>
    <foreach item=”item” index=”index” collection=”list”
        open=”(” separator=”,” close=”)”>
        #{item}
    </foreach>
</select>

这种时候我们附加一个后缀,同时也增大一个前缀。

 

本条查询也会破产。

select * from student where

其余一个解决办法是运用MyBatis中的一个简便处理格局,这在90%气象下都会有用并且。而在不能使用的地点,能够以自定义形式处理。加上一个简练的改动,所有的业务都会顺利举办:

 

foreach是异常强劲的,它同意你指定一个汇聚,注解集合项和目录变量,它们可以用在要素体内。他也同意你指定开放和倒闭字符串,在迭代以内放置分隔符。那些元素是很智能的,它不会偶尔地附加多余的分隔符。

其余一个动态SQL通用的必需操作时迭代一个聚集,平常是构建在in条件中的。比如(下边的例子都是自己在温馨电脑上跑通过的例证,那多少个事例就间接复制MyBatis官方文档上的情节了):

动态SQL元素和采取JSTL或其他相似的按照XML的文书处理器相似,在MyBatis在此之前的本子中,有很多元素需要掌握,MyBatis3大全球提高了它们,现在用不到原来一半的元素就能做事了,MyBatis接纳功效强大的按照OGNL的表明式来祛除其他因素。

解决办法也有,一个获益的艺术是用where 1 = 1的不二法门,即:

<select id=”selectInCondition” parameterType=”student”
resultType=”student”>
    <![CDATA[
        select * from student
    ]]>
    <where>
        <if test=”studentName != null and studentName != ‘Jack’
“>
            and studentName = #{studentName}
        </if>
        <if test=”studentAge != 0″>
            and studentAge = #{studentAge};
        </if>
    </where>
</select>

<select id=”selectInCondition” parameterType=”student”
resultType=”student”>
    <![CDATA[
        select * from student where studentId > #{studentId}
    ]]>
    <choose>
        <when test=”studentName != null”>
            and studentName = #{studentName};
        </when>
        <when test=”studentAge != 0″>
            and studentAge = #{studentAge};
        </when>
        <otherwise>
            or 1 = 1;
        </otherwise>
    </choose>
</select>

foreach

 

这将促成查询失利。即便只知足一个询问条件仍然有题目,比如满意studentName那一个吧,生成的SQL语句将是:

List<Student> list = StudentOperator.getInstance().selectInCondition(0, "Jack", 0, null);

什么是动态SQL

<select id=”selectInCondition” parameterType=”student”
resultType=”student”>
    <![CDATA[
        select * from student where
    ]]>
    <if test=”studentName != null and studentName != ‘Jack’ “>
        and studentName = #{studentName}
    </if>
    <if test=”studentAge != 0″>
        and studentAge = #{studentAge};
    </if>
</select>

 

 

何以看头,因为众多时候我们需要where后边的子句都动态变化,而不是预先有一个where,这样就有问题,比如说:

<select id="selectInCondition" parameterType="student" resultType="student">
    select * from student where studentId > #{studentId}
    <if test="studentName != null">
        and studentName = #{studentName};
    </if>
</select>

MyBatis的一个无敌特性之一通常是它的动态SQL能力。要是您有拔取JDBC或任何一般框架的阅历,你就了然条件串联SQL字符串在共同是何等地痛苦,确保无法忘了空格或者在列表的尾声的简短逗号,动态SQL能够彻底处理这种伤痛。

List<Student> list = StudentOperator.getInstance().selectInCondition(0, null, 0, null);

这就是说查询的就是studentId>0的享有学员音信。

地点的例子是二种if判断都可能存在,接下去使用choose、when、other做一些修改:

只顾一下,能用”<![CDATA[ …
]]>”尽量仍旧用,可是只包动态SQL外的内容。

网站地图xml地图