博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
MyBatis动态SQL标签用法
阅读量:5036 次
发布时间:2019-06-12

本文共 6595 字,大约阅读时间需要 21 分钟。

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>  

转载于:https://www.cnblogs.com/xiaoyuer2017/p/6518591.html

你可能感兴趣的文章
Making HTML5 work in IE6, IE7 & IE8
查看>>
在ASP.NET 5中如何方便的添加前端库
查看>>
使用Visual Studio Code开发AngularJS应用
查看>>
8467:鸣人的影分身
查看>>
语法分析的那些算法
查看>>
jQuery each使用
查看>>
立即执行函数
查看>>
第四次寒假作业
查看>>
USE_FUNC.txt
查看>>
分享一下 Eclipse 插件 PyDev 的安装
查看>>
(转)Python3之os模块
查看>>
hdu 4038 stone
查看>>
ASP.NET 显示项目之外的图片
查看>>
2011数字图书馆前沿问题高级研讨班-学习笔记1
查看>>
深度学习系列 Part(3)
查看>>
HDFS之HBase伪分布安装
查看>>
android 测试----Monkey
查看>>
static 关键字
查看>>
Vue 的基本认识
查看>>
最高的分数
查看>>