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的动态增删改查的更多相关文章

  1. MyBatis -- 对表进行增删改查(基于注解的实现)

    1.MyBatis对数据库表进行增/删/改/查 前一篇使用基于XML的方式实现对数据库的增/删/改/查 以下我们来看怎么使用注解的方式实现对数据库表的增/删/改/查 1.1  首先须要定义映射sql的 ...

  2. MyBatis简单的增删改查以及简单的分页查询实现

    MyBatis简单的增删改查以及简单的分页查询实现 <? xml version="1.0" encoding="UTF-8"? > <!DO ...

  3. Mybatis入门之增删改查

    Mybatis入门之增删改查 Mybatis如果操作成功,但是数据库没有更新那就是得添加事务了.(增删改都要添加)----- 浪费了我40多分钟怀疑人生后来去百度... 导入包: 引入配置文件: sq ...

  4. Spring Boot 使用Mybatis注解开发增删改查

    使用逆向工程是遇到的错误 错误描述 org.apache.ibatis.binding.BindingException: Invalid bound statement (not found): c ...

  5. Mybatis实现简单增删改查

    Mybatis的简单应用 学习内容: 需求 环境准备 代码 总结: 学习内容: 需求 使用Mybatis实现简单增删改查(以下是在IDEA中实现的,其他开发工具中,代码一样) jar 包下载:http ...

  6. SpringMVC,MyBatis商品的增删改查

    一.需求 商品的增删改查 二.工程结构 三.代码 1.Mapper层 (1) ItemsMapperCustom.java package com.tony.ssm.mapper; import ja ...

  7. 基于SSM之Mybatis接口实现增删改查(CRUD)功能

    国庆已过,要安心的学习了. SSM框架以前做过基本的了解,相比于ssh它更为优秀. 现基于JAVA应用程序用Mybatis接口简单的实现CRUD功能: 基本结构: (PS:其实这个就是用的Mapper ...

  8. mybatis中的增删改查操作

    在这一个部分,主要进行增删改查的示例书写. 增删改查可以基于xml的,也可以基于注解的方式. 一:对单条数据的查询 1.目录结构 这个使得目录更加清晰 2.User.java 这个使用以前的user表 ...

  9. ztree使用系列三(ztree与springmvc+spring+mybatis整合实现增删改查)

    在springmvc+spring+mybatis里整合ztree实现增删改查,上一篇已经写了demo,以下就仅仅贴出各层实现功能的代码: Jsp页面实现功能的js代码例如以下: <script ...

随机推荐

  1. BZOJ 3622: 已经没有什么好害怕的了 [容斥原理 DP]

    3622: 已经没有什么好害怕的了 题意:和我签订契约,成为魔法少女吧 真·题意:零食魔女夏洛特的结界里有糖果a和药片b各n个,两两配对,a>b的配对比b>a的配对多k个学姐就可能获胜,求 ...

  2. BZOJ 2006: [NOI2010]超级钢琴 [ST表+堆 | 主席树]

    题意: 一个序列,求k个不相同的长度属于\([L,R]\)的区间使得和最大 前缀和,对于每个r找最小的a[l] 然后我yy了一个可持久化线段树做法...也许会T 实际上主席树就可以了,区间k小值 然后 ...

  3. BZOJ 3544: [ONTAK2010]Creative Accounting [set]

    给定一个长度为N的数组a和M,求一个区间[l,r],使得$(\sum_{i=l}^{r}{a_i}) mod M$的值最大,求出这个值,注意这里的mod是数学上的mod 这道题真好,题面连LaTeX都 ...

  4. Nginx设置身份验证

    在某些情况下,需要对某些内容的访问进行限制,在Nginx中也提供了这样的限制措施,以下是几种常见的限制措施: 1.访问身份验证 在Nginx的插件模块中有一个模块ngx_http_auth_basic ...

  5. Redis安装和基础介绍

    一:初识Redis Redis是一个远程内存数据库,它不仅性能强劲,而且还具有复制特性以及为解决问题而生的独一无二的数据模型.Redis提供了5种不同类型的数据结构,各式各样的问题都可以很自然地映射到 ...

  6. Windows Server 2016-查询FSMO角色信息的三种方法

    FSMO操作主机角色有五种:林范围操作主机角色有两种,分别是 架构主机角色(Schema Master)和 域命名主机角色(Domain Naming Master):及域范围操作主机角色三种,分别是 ...

  7. Selenium_Java版本安装及初试

    [环境] ①JDK版本:jdk1.8.0_73 ②Eclipse:jee-mars-4.5.2 ③Selenium:selenium-java-3.5.3 ④GoogleChrome:60 ⑤chro ...

  8. LINUX服务器下用root登录ftp

    因为安全方面的原因,root用户是默认不能登录ftp服务的. 如果一定要用root登录,则: 1.删除或注释/etc/vsftpd.ftpusers中的root 2.删除或注释/etc/vsftpd. ...

  9. 使用腾讯云“自定义监控”监控GPU使用率

    欢迎大家前往云+社区,获取更多腾讯海量技术实践干货哦~ 作者:李想 随着人工智能以及比特币的火热,GPU云服务的使用场景是越来越广,在很多场景下我们也需要获取GPU服务器的性能参数来优化程序的执行.目 ...

  10. Linux 每日命令行

    uptime 用于查看系统的负载信息. 它依次显示 当前系统时间.系统已运行时间.启用终端数量及平均负载值等信息.平均负载指的是系统在最近1分钟.5分钟.15分钟内的压力情况:负载值越低越好,尽量不要 ...