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标签用法实例详解,希望对大家有所帮助,如果大家有任何疑问欢迎给我留言,小编会及时回复大家的!

(0)

相关推荐

  • 详解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入门教程(四)之mybatis动态sql

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

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

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

  • 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详解(精)

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

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

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

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

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

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

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

  • 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&quo

  • mybatis动态sql实现逻辑代码详解

    目录 1.xml文件读取 2.xml 文件解析 mybatis通过将sql配置xml文件中,通过解析xml动态标签来实现动态sql 如下样例 xml文件 <?xml version = "1.0" ?> <!DOCTYPE script SYSTEM "script-1.0.dtd"> <script namespace="user"> <common id="commonOrder"

  • Mybatis动态SQL之IF语句详解

    Mysql 5.0 以后,支持了动态sql语句,我们可以通过传递不同的参数得到我们想要的值. 1. Mybatis–动态SQL之IF语句 没有搭建环境的请点击 1.1 BlogMapper.java // 查询博客 List<Blog> queryBlogIf(Map map); 1.2 BlogMapper.xml <select id="queryBlogIf" parameterType="map" resultType="Blog

  • ThinkPHP模板循环输出Volist标签用法实例详解

    本文实例讲述了ThinkPHP模板循环输出Volist标签用法.分享给大家供大家参考,具体如下: volist 标签用于在模板中循环输出数据集或者多维数组. volist 标签 在模块操作中,select() 方法返回的是一个二维数组,可以用 volist 直接输出: <volist name="list" id="vo"> 用 户 名:{$vo['username']}<br /> 电子邮件:{$vo['email']}<br /&g

  • jsp自定义标签用法实例详解

    本文实例讲述了jsp自定义标签用法.分享给大家供大家参考.具体如下: 在JSP中有一种机制,可以让你在JSP页面中插入与HTML类似的标记.本文介绍JSP定制标记的基本概念和构成,以及如何开发和应用JSP定制标记. 什么是标记 使用HTML语言我们可以这样去编辑我们的网页: <HTML> <HEAD> <TITLE> HELLO WORLD </TITLE> </HEAD> <BODY> HELLO WORLD </BODY&g

  • javaWeb自定义标签用法实例详解

    本文实例讲述了javaWeb自定义标签用法.分享给大家供大家参考,具体如下: 自定义标签创建 自定义标签主要用于移除Jsp页面中的Java代码. 移除jsp页面中的java代码,只需要完成两个步骤: - 编写一个继承TagSupport的Java类,并覆盖doStartTag方法,把jsp页面中的java代码写到doStartTag方法中. - 编写标签库描述符(tld)文件,在tld文件中对自定义标签进行描述. 完成以上操作,即可在JSP页面中导入和使用自定义标签. 标签处理类:HelloTa

  • MyBatis动态SQL标签的用法详解

    1.MyBatis动态SQL MyBatis 的强大特性之一便是它的动态 SQL,即拼接SQL字符串.如果你有使用 JDBC 或其他类似框架的经验,你就能体会到根据不同条件拼接 SQL 语句有多么痛苦.拼接的时候要确保不能忘了必要的空格,还要注意省掉列名列表最后的逗号.利用动态 SQL 这一特性可以彻底摆脱这种痛苦. 通常使用动态 SQL 不可能是独立的一部分,MyBatis 当然使用一种强大的动态 SQL 语言来改进这种情形,这种语言可以被用在任意的 SQL 映射语句中. 动态 SQL 元素和

  • vue 组件高级用法实例详解

    一.递归组件 组件在它的模板内可以递归地调用自己, 只要给组件设置name 的选项就可以了. 示例如下: <div id="app19"> <my-component19 :count="1"></my-component19> </div> Vue.component('my-component19',{ name: 'my-component19', //其实当你利用 Vue.component 全局注册了一个组件

  • MyBatis Properties及别名定义实例详解

    上一篇我们介绍了mybatis的增删改查入门实例,我们发现在 mybatis-configuration.xml 的配置文件中,对数据库的配置都是硬编码在这个xml文件中,如下图,那么我们如何改进这个写法呢? 1.我们将 数据库的配置语句写在 db.properties 文件中 jdbc.driver=com.mysql.jdbc.Driver jdbc.url=jdbc:mysql://localhost:3306/ssm jdbc.username=root jdbc.password=ro

  • jQuery siblings()用法实例详解

    siblings() 获得匹配集合中每个元素的同胞,通过选择器进行筛选是可选的. jQuery 的遍历方法siblings() $("给定元素").siblings(".selected") 其作用是筛选给定的同胞同类元素(不包括给定元素本身) 例子:网页选项栏 当点击任意一个选项卡是,其他2个选项卡就会改变样式,其内容也会隐藏. 下面是html代码. <body> <ul id="menu"> <li class=

随机推荐