美文网首页
Mybatis动态Sql映射标签总结

Mybatis动态Sql映射标签总结

作者: 小沙鹰168 | 来源:发表于2017-09-15 14:00 被阅读0次

    <select>、<insert>、<update>、<delete>
    <trim>:trim标签主要就是标记的作用,可以去掉if条件不满足时多余的and或者or或者,等等,和set标签或者where标签相通。
    trim标记是一个格式化的标记,可以完成set或者是where标记的功能,如下代码:

    1、

      select * from user 
    
      <trim prefix="WHERE" prefixoverride="AND |OR">
    
        <if test="name != null and name.length()>0"> AND name=#{name}</if>
    
        <if test="gender != null and gender.length()>0"> AND gender=#{gender}</if>
    
      </trim>
    

    假如说name和gender的值都不为null的话打印的SQL为:select * from user where name = 'xx' and gender = 'xx'

    在红色标记的地方是不存在第一个and的,上面两个属性的意思如下:

    prefix:前缀

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

    2、

      update user
    
      <trim prefix="set" suffixoverride="," suffix=" where id = #{id} ">
    
        <if test="name != null and name.length()>0"> name=#{name} , </if>
    
        <if test="gender != null and gender.length()>0"> gender=#{gender} ,  </if>
    
      </trim>
    

    假如说name和gender的值都不为null的话打印的SQL为:update user set name='xx' , gender='xx' where id='x'

    在红色标记的地方不存在逗号,而且自动加了一个set前缀和where后缀,上面三个属性的意义如下,其中prefix意义如上:

    suffixoverride:去掉最后一个逗号(也可以是其他的标记,就像是上面前缀中的and一样)

    suffix:后缀

    <where>:where是sql语句中的关键字,把他作为标签是防止sql语句中where之后的判断语句不成立,多出where关键字,使得sql语句出错。

    <select id="findActiveBlogLike"
         resultType="Blog">
      SELECT * FROM BLOG 
      WHERE 
      <if test="state != null">
        state = #{state}
      </if> 
      <if test="title != null">
        AND title like #{title}
      </if>
      <if test="author != null and author.name != null">
        AND author_name like #{author.name}
      </if>
    </select>
    

    <set>:使用set标签可以将动态的配置SET 关键字,和剔除追加到条件末尾(if语句中)的任何不相关的逗号。

    <update id="updateByPrimaryKeySelective" parameterType="RecruitmentConfBanner">
            UPDATE conf_banner t
            <set> 
                <if test="bannerName != null">
                    t.banner_name = #{bannerName},
                </if>
                <if test="bannerUrl != null">
                    t.banner_url = #{bannerUrl},
                </if>
                <if test="bannerLogo != null">
                    t.banner_logo = #{bannerLogo},
                </if>
                <if test="bannerDescription != null">
                    t.banner_description = #{bannerDescription},
                </if>
                <if test="sort != null">
                    t.sort = #{sort},
                </if>
                 <if test="isEnabled != null">
                    t.is_enabled = #{isEnabled},
                </if>
            </set>
            where t.banner_id = #{bannerId}
        </update>
    

    mybatis接受的参数分为:(1)基本类型(2)对象(3)List(4)数组(5)Map

    无论传哪种参数给mybatis,他都会将参数放在一个Map中:
    如果传入基本类型:变量名作为key,变量值作为value 此时生成的map只有一个元素。
    如果传入对象: 对象的属性名作为key,属性值作为value,
    如果传入List: "list"作为key,这个List是value (这类参数可以迭代,利用<foreach>标签实现循环)
    如果传入数组: "array"作为key,数组作为value(同上)
    如果传入Map: 键值不变。
    <foreach>:标签有循环的功能,可以用来生成有规律的SQL语句,主要属性有:
    item:表示集合每一个元素进行迭代时的别名
    index:表示在迭代过程中,每次迭代到的位置
    open:表示该语句已什么开始
    separator:表示每次迭代之间以什么符号作为分隔
    close:表示该语句已什么结束
    collection:需要迭代的变量

    <update id="pubS" parameterType="Map">  
      UPDATE BMC_SUBPLATE  
      SET PLSTATUS = '02'  
      WHERE  
      <foreach collection="ids" item="plid" open="" close="" separator="OR">  
       PLID = #{plid}  
      </foreach>  
     </update> 
    

    collection的值其实就是mybatis把参数转化成Map以后,这个Map的key,但是这个key对应的value必须是一个集合, 可以是数组,也可以是List
    生成的动态sql:
    Executing: UPDATE BMC_SUBPLATE SET PLSTATUS = '02' WHERE PLID = ? OR PLID = ?
    Parameters: 20121116144947537692(String), 20121116141301414855(String)

    <if>:查询标签
    <choose>:查询标签,choose(when,otherwise)相当于java中的switch/case
    if和choose酌情使用
    <bind>:可以从 OGNL 表达式中创建一个变量并将其绑定到上下文。比如:

    <select id="selectBlogsLike" resultType="Blog">
      <bind name="pattern" value="'%' + _parameter.getTitle() + '%'" />
      SELECT * FROM BLOG
      WHERE title LIKE #{pattern}
    </select>
    

    下面是映射xml文件中的其他一些标签的用法:
    <parameterMap>
    <include>:标签引入sql片段,通过<sql>的id值,引用一些可以重复使用的代码段。
    <resultMap>:将sql标签执行的结果返回,逐一定义列名和对象属性名之间的映射关系。
    <selectKey>:在不支持自增的主键而生成的策略标签。
    SelectKey在Mybatis中是为了解决Insert数据时不支持主键自动生成的问题,他可以很随意的设置生成主键的方式。

    不管SelectKey有多好,尽量不要遇到这种情况吧,毕竟很麻烦。

    selectKey Attributes
    属性 描述
    keyProperty selectKey 语句结果应该被设置的目标属性。
    resultType 结果的类型。MyBatis 通常可以算出来,但是写上也没有问题。MyBatis 允许任何简单类型用作主键的类型,包括字符串。
    order 这可以被设置为 BEFORE 或 AFTER。如果设置为 BEFORE,那么它会首先选择主键,设置 keyProperty 然后执行插入语句。如果设置为 AFTER,那么先执行插入语句,然后是 selectKey 元素-这和如 Oracle 数据库相似,可以在插入语句中嵌入序列调用。
    statementType 和前面的相 同,MyBatis 支持 STATEMENT ,PREPARED 和CALLABLE 语句的映射类型,分别代表 PreparedStatement 和CallableStatement 类型。

    SelectKey需要注意order属性,像Mysql一类支持自动增长类型的数据库中,order需要设置为after才会取到正确的值。
    像Oracle这样取序列的情况,需要设置为before,否则会报错。

    下面是一个xml和注解的例子,SelectKey很简单,两个例子就够了

    <insert id="insert" parameterType="map">  
        insert into table1 (name) values (#{name})  
        <selectKey resultType="java.lang.Integer" keyProperty="id">  
          CALL IDENTITY()  
        </selectKey>  
      </insert>  
    

    上面xml的传入参数是map,selectKey会将结果放到入参数map中。用POJO的情况一样,但是有一点需要注意的是,keyProperty对应的字段在POJO中必须有相应的setter方法,setter的参数类型还要一致,否则会报错。

    @Insert("insert into table2 (name) values(#{name})")  
    @SelectKey(statement="call identity()", keyProperty="nameId", before=false, resultType=int.class)  
    int insertTable2(Name name);  
    

    相关文章

      网友评论

          本文标题:Mybatis动态Sql映射标签总结

          本文链接:https://www.haomeiwen.com/subject/fmvssxtx.html