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标签的更多相关文章

  1. 9.mybatis动态SQL标签的用法

    mybatis动态SQL标签的用法   动态 SQL MyBatis 的强大特性之一便是它的动态 SQL.如果你有使用 JDBC 或其他类似框架的经验,你就能体会到根据不同条件拼接 SQL 语句有多么 ...

  2. mybatis动态SQL标签的用法

    动态 SQL MyBatis 的强大特性之一便是它的动态 SQL.如果你有使用 JDBC 或其他类似框架的经验,你就能体会到根据不同条件拼接 SQL 语句有多么痛苦.拼接的时候要确保不能忘了必要的空格 ...

  3. MyBatis 动态sql标签trim

    https://blog.csdn.net/zhangxing52077/article/details/75041053 序列序号在Mybatis中的使用的使用 将获得序列值获取返回到对象code字 ...

  4. MyBatis动态Sql 的使用

    Mapper.xml提示: 1:mapper包中新建一个文件:mybatis-3-mapper.dtd 2:在web app libraries/mybatis.jar/org.apache.ibat ...

  5. Mybatis动态SQL单一基础类型参数用if标签

    Mybatis动态SQL单一基础类型参数用if标签时,test中应该用 _parameter,如: 1 2 3 4 5 6 <select id="selectByName" ...

  6. MyBatis动态SQL之一使用 if 标签和 choose标签

    bootstrap react https://segmentfault.com/a/1190000010383464 xml 中 < 转义 to thi tha <if test=&qu ...

  7. Mybatis系列全解(八):Mybatis的9大动态SQL标签你知道几个?提前致女神!

    封面:洛小汐 作者:潘潘 2021年,仰望天空,脚踏实地. 这算是春节后首篇 Mybatis 文了~ 跨了个年感觉写了有半个世纪 ... 借着女神节 ヾ(◍°∇°◍)ノ゙ 提前祝男神女神们越靓越富越嗨 ...

  8. 【JAVA - SSM】之MyBatis动态SQL

    动态SQL就是在SQL语句中添加一些标签,以完成某些逻辑.通常用到的动态SQL标签有<if>.<choose>.<where>.<trim>.<s ...

  9. 自己动手实现mybatis动态sql

    发现要坚持写博客真的是一件很困难的事情,各种原因都会导致顾不上博客.本来打算写自己动手实现orm,看看时间,还是先实现一个动态sql,下次有时间再补上orm完整的实现吧. 用过mybatis的人,估计 ...

随机推荐

  1. WordPress 插件机制的简单用法和原理(Hook 钩子)

    WordPress 的插件机制实际上只的就是这个 Hook 了,它中文被翻译成钩子,允许你参与 WordPress 核心的运行,是一个非常棒的东西,下面我们来详细了解一下它. PS:本文只是简单的总结 ...

  2. form表单提交和ajax提交的区别

    form表单是整个页面跳到服务器的地址然后提交数据: ajax是往这个地址post数据 <form style="padding:0px;margin:0px;" targe ...

  3. BZOJ-1975 魔法猪学院 K短路 (A*+SPFA)

    1975: [Sdoi2010]魔法猪学院 Time Limit: 10 Sec Memory Limit: 64 MB Submit: 1323 Solved: 433 [Submit][Statu ...

  4. Bringing up interface eth0: Error:Connection activation failed:Device not managed by NetworkManager

    Just follow the below steps and everything will be ok...   1. Remove Network Manager from startup Se ...

  5. codevs1500 后缀排序

    题目描述 Description 天凯是MIT的新生.Prof. HandsomeG给了他一个长度为n的由小写字母构成的字符串,要求他把该字符串的n个后缀(suffix)从小到大排序. 何谓后缀?假设 ...

  6. UVa 11988 Broken Keyboard (a.k.a. Beiju Text)

    题目复制太麻烦了,甩个链接 http://acm.hust.edu.cn/vjudge/problem/viewProblem.action?id=18693 直接模拟光标操作时间复杂度较高,所以用链 ...

  7. IOS基础之(十四) KVO/KVC

    资料参考: http://www.cnblogs.com/kenshincui/p/3871178.html http://www.cnblogs.com/stoic/archive/2012/07/ ...

  8. Entity Framework 学习总结之一:ADO.NET 实体框架概述

    http://www.cnblogs.com/xlovey/archive/2011/01/03/1924800.html ADO.NET 实体框架概述 新版本中的 ADO.NET 以新实体框架为特色 ...

  9. 修改MYSQL 表中的字段属性

    1.登录数据库 >mysql -u root -p 数据库名称 2.查询所有数据表 >show tables; 3.查询表的字段信息 >desc 表名称; 4.1.修改某个表的字段类 ...

  10. ios 判断控制器是否是第一次进入画页的做法

    什么是第一次进入画页,只viewDidLoad一次: 所以只需要在viewDidLoad中加一个标识就行了. 加一个成员变量,或者属性,用来记录这个标识 一旦viewDidLoad后,这个就说明不是第 ...