您的位置:首页 > 数据库

MyBatis动态SQL标签用法

2017-07-08 16:10 525 查看
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>  
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: