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> 

以上所述是小编给大家介绍的MyBatis动态SQL标签用法实例详解,希望对大家有所帮助,如果大家有任何疑问欢迎给我留言,小编会及时回复大家的!

时间: 2017-07-08

Mybatis入门教程(四)之mybatis动态sql

推荐阅读: MyBatis入门学习教程(一)-MyBatis快速入门  什么是动态SQL? 动态SQL有什么作用? 传统的使用JDBC的方法,相信大家在组合复杂的的SQL语句的时候,需要去拼接,稍不注意哪怕少了个空格,都会导致错误.Mybatis的动态SQL功能正是为了解决这种问题, 其通过 if, choose, when, otherwise, trim, where, set, foreach标签,可组合成非常灵活的SQL语句,从而提高开发人员的效率. 下面就去感受Mybatis动态SQL

MyBatis实践之动态SQL及关联查询

序言 MyBatis,大家都知道,半自动的ORM框架,原来叫ibatis,后来好像是10年apache软件基金组织把它托管给了goole code,就重新命名了MyBatis,功能相对以前更强大了.它相对全自动的持久层框架Hibernate,更加灵活,更轻量级,这点我还是深有体会的. MyBatis的一个强大特性之一就是动态SQL能力了,能省去我们很多串联判断拼接SQL的痛苦,根据项目而定,在一定的场合下使用,能大大减少程序的代码量和复杂程度,不过还是不是过度太过复杂的使用,以免不利于后期的维护

Mybatis输入输出映射及动态SQL Review

一.输入映射 通过parameterType指定输入参数的类型,可以是简单类型.pojo包装类.HashMap等 1.输入简单类型 <select id="findUserById" parameterType="int" resultType="com.mybatis.po.User"> select * from user where id=#{id} </select> 2.输入pojo包装类 <select

详解Mybatis动态sql

1.什么是mybatis动态sql 看到动态,我们就应该想到,这是一个可以变化的sql语句 MyBatis的动态SQL是基于OGNL表达式的,它可以帮助我们方便的在SQL语句中实现某些逻辑 2.mybatis动态sql使用前准备 a.数据库表 b.创建类 3.使用mybatis动态sql,得先知道一些属性值 一,插入 selectKey:在sql语句前后或后执行的sql语句 keyColumn:对应字段名或别名 keyProperty:对应实体类的属性名或map的key值 order:在执行语句

MyBatis使用动态SQL标签的小陷阱

MyBatis是一个支持普通SQL查询,存储过程和高级映射的优秀持久层框架.MyBatis消除了几乎所有的JDBC代码和参数的手工设置以及对结果集的检索封装.MyBatis可以使用简单的XML或注解用于配置和原始映射,将接口和Java的POJO(Plain Old Java Objects,普通的Java对象)映射成数据库中的记录. 现在MyBatis越来越受大家的喜爱了,它的优势大家都知道,我就不多说了,直接说重点. MyBatis中提供动态SQL功能,我们可以使用<if><when&

mybatis教程之动态sql语句_动力节点Java学院整理

有些时候,sql语句where条件中,需要一些安全判断,例如按某一条件查询时如果传入的参数是空,此时查询出的结果很可能是空的,也许我们需要参数为空时,是查出全部的信息.使用Oracle的序列.mysql的函数生成Id.这时我们可以使用动态sql. 下文均采用mysql语法和函数(例如字符串链接函数CONCAT). selectKey 标签 在insert语句中,在Oracle经常使用序列.在MySQL中使用函数来自动生成插入表的主键,而且需要方法能返回这个生成主键.使用myBatis的selec

详解Java的MyBatis框架中动态SQL的基本用法

有些时候,sql语句where条件中,需要一些安全判断,例如按某一条件查询时如果传入的参数是空,此时查询出的结果很可能是空的,也许我们需要参数为空时,是查出全部的信息.使用Oracle的序列.mysql的函数生成Id.这时我们可以使用动态sql.下文均采用mysql语法和函数(例如字符串链接函数CONCAT). selectKey 标签 在insert语句中,在Oracle经常使用序列.在MySQL中使用函数来自动生成插入表的主键,而且需要方法能返回这个生成主键.使用myBatis的select

mybatis的动态sql详解(精)

MyBatis 的一个强大的特性之一通常是它的动态 SQL 能力.如果你有使用 JDBC 或其他 相似框架的经验,你就明白条件地串联 SQL 字符串在一起是多么的痛苦,确保不能忘了空 格或在列表的最后省略逗号.动态 SQL 可以彻底处理这种痛苦. 通常使用动态SQL不可能是独立的一部分,MyBatis当然使用一种强大的动态SQL语言来改进这种情形,这种语言可以被用在任意映射的SQL语句中. 动态SQL元素和使用 JSTL或其他相似的基于XML的文本处理器相似.在MyBatis之前的版本中,有很多

MyBatis 执行动态 SQL语句详解

大家基本上都知道如何使用 MyBatis 执行任意 SQL,使用方法很简单,例如在一个 XXMapper.xml 中: <select id="executeSql" resultType="map"> ${_parameter} </select> 你可以如下调用: sqlSession.selectList("executeSql", "select * from sysuser where enabled

Mybatis中动态SQL,if,where,foreach的使用教程详解

MyBatis的动态SQL是基于OGNL表达式的,它可以帮助我们方便的在SQL语句中实现某些逻辑. MyBatis中用于实现动态SQL的元素主要有: if choose(when,otherwise) trim where set foreach mybatis核心 对sql语句进行灵活操作,通过表达式进行判断,对sql进行灵活拼接.组装. 1.statement中直接定义使用动态SQL: 在statement中利用if 和 where 条件组合达到我们的需求,通过一个例子来说明: 原SQL语句

Mybatis映射文件实例详解

 一.输入映射 parameterType 指定输入参数的Java类型,可以使用别名或者类的全限定名.它可以接收简单类型.POJO.HashMap. 1.传递简单类型 根据用户ID查询用户信息: <select id="findUserById" parameterType="int" resultType="com.itheima.mybatis.po.User"> SELECT * FROM USER WHERE id =#{id

MyBatis的foreach语句详解

foreach的主要用在构建in条件中,它可以在SQL语句中进行迭代一个集合.foreach元素的属性主要有 item,index,collection,open,separator,close.item表示集合中每一个元素进行迭代时的别名,index指 定一个名字,用于表示在迭代过程中,每次迭代到的位置,open表示该语句以什么开始,separator表示在每次进行迭代之间以什么符号作为分隔 符,close表示以什么结束,在使用foreach的时候最关键的也是最容易出错的就是collectio

springmvc与mybatis集成配置实例详解

简单之美,springmvc,mybatis就是一个很好的简单集成方案,能够满足一般的项目需求.闲暇时间把项目配置文件共享出来,供大家参看: 1.首先我们来看下依赖的pom: <!-- spring --> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-core</artifactId> <version>${spring.ve

MyBatis查询缓存实例详解

查询缓存的使用,主要是为了提高查询访问速度.将用户对同一数据的重复查询过程简化,不再每次均从数据库查询获取结果数据,从而提高访问速度. MyBatis的查询缓存机制,根据缓存区的作用域(生命周期)可划分为两种:一级缓存与二级缓存 一.一级查询缓存 MyBatis一级缓存是基于org.apache.ibatis.cache.impl.PerpetualCache类的HashMap本地缓存,其作用域是Sqlsession.在同一个Sqlsession中两次执行相同的sql语句,第一次执行完毕后,会将

IDEA版最新MyBatis程序配置教程详解

实验环境:IDEA2020.1+MySQL8.0.21+Mybatis3.5.5+Junit4.13 搭建环境–>导入Mybatis->编写代码->测试 1.搭建实验数据库 我们创建一个mybatis实验数据库,并创建一个user表为后续实验准备 CREATE DATABASE `mybatis`; USE `mybatis`; CREATE TABLE `user`( `id` INT(4) NOT NULL PRIMARY key, `name` VARCHAR(20) NOT NU

intellij idea中安装、配置mybatis插件Free Mybatis plugin的教程详解

场景: 使用intellij idea开发,持久层dao使用了mybatis,经常需要编辑mybatis的××Mapper.java和××Mapper.xml,因为是接口里一个方法对应xml里的一个SQL的id,当需要找找个方法时候得拷贝找个方法名,然后在对应文件中ctrl+f全文查找,相当麻烦.本篇讲述的使用mybatis的插件后将极大的提高效率.效果如图: 即从××Mapper.java接口和××Mapper.xml中能由箭头直接点进去查看相对应的方法及SQL. 步骤: 1.ctrl+alt

MyBatis 中 SqlMapConfig 配置文件详解

0x00:文件介绍 在 WEB 工程中,对于 MyBatis 最核心的全局配置文件是 SqlMapConfig.xml 文件,其中包含了数据库的连接配置信息.Mapper 映射文件的加载路径.全局参数.类型别名等. 0x01:配置项详解 configuration:包裹所有配置标签,是整个配置文件的顶级标签. properties:属性,该标签可以引入外部配置的属性,也可以自己配置.该配置标签所在的同一个配置文件中的其他配置均可引用此配置中的属性. setting:全局配置参数,用来配置一些改变