动态 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. nodejs中cookie、session的使用

    因为http会话的无状态性,为了标记用户的登录状态,便出现了cookie.cookie分为很多种,有普通cookie.签名cookie.json cookie等,这里主要记录下在express应用中如 ...

  2. [android] post请求接口demo测试代码

    MainActivity.java package com.tsh.test; import java.io.InputStream; import java.io.OutputStream; imp ...

  3. final 、finalize和finally的区别

    2019-04-1217:29:40 (1)final用于声明属性,方法和类,分别表示属性不可变,方法不可覆盖,类不可继承.内部类要访问局部变量,局部变量必须定义成final类型,比如一段代码 (2) ...

  4. 5、springboot之修改端口号

    在resources中加入application.properties文件,里面加入 servier.port = 端口号 访问的时候,就用localhost:端口号 完事

  5. Could not open php://output for writing.问题解决

    这是一个自己在项目中遇到的问题. 由于一直以来,公司都是用的Linux服务器,这次为客户做项目,换成了winserver. 项目中有一项功能是Excel导出,采用PHPEXCEL类库实现.由于是个小项 ...

  6. JavaEE之会话技术Cookie&Session

    会话技术简介 存储客户端的状态 由一个问题引出今天的内容,例如网站的购物系统,用户将购买的商品信息存储到哪         里?因为Http协议是无状态的,也就是说每个客户访问服务器端资源时,服务器并 ...

  7. 01HTMl-<base>标签

    一.base用于定义页面链接的打开方式 <base target="_blank"/> 定义页面链接默认打开方式,base通过target属性告诉浏览器如何打开页面. ...

  8. javascript实现SHA1算法

    web里面密码直接传到后台是不安全的,有时候需要进行加密,找到一个不错的javascript SHA1算法: <!DOCTYPE html> <html lang="en& ...

  9. 主动驱动事件执行--createEvent

    1. createEvent(eventType)参数:eventType 共5种类型:    Events :包括所有的事件.           HTMLEvents:包括 'abort', 'b ...

  10. FCKeditor文本编辑器的使用方法

    FCKeditor是一个功能强大支持所见即所得功能的文本编辑器,可以为用户提供微软office软件一样的在线文档编辑服务. 它不需要安装任何形式的客户端,兼容绝大多数主流浏览器,支持ASP.Net.A ...