MyBatis動態SQL標籤用法

一、動態SQL片斷java

經過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 >
 
二、數字範圍查詢
所傳參數名稱是捏造所得,非數據庫字段,好比_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 >
 
三、時間範圍查詢
                         < isNotEmpty  prepend ="" property="_starttime" > 
                                 < isNotEmpty  prepend ="and"  property ="_endtime" > 
                                        <![CDATA[ 
                                        createtime >= #_starttime# 
                                        and createtime  < #_endtime# 
                                 ]] > 
                                 </ isNotEmpty > 
                         </ isNotEmpty > 
 
四、in查詢
                         < isNotEmpty  prepend ="and"  property ="_in_state" > 
                                state in ('$_in_state$') 
                         </ isNotEmpty >
 
五、like查詢
                         < isNotEmpty  prepend ="and"  property ="chnameone" > 
                                (chnameone like '%$chnameone$%' or spellinitial like '%$chnameone$%') 
                         </ isNotEmpty > 
                         < isNotEmpty  prepend ="and"  property ="chnametwo" > 
                                chnametwo like '%$chnametwo$%' 
                         </ isNotEmpty > 
 
六、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 >
 
七、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 >
 
九、函數的使用
        <!--  添加 --> 
         < 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 >
 
十、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>

十一、trim
 trim是更靈活的去處多餘關鍵字的標籤,他能夠實踐where和set的效果。sql


 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> ide

 

  
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>   url

 

 

十二、choose (when, otherwise)
         有時候咱們並不想應用全部的條件,而只是想從多個選項中選擇一個。MyBatis提供了choose 元素,按順序判斷when中的條件出否成立,若是有一個成立,則choose結束。當choose中全部when的條件都不滿則時,則執行 otherwise中的sql。相似於Java 的switch 語句,choose爲switch,when爲case,otherwise則爲default。
         if是與(and)的關係,而choose是或(or)的關係。spa


         例以下面例子,一樣把全部能夠限制的條件都寫上,方面使用。選擇條件順序,when標籤的從上到下的書寫順序:code

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>  rem

相關文章
相關標籤/搜索