动态 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. C#实现Javascript的Splice方法

    最近开始学习Javascript语言,看到splice方法,以下引用其说明:该方法是一个通用删除和插入元素的方法,它可以在数组指定的位置开始删除或插入元素.其包括3个参数:第一个参数指定插入的起始位置 ...

  2. Intellij IDEA 各种乱码解决方案 posted @ 2017-06-23 15:31:06

    一次解决所有问题,只需做配置文件的修改即可 解决方案:       在      IntelliJ IDEA 2016.1\bin\idea64.exe.vmoptions        Intell ...

  3. canal —— 阿里巴巴mysql数据库binlog的增量订阅&消费组件

    阿里巴巴mysql数据库binlog的增量订阅&消费组件canal ,转载自  https://github.com/alibaba/canal 最新更新 canal QQ讨论群已经建立,群号 ...

  4. html和css入门 (三)

    文本样式 color 文本颜色 属性名 color 属性值 预定义的颜色名 | 十六进制值的颜色值 | RGB颜色值 默认值 依赖用户代理 描述 设置文本的颜色 direction 文本方向( 属性名 ...

  5. javascript 文字大小自动适应文本框 (文字大小自动调整)

    javascript 文字大小自动适应文本框 (文字大小自动调整) TOC 思考 思考一:面积法 思考二:微调法 代码 在进行类似微博墙之类的展示页面中,经常会遇到这样的需求:在固定大小的区域放入字数 ...

  6. 3.获取git仓库

    有两种取得 Git 项目仓库的方法. 第一种是在现有项目或目录下导入所有文件到 Git 中: 第二种是从一个服务器克隆一个现有的 Git 仓库. 在现有目录中初始化仓库 如果你打算使用 Git 来对现 ...

  7. golang rest api example

    package main import ( "net/http" "github.com/gin-gonic/gin" "github.com/jin ...

  8. windows线程时间打印

    https://blog.csdn.net/xingcen/article/details/70084029

  9. hearbeat

    heartbeat介绍: 作用: 通过heartbeat,可以将资源(IP及程序服务等资源)从一台已经故障的计算机快速转移到另一台正常运转的机器上继续提供服务,一般称之为高可用服务.在升级生产应用场景 ...

  10. My SQL 和SQL Server区别

    MySQL 与SQL Server区别 今天了解了二者区别,整理网上查阅资料,总结列举如下: MSSQL == SQL server 是sybase与微软合作时期的产物. 对于程序开发人员而言,目前使 ...