• Mybatis 动态sql标签


    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>
  • 相关阅读:
    多想一点和多做一步
    js 判断字符是否以汉字开头
    代码片断编辑测试窗
    部署WAR文件到tomcat
    ROS机器人程序设计(原书第2版)补充资料 (柒) 第七章 3D建模与仿真 urdf Gazebo V-Rep Webots Morse
    ROS机器人程序设计(原书第2版)补充资料 (陆) 第六章 点云 PCL
    ROS机器人程序设计(原书第2版)补充资料 (伍) 第五章 计算机视觉
    ROS机器人程序设计(原书第2版)补充资料 (肆) 第四章 在ROS下使用传感器和执行器
    ROS机器人程序设计(原书第2版)补充资料 (叁) 第三章 可视化和调试工具
    ROS机器人程序设计(原书第2版)补充资料 (贰) 第二章 ROS系统架构及概念
  • 原文地址:https://www.cnblogs.com/xingzc/p/5761562.html
Copyright © 2020-2023  润新知