1、动态SQL片段

通过SQL片段达到代码复用

 <!-- 动态条件分页查询 -->
    <sql id="sql_count">
        select count(*)
    </sql>
    <sql id="sql_select">
        select *
    </sql>
    <sql id="sql_where">
        from icp
        <dynamic prepend="where">
            <isNotEmpty prepend="and" property="name">
                name like '%$name$%'
            </isNotEmpty>
            <isNotEmpty prepend="and" property="path">
                path like '%path$%'
            </isNotEmpty>
            <isNotEmpty prepend="and" property="area_id">
                area_id = #area_id#
            </isNotEmpty>
            <isNotEmpty prepend="and" property="hided">
                hided = #hided#
            </isNotEmpty>
        </dynamic>
        <dynamic prepend="">
            <isNotNull property="_start">
                <isNotNull property="_size">
                    limit #_start#, #_size#
                </isNotNull>
            </isNotNull>
        </dynamic>
    </sql>
    <select id="findByParamsForCount" parameterClass="map" resultClass="int">
        <include refid="sql_count"/>
        <include refid="sql_where"/>
    </select>
    <select id="findByParams" parameterClass="map" resultMap="icp.result_base">
        <include refid="sql_select"/>
        <include refid="sql_where"/>
    </select>

2、数字范围查询

所传参数名称是捏造所得,非数据库字段,比如_img_size_ge、_img_size_lt字段                   

 <isNotEmpty prepend="and" property="_img_size_ge">
                <![CDATA[
                img_size >= #_img_size_ge#
            ]]>
            </isNotEmpty>
            <isNotEmpty prepend="and" property="_img_size_lt">
                <![CDATA[
                img_size < #_img_size_lt#
            ]]>
            </isNotEmpty>

多次使用一个参数也是允许的      

    <isNotEmpty prepend="and" property="_now">
                <![CDATA[
                      execplantime >= #_now#
                   ]]>
            </isNotEmpty>
            <isNotEmpty prepend="and" property="_now">
                <![CDATA[
                      closeplantime <= #_now#
                   ]]>
            </isNotEmpty>

      3、时间范围查询           

   <isNotEmpty prepend="" property="_starttime">
                <isNotEmpty prepend="and" property="_endtime">
                    <![CDATA[
                    createtime >= #_starttime#
                    and createtime < #_endtime#
                 ]]>
                </isNotEmpty>
            </isNotEmpty> 

  4、in查询                   

  <isNotEmpty prepend="and" property="_in_state">
                state in ('$_in_state$')
            </isNotEmpty>

 5、like查询                 

  <isNotEmpty prepend="and" property="chnameone">
                (chnameone like '%$chnameone$%' or spellinitial like '%$chnameone$%')
            </isNotEmpty>
            <isNotEmpty prepend="and" property="chnametwo">
                chnametwo like '%$chnametwo$%'
            </isNotEmpty> 

6、or条件                  

 <isEqual prepend="and" property="_exeable" compareValue="N">
                <![CDATA[
                (t.finished='11'  or t.failure=3)
            ]]>
            </isEqual>

            <isEqual prepend="and" property="_exeable" compareValue="Y">
                <![CDATA[
                t.finished in ('10','19') and t.failure<3
            ]]>
            </isEqual>

7、where子查询              

 <isNotEmpty prepend="" property="exprogramcode">
                <isNotEmpty prepend="" property="isRational">
                    <isEqual prepend="and" property="isRational" compareValue="N">
                        code not in
                        (select t.contentcode
                        from cms_ccm_programcontent t
                        where t.contenttype='MZNRLX_MA'
                        and t.programcode = #exprogramcode#)
                    </isEqual>
                </isNotEmpty>
            </isNotEmpty>
    <select id="findByProgramcode" parameterClass="string" resultMap="cms_ccm_material.result">
        select *
        from cms_ccm_material
        where code in
        (select t.contentcode
        from cms_ccm_programcontent t
        where t.contenttype = 'MZNRLX_MA'
        and programcode = #value#)
        order by updatetime desc
    </select>

    9、函数的使用 

  <!-- 添加 -->
    <insert id="insert" parameterClass="RuleMaster">
        insert into rulemaster(
        name,
        createtime,
        updatetime,
        remark
        ) values (
        #name#,
        now(),
        now(),
        #remark#
        )
        <selectKey keyProperty="id" resultClass="long">
            select LAST_INSERT_ID()
        </selectKey>
    </insert>
    <!-- 更新 -->
    <update id="update" parameterClass="RuleMaster">
        update rulemaster set
        name = #name#,
        updatetime = now(),
        remark = #remark#
        where id = #id#
    </update>

10、map结果集  

 <!-- 动态条件分页查询 -->
    <sql id="sql_count">
        select count(a.*)
    </sql>
    <sql id="sql_select">
        select a.id        vid,
        a.img       imgurl,
        a.img_s     imgfile,
        b.vfilename vfilename,
  b.name      name,
        c.id        sid,
        c.url       url,
        c.filename  filename,
        c.status    status
    </sql>
    <sql id="sql_where">
        From secfiles c, juji b, videoinfo a
        where
        a.id = b. videoid
        and b.id = c.segmentid
        and c.status = 0
        order by a.id asc,b.id asc,c.sortnum asc
        <dynamic prepend="">
            <isNotNull property="_start">
                <isNotNull property="_size">
                    limit #_start#, #_size#
                </isNotNull>
            </isNotNull>
        </dynamic>
    </sql>
    <!-- 返回没有下载的记录总数 -->
    <select id="getUndownFilesForCount" parameterClass="map" resultClass="int">
        <include refid="sql_count"/>
        <include refid="sql_where"/>
    </select>
    <!-- 返回没有下载的记录 -->
    <select id="getUndownFiles" parameterClass="map" resultClass="java.util.HashMap">
        <include refid="sql_select"/>
        <include refid="sql_where"/>
    </select>

11、trim

 trim是更灵活的去处多余关键字的标签,他可以实践where和set的效果。

 where例子的等效trim语句:

Xml代码 

<!-- 查询学生list,like姓名,=性别 -->
<select id="getStudentListWhere" parameterType="StudentEntity" resultMap="studentResultMap">
  SELECT * from STUDENT_TBL ST
  <trim prefix="WHERE" prefixOverrides="AND|OR">
    <if test="studentName!=null and studentName!='' ">
      ST.STUDENT_NAME LIKE CONCAT(CONCAT('%', #{studentName}),'%')
    </if>
    <if test="studentSex!= null and studentSex!= '' ">
      AND ST.STUDENT_SEX = #{studentSex}
    </if>
  </trim>
</select> 

set例子的等效trim语句:

Xml代码 

<!-- 更新学生信息 -->
<update id="updateStudent" parameterType="StudentEntity">
  UPDATE STUDENT_TBL
  <trim prefix="SET" suffixOverrides=",">
    <if test="studentName!=null and studentName!='' ">
      STUDENT_TBL.STUDENT_NAME = #{studentName},
    </if>
    <if test="studentSex!=null and studentSex!='' ">
      STUDENT_TBL.STUDENT_SEX = #{studentSex},
    </if>
    <if test="studentBirthday!=null ">
      STUDENT_TBL.STUDENT_BIRTHDAY = #{studentBirthday},
    </if>
    <if test="classEntity!=null and classEntity.classID!=null and classEntity.classID!='' ">
      STUDENT_TBL.CLASS_ID = #{classEntity.classID}
    </if>
  </trim>
  WHERE STUDENT_TBL.STUDENT_ID = #{studentID};
</update>  

12、choose (when, otherwise)

         有时候我们并不想应用所有的条件,而只是想从多个选项中选择一个。MyBatis提供了choose 元素,按顺序判断when中的条件出否成立,如果有一个成立,则choose结束。当choose中所有when的条件都不满则时,则执行 otherwise中的sql。类似于Java 的switch 语句,choose为switch,when为case,otherwise则为default。

         if是与(and)的关系,而choose是或(or)的关系。

         例如下面例子,同样把所有可以限制的条件都写上,方面使用。选择条件顺序,when标签的从上到下的书写顺序:

Xml代码 

<!-- 查询学生list,like姓名、或=性别、或=生日、或=班级,使用choose -->
<select id="getStudentListChooseEntity" parameterType="StudentEntity" resultMap="studentResultMap">
  SELECT * from STUDENT_TBL ST
  <where>
    <choose>
      <when test="studentName!=null and studentName!='' ">
          ST.STUDENT_NAME LIKE CONCAT(CONCAT('%', #{studentName}),'%')
      </when>
      <when test="studentSex!= null and studentSex!= '' ">
          AND ST.STUDENT_SEX = #{studentSex}
      </when>
      <when test="studentBirthday!=null">
        AND ST.STUDENT_BIRTHDAY = #{studentBirthday}
      </when>
      <when test="classEntity!=null and classEntity.classID !=null and classEntity.classID!='' ">
        AND ST.CLASS_ID = #{classEntity.classID}
      </when>
      <otherwise>
      </otherwise>
    </choose>
  </where>
</select> 

以上所述是小编给大家介绍的MyBatis动态SQL标签用法实例详解,希望对大家有所帮助,如果大家有任何疑问欢迎给我留言,小编会及时回复大家的!

02-09 03:56