MyBatis动态SQL标签用法实例详解

时间:2021-09-15 22:26:39

1、动态SQL片段

通过SQL片段达到代码复用

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
<!-- 动态条件分页查询 -->
   <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字段                   

?
1
2
3
4
5
6
7
8
9
10
<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>

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

?
1
2
3
4
5
6
7
8
9
10
<isNotEmpty prepend="and" property="_now">
            <![CDATA[
                  execplantime >= #_now#
               ]]>
        </isNotEmpty>
        <isNotEmpty prepend="and" property="_now">
            <![CDATA[
                  closeplantime <= #_now#
               ]]>
        </isNotEmpty>

      3、时间范围查询           

?
1
2
3
4
5
6
7
8
<isNotEmpty prepend="" property="_starttime">
             <isNotEmpty prepend="and" property="_endtime">
                 <![CDATA[
                 createtime >= #_starttime#
                 and createtime < #_endtime#
              ]]>
             </isNotEmpty>
         </isNotEmpty>

  4、in查询                   

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

 5、like查询                 

?
1
2
3
4
5
6
<isNotEmpty prepend="and" property="chnameone">
              (chnameone like '%$chnameone$%' or spellinitial like '%$chnameone$%')
          </isNotEmpty>
          <isNotEmpty prepend="and" property="chnametwo">
              chnametwo like '%$chnametwo$%'
          </isNotEmpty>

6、or条件                  

?
1
2
3
4
5
6
7
8
9
10
11
<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子查询              

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
<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、函数的使用 

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
<!-- 添加 -->
  <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结果集  

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
<!-- 动态条件分页查询 -->
   <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代码 

?
1
2
3
4
5
6
7
8
9
10
11
12
<!-- 查询学生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代码 

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
<!-- 更新学生信息 --> 
<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代码 

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
<!-- 查询学生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标签用法实例详解,希望对大家有所帮助,如果大家有任何疑问欢迎给我留言,小编会及时回复大家的!

原文链接:http://blog.csdn.net/luojishan1/article/details/74837875