动态 SQL

MyBatis 的强大特性之一便是它的动态 SQL。如果你有使用 JDBC 或其他类似框架的经验,你就能体会到根据不同条件拼接 SQL 语句有多么痛苦。拼接的时候要确保不能忘了必要的空格,还要注意省掉列名列表最后的逗号。利用动态 SQL 这一特性可以彻底摆脱这种痛苦。

  • if
  • choose (when, otherwise)
  • trim (where, set)
  • foreach

if 元素

有条件的执行where语句,if 元素是与(and)的关系。

<select id="selectStudentInfoFive" parameterType="map" resultType="com.springboot02.dao.entity.StudentInfoEntity">
SELECT * FROM student_t
WHERE state = 1
<if test="id != null">
AND _id = #{id,jdbcType=VARCHAR}
</if>
<if test="name != null">
AND name = #{name,jdbcType=VARCHAR}
</if>
</select> <!--SELECT * FROM student_t WHERE state = 1 AND _id = '1'-->

choose, when, otherwise 元素

类似于Java 的 switch 语句,choose 为 switch,when 为 case,otherwise 则为 default。choose 是或(or)的关系。

<select id="selectUserInfoTwo" parameterType="java.lang.String" resultMap="BaseResultMap">
SELECT * FROM user WHERE status = 1
<choose>
<when test="username != null and username != ''">
AND username = #{username,jdbcType = VARCHAR}
</when>
<when test="password != null and password != ''">
AND password = #{password,jdbcType = VARCHAR}
</when>
<otherwise>
AND power = '1'
</otherwise>
</choose>
</select> <!--SELECT * FROM user WHERE status = 1 AND username = 'nana'-->
<!--SELECT * FROM user WHERE status = 1 AND power = '1'-->

trim, where, set 元素

trim 元素可以定制我们想要的功能,例如set或者是where元素的功能。

where 元素只有在一个以上的if条件有值的情况下才去插入“WHERE”子句。而且,若最后的内容是“AND”或“OR”开头的where 元素会将他们去除。

set 元素可以被用于动态包含需要更新的列,去除内容中最后一个“,”。

例子1:trim 元素替换where 元素

<select id="selectUserInfoByPowerTwo" parameterType="java.lang.String" resultMap="BaseResultMap">
SELECT * FROM user
<where>
<if test="power != null and power != ''">
AND power = #{power,jdbcType = VARCHAR}
</if>
<if test="status != null and status != ''">
AND status = 1
</if>
</where>
</select> <select id="selectUserInfoByPower" parameterType="java.lang.String" resultMap="BaseResultMap">
SELECT * FROM user
<trim prefix=" where" prefixOverrides="AND|OR">
<if test="power != null and power != ''">
power = #{power,jdbcType = VARCHAR}
</if>
<if test="status != null and status != ''">
AND status = 1
</if>
</trim>
</select>
<!--select * from user WHERE power = '1'-->
<!--select * from user WHERE status = 1-->

prefix:前缀      

prefixoverride:去掉第一个and或者是or

例子2:trim 元素替换set 元素

<update id="updateStudentInfoTwo" parameterType="com.springboot02.dao.entity.StudentInfoEntity">
UPDATE student_t
<set>
<if test="name != null and name !=''">
name=#{name,jdbcType = VARCHAR},
</if>
<if test="age != null and age != ''">
age = #{age,jdbcType = VARCHAR},
</if>
</set>
WHERE _id = #{id,jdbcType = VARCHAR}
</update>
<!--UPDATE student_t SET name='name', age = '12' WHERE _id = 1--> <update id="updateStudentInfoOne" parameterType="com.springboot02.dao.entity.StudentInfoEntity">
UPDATE student_t
<trim prefix="set" suffixOverrides="," suffix="WHERE _id = #{id,jdbcType=VARCHAR}">
<if test="name != null and name !=''">
name=#{name,jdbcType = VARCHAR},
</if>
<if test="age != null and age != ''">
age = #{age,jdbcType =VARCHAR},
</if>
</trim>
</update>
<!--UPDATE student_t SET name = 'nanana' WHERE _id = 1-->

suffix:后缀      

suffixoverride:去掉最后一个,

foreach 元素

foreach 元素主要用于构建in条件,可以在sql中对集合进行迭代。可以在批量删除、添加等操作中使用。

<delete id="deleteStudentInfoOne" parameterType="arraylist">
DELETE FROM student_t WHERE _id IN
<foreach collection="array" item="id" index="index" open="(" close=")" separator=",">
#{id}
</foreach>
</delete>
<!--DELETE FROM student_t WHERE _id IN (1,2)-->

collection :collection属性的值有3种:list、array、map,分别对应的参数类型为:List、数组、map集合。

item : 表示迭代元素的别名。

index :表示当前迭代的次数

open :前缀

close :后缀

separator :分隔符,表示迭代时每个元素之间以什么分隔。

sql 片段

在mybatis中通过使用SQL片段可以提高代码的重用性。

例子1:

<!--创建动态sql-->
<sql id="sql_count">select count(*)</sql> <!--查找学生表,状态为1的全部学生数量-->
<select id="selectListCount" resultType="java.lang.String">
<include refid="sql_count"/> FROM student_t where status = 1
</select> <!--select count(*) FROM student_t where status = 1-->

例子2:

<!--创建动态sql-->
<sql id="sql_student">select * from student_t </sql>
<sql id="sql_where">
<trim prefix="where" prefixOverrides="AND|OR">
<if test="id != null">AND _id = #{id}</if>
<if test="name != null and name.length() > 0">AND name = #{name}</if>
<if test="age != null and age.length() > 0">AND age = #{age}</if>
</trim>
</sql> <!--根据输入条件,查找学生信息-->
<select id="selectStudentInfoThree" parameterType="map" resultMap="BaseResultMap">
<include refid="sql_student"/>
<include refid="sql_where"/>
</select>
<!--SELECT * FROM student_t WHERE _id = 1 AND name = 'nana'-->

mybatis动态sql语句学习(一)的更多相关文章

  1. mybatis实战教程(mybatis in action)之八:mybatis 动态sql语句

    mybatis 的动态sql语句是基于OGNL表达式的.可以方便的在 sql 语句中实现某些逻辑. 总体说来mybatis 动态SQL 语句主要有以下几类:1. if 语句 (简单的条件判断)2. c ...

  2. Mybatis 动态Sql语句《常用》

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

  3. mybatis 动态sql语句(3)

    mybatis 的动态sql语句是基于OGNL表达式的.可以方便的在 sql 语句中实现某些逻辑. 总体说来mybatis 动态SQL 语句主要有以下几类: 1. if 语句 (简单的条件判断) 2. ...

  4. mybatis 动态sql语句(1)

    mybatis 的动态sql语句是基于OGNL表达式的.可以方便的在 sql 语句中实现某些逻辑. 总体说来mybatis 动态SQL 语句主要有以下几类: 1. if 语句 (简单的条件判断) 2. ...

  5. MyBatis学习总结(11)——MyBatis动态Sql语句

    MyBatis中对数据库的操作,有时要带一些条件,因此动态SQL语句非常有必要,下面就主要来讲讲几个常用的动态SQL语句的语法 MyBatis中用于实现动态SQL的元素主要有: if choose(w ...

  6. mybatis 动态sql语句(2)

    什么是动态SQL MyBatis的一个强大特性之一通常是它的动态SQL能力.如果你有使用JDBC或其他相似框架的经验,你就明白条件串联SQL字符串在一起是多么地痛苦,确保不能忘了空格或者在列表的最后的 ...

  7. 【转】mybatis实战教程(mybatis in action)之八:mybatis 动态sql语句

    转自:除非申明,文章均为一号门原创,转载请注明本文地址,谢谢! 转载地址:http://blog.csdn.net/kutejava/article/details/9164353#t5 1. if ...

  8. Ibatis.Net 动态SQL语句学习(六)

    在学习动态SQL语句之前,首先必须对条件查询有一定了解,先来学习如何向IBatis.Net的映射文件里传入参数吧. 一.条件查询 1.传递单个参数 如根据Id查询: <select id=&qu ...

  9. 7. mybatis实战教程(mybatis in action)之八:mybatis 动态sql语句

    转自:http://www.kyjszj.com/htzq/79.html 1. if 语句 (简单的条件判断) 2. choose (when,otherwize) ,相当于java 语言中的 sw ...

随机推荐

  1. 在 Azure 虚拟机上快速搭建 MongoDB 集群

    MongoDB 是目前在 NoSQL 市场上非常受欢迎的一个数据库,本文介绍如何使用 Azure PowerShell 和 Azure CLI 在 Azure 虚拟机上搭建单节点 MongoDB(测试 ...

  2. css样式margin padding border

  3. web.xml配置文件中async-supported报错解决

    项目中配置spring时async-supported报错: 是因为<async-supported>true</async-supported>是web.xml 3.0的新特 ...

  4. git的问题(error: object file .git/objects/* is empty...)的解决方案及对git版本库文件的了解

    由于操作不当,导致git版本库出了大问题,如下所示: error: object file .git/objects/8b/61d0135d3195966b443f6c73fb68466264c68e ...

  5. Maven打包时,不包含jar包

    在给Maven项目打war包时,如果不想把依赖中的jar包也包含进去,可以在plugins中加入 <span style="white-space:pre"> < ...

  6. Csharp: speech to text, text to speech in win

    using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; usin ...

  7. 云计算的三种模式:IaaS、PaaS和SaaS

    云计算主要分为三种服务模式,而且这个三层的分法重要是从用户体验的角度出发的: 1. Software as a Service,软件即服务,简称SaaS,这层的作用是将应用作为服务提供给客户. 2. ...

  8. Sencha Architect打开闪退问题修复

    删除以下位置的cache文件夹 C:\Users\Administrator\AppData\Local\Sencha\Sencha Architect 3.2\Cache bug解决参考 https ...

  9. 关于moucedown 的3种触发方式

    与 click 事件不同   mousedown 按下鼠标就可以触发 click 只能用鼠标左键触发, 而mousedown 可以由单击.中键.或右击 触发 根据对event.which 的判断,可以 ...

  10. 关于ES7里面的async和await

    async / await是ES7的重要特性之一,也是目前社区里公认的优秀异步解决方案.目前,async / await这个特性已经是stage 3的建议,可以看看TC39的进度,本篇文章将分享asy ...