MyBatis学习笔记(五):动态SQL

2019-01-02  本文已影响2人  简单一点点

传统的JDBC方法,在使用复杂SQL的时候经常需要拼接,不仅麻烦而且容易出错。MyBatisd的动态SQL技术可以通过几个标签组合出灵活的SQL语句,提高开发效率。

if、test元素

if元素用于判断语句,常与test元素配合使用。test元素用来判断真假,大部分情况用来判断非空。

<select id="getHero" resultType="hero">
    select id, hero_name as heroName, hero_title as heroTitle, main_property as mainProperty,
    note from t_heroes where 1= 1 
    <if test="heroName != null and roleName != ''">
        and hero_name = #{heroName}
    </if>
</select>

choose、 when、 otherwise元素

类似于JAVA中的switch,用于多条件选择语句。

<select id="getHero" resultType="hero">
    select id, hero_name as heroName, hero_title as heroTitle, main_property as mainProperty,
    note from t_heroes where 1=1
    <choose> 
        <when test="heroName != null and heroName != ''">
            and hero_name = #{heroName}
        </when>
        <when test="heroTitle != null and heroName != ''">
            and hero_title = #{heroTitle}
        </when>
        <otherwise>
            note is not null
        </otherwise>
    </choose>
</select>

where、 trim、 set元素

前面的where后面都加了1=1,这是因为如果不加语句会有语法问题(有可能where后面紧接着and)。where元素就可以处理这种情况。看下面的例子,表面上看只是多了一个标签,但实际上它后面出现and或or这些字段的时候,它知道如何处理。

<select id="getHero" resultType="hero">
    select id, hero_name as heroName, hero_title as heroTitle, main_property as mainProperty,
    note from t_heroes
    <where> 
        <if test="heroName != null and heroName != ''">
            and hero_name = #{heroName}
        </if>
        <if test="heroTitle != null and heroName != ''">
            and hero_title = #{heroTitle}
        </if>
    </where>
</select>

trim标签也可以实现。下面的例子的意思是当where后面紧随and或者or的化,就去掉它们。

<trim prefix="where" prefixOverrides="and|or">
    ...
</trim>

和where一样,set元素也是解决set语句的问题(有可能set后面紧接逗号)。

<update id="updateHero" parameterType="hero">
   update t_heroes
    <set> 
        <if test="heroName != null and heroName != ''">
            hero_name = #{heroName},
        </if>
        <if test="heroTitle != null and heroName != ''">
            hero_title = #{heroTitle}
        </if>
    </set>
    where id = #{id}
</update>

同样,上面set语句中的逗号问题也可以使用trim解决。

foreach元素

foreach元素是一个循环语句,用来遍历集合,往往用于SQL中的in关键字。

<select id="getHeroesById" resultType="hero">
    select id, hero_name as heroName, hero_title  as heroTitle, main_property as mainProperty,
        note from t_heroes where id in
    <foreach item="heroId" index="index" collection="idList" 
        open="(" separator="," close=")">
        #{heroId}
    </foreach>
</select>

foreach用法相对复杂,大概解释一下。

bind元素

bind元素是通过OGNL表达式去自定义一个上下文变量。在进行模糊查询的时候,MySQL数据库会使用concat,与“%”和参数相连,Oracle数据库会使用连接符号“||”。有了bind元素,就不必使用数据库语言,增强了可移植性。

<select id="getHero2" resultType="hero">
    <bind name="p_heroName" value="'%' + heroName +'%'" />
    <bind name="p_heroTitle" value="'%' + heroTitle +'%'" />
    select id, hero_name as heroName, hero_title as heroTitle, main_property as mainProperty,
    note from t_heroes where hero_name like p_heroName and hero_title like p_heroTtile
</select>

绑定2个新变量p_heroName和p_heroTitle,可以在SQL的其它地方使用。

上一篇下一篇

猜你喜欢

热点阅读