mybatis动态sql语句学习(一)
动态 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语句学习(一)的更多相关文章
- mybatis实战教程(mybatis in action)之八:mybatis 动态sql语句
mybatis 的动态sql语句是基于OGNL表达式的.可以方便的在 sql 语句中实现某些逻辑. 总体说来mybatis 动态SQL 语句主要有以下几类:1. if 语句 (简单的条件判断)2. c ...
- Mybatis 动态Sql语句《常用》
MyBatis 的强大特性之一便是它的动态 SQL.如果你有使用 JDBC 或其他类似框架的经验,你就能体会到根据不同条件拼接 SQL 语句有多么痛苦.拼接的时候要确保不能忘了必要的空格,还要注意省掉 ...
- mybatis 动态sql语句(3)
mybatis 的动态sql语句是基于OGNL表达式的.可以方便的在 sql 语句中实现某些逻辑. 总体说来mybatis 动态SQL 语句主要有以下几类: 1. if 语句 (简单的条件判断) 2. ...
- mybatis 动态sql语句(1)
mybatis 的动态sql语句是基于OGNL表达式的.可以方便的在 sql 语句中实现某些逻辑. 总体说来mybatis 动态SQL 语句主要有以下几类: 1. if 语句 (简单的条件判断) 2. ...
- MyBatis学习总结(11)——MyBatis动态Sql语句
MyBatis中对数据库的操作,有时要带一些条件,因此动态SQL语句非常有必要,下面就主要来讲讲几个常用的动态SQL语句的语法 MyBatis中用于实现动态SQL的元素主要有: if choose(w ...
- mybatis 动态sql语句(2)
什么是动态SQL MyBatis的一个强大特性之一通常是它的动态SQL能力.如果你有使用JDBC或其他相似框架的经验,你就明白条件串联SQL字符串在一起是多么地痛苦,确保不能忘了空格或者在列表的最后的 ...
- 【转】mybatis实战教程(mybatis in action)之八:mybatis 动态sql语句
转自:除非申明,文章均为一号门原创,转载请注明本文地址,谢谢! 转载地址:http://blog.csdn.net/kutejava/article/details/9164353#t5 1. if ...
- Ibatis.Net 动态SQL语句学习(六)
在学习动态SQL语句之前,首先必须对条件查询有一定了解,先来学习如何向IBatis.Net的映射文件里传入参数吧. 一.条件查询 1.传递单个参数 如根据Id查询: <select id=&qu ...
- 7. mybatis实战教程(mybatis in action)之八:mybatis 动态sql语句
转自:http://www.kyjszj.com/htzq/79.html 1. if 语句 (简单的条件判断) 2. choose (when,otherwize) ,相当于java 语言中的 sw ...
随机推荐
- openlayers 各种图层,持续更新
/*高德地图*/ var vectorLayerLine = new ol.layer.Tile({ source: new ol.source.XYZ({ urls: [ "http:// ...
- CXF生成客户端遇到的问题
一.CXF环境配置路径错误 1.错误现象 在命令行中输入 wsdl2java -v 检查CXF安装是否正确. 出现错误=> ERROR: Unable to find cxf-manifest. ...
- Linux 安装 EPEL YUM源
原文:https://blog.csdn.net/harbor1981/article/details/51135623 我们用yum安装软件时,经常发现我们的yum源里面没有该软件,需要自己去wge ...
- 微信公众号开发《一》OAuth2.0网页授权认证获取用户的详细信息,实现自动登陆
原创声明:本文为本人原创作品,绝非他处转账,转载请联系博主 从接触公众号到现在,开发维护了2个公众号,开发过程中遇到很多问题,现在把部分模块功能在这备案一下,做个总结也希望能给其他人帮助 工欲善其事, ...
- 洛谷P1155 双栈排序(贪心)
题意 题目链接 Sol 首先不难想到一种贪心策略:能弹则弹,优先放A 然后xjb写了写发现只有\(40\),原因是存在需要决策的情况 比如 \(A = {10}\) \(B = {8}\) 现在进来一 ...
- 1023 GPA计算
1023 GPA计算 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 青铜 Bronze 题解 查看运行结果 题目描述 Description 小松终于步入了大学的殿 ...
- Linux基础之-正则表达式(grep,sed,awk)
一. 正则表达式 正则表达式,又称规则表达式.(英语:Regular Expression,在代码中常简写为regex.regexp或RE),计算机科学的一个概念.正则表达式是对字符串操作的一种逻辑公 ...
- Vue2.0中的Ajax请求
Vue可以借助于vue-resource来实现Ajax请求 http请求报文 浏览器与服务器数据交互是遵循http协议的,当浏览器要访问服务器的时候,浏览器需要将相关请求数据提交给服务器. 格式分为: ...
- Oracle案例06—— OGG-01098 Could not flush "./dirdat/e1000004383" (error 28, No space left on device)
一.前言 自从换了新环境,各种问题层出不穷,如果不是之前积累的经验丰富,估计都歇菜了,看来作为数据库全栈工程师(oracle/mysql/sqlserver/sap hana/pg/mongodb/r ...
- 五、mariadb遇到的坑——Linux学习笔记
C#连接MySQL异常:The host localhost does not support SSL connections. 解决方案: 连接字符串添加如下语句. SslMode = none; ...