动态 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. 改造一个JS插件的过程记录

    最近做一个合作项目,对方要求我们做一个web应用程序,然后嵌入到他们的总的wen应用中,风格要求保持一致,于是乎就发了一个html文件过来,大概列举了一下各种控件,对话框的效果. 好了,重点说其中的一 ...

  2. java读取txt文件,对字符串进行操作后导出txt文件

    嘿嘿,代码略为简单,不再多做解释,直接上码! package org.lq.com.util; import java.io.File; import java.io.InputStreamReade ...

  3. Grid标签计算结果集中的合计行

    方法一: var detailT= grid.gettable("11"); var r=detailT.rows.length; detailT.rows[r-1].cells[ ...

  4. radio 实现点击两次 第一次点击选中第二次点击取消

    由于项目的需求,要求radio点击两次后为取消状态,不方便修改为checkbox,可以用正面的方法实现. // jquery $('input:radio').click(function(){ // ...

  5. JS里的居民们5-数组(栈)

    编码1(栈顶在最右) 练习如何使用数组来实现栈,综合考虑使用数组的 push,pop,shift,unshift操作 基于代码,实现如按钮中描述的功能: 实现如阅读材料中,队列的相关进栈.退栈.获取栈 ...

  6. jquery对象与核心函数

    原生js入口函数与jQuery入口函数的区别 1.window.onload与document.ready在加载时间上的差异 document.ready会先触发,其次才是window.onload ...

  7. JS_1

    学习JS分为哪几步: 1.学习基础语法 JS写在哪 JS输出 JS变量 JS函数 JS分支 JS循环 2.学习JS操作网页DOM树 获取Dom节点 触发Dom事件 对Dom进行修改 3.学习JS对象及 ...

  8. arcgis10.sp5下载地址

    http://support.esrichina.com.cn/2012/0716/1649.html

  9. 弧形菜单(Android)

    弧形菜单(Android) 前言:公司需求,自己写的一个弧形菜单! 效果: 开发环境:AndroidStudio2.2.1+gradle-2.14.1 涉及知识:1.自定义控件,2.事件分发等 部分代 ...

  10. Linux->Ubuntu下配置telnet环境

    1.首先查看telnet运行状态 netstat -a | grep telnet 输出为空,表示没有开启该服务 2.安装openbsd-inetd apt-get install openbsd-i ...