(二)Mybatis动态sql
首先动态sql简单来讲就是可以根据传入参数的不同来动态的生成sql语句,拼接where语句,这样你就不用写很多个sql语句了,并且它里面有一些特性也可以帮助你避免sql语句的拼接错误,主要分为4个:
if,chooose,trim,foreach
IF:
对参数进行判断,拼接不同的sql语句,看一个例子
<select id="selectByIf" parameterType="person" resultType="person">
select *from person where sex !=
<if test="name != null">
AND name = #{name}
</if>
</select>
很简单,test=".."里面的是条件,当传入的name属性不为空时,就将if标签体当中的sql语句拼接到其后,当然你后面也可以写很多个if,满足条件的都会拼接。另外test里面的条件也是可以进行复合判断的,比如:
<select id="selectByIf" parameterType="person" resultType="person">
select *from person where sex !=
<if test="name != null and name!='温鸿飞'">
AND name = #{name}
</if>
</select>
这时候如果传入对象的name为温鸿飞,那就不会拼接sql语句了。
Choose:
这个语句其实即使if,else,从第一个开始向下找,找到满足条件的就停止,比如;
<select id="selectByIf" parameterType="person" resultType="person">
select *from person where sex !=
<choose>
<when test="name!=null">
and name = #{name}
</when>
<when test="name=='温鸿飞'">
and name = ''
</when>
<otherwise></otherwise>
</choose>
</select>
很容易理解,不过说明一点,比如你传入的name值为温鸿飞,那么拼接的sql语句是and name = #{name},而不是第二个条件,即多个条件都满足时,拼接第一个。
,where,
是为了解决出现sql语法错误的情况:比如将上面if语句后面的sex!=0去掉,
<select id="selectByIf" parameterType="person" resultType="person">
select *from person where
<if test="sex!=null">
sex != #{sex}
</if>
<if test="name != null">
AND name = #{name}
</if>
</select>
这时如果满足条件,很明显拼接出来的sql语句是不正确的,这时候只要给if外面加上<where>标签就可以了,加上之后会自动去除and,并且会加上where(如果满足其中一个if条件的话),如下:
<select id="selectByIf" parameterType="person" resultType="person">
select *from person
<where>
<if test="sex!=null">
sex != #{sex}
</if>
<if test="name!=null">
and name = #{name}
</if>
</where>
</select>
set,
这个标签是在动态更新的时候用的,可以帮助我们加上set,并去除无关的逗号,如下
<update id="updateByIf" parameterType="person">
update person
<set>
<if test="name!=null">name=#{name },</if>
<if test="sex!=null">sex=#{sex}</if>
</set>
where id =#{id}
</update>
如果只传入了name,那么name=#{name}, 后面的这个逗号也会帮我们去掉,这个意思
Foreach
一般用于in标识符后面,如下:
<select id="selectByForeach" parameterType="list" resultType="person">
select * from person where id in
<foreach collection="list" item="id" close=")" open="(" separator=",">
#{id}
</foreach>
</select>
item是别名,collection是类型,list和array一般,后面三个是拼接时候的开始结尾分隔符,接口这样写:
List<Person> selectByForeach(List list);
传入的是List类型,
例,插入多条数据,传入list,每一项都是Person对象,构建sql语句即可
<insert id="insertAll" parameterType="list">
insert into person (`name`,`loves`,`sex`) values
<foreach collection="list" separator="," open="" close="" item="person">
(#{person.name},#{person.loves},#{person.sex})
</foreach>
</insert>
规则就这些,用的时候肯定会很复杂
(二)Mybatis动态sql的更多相关文章
- 二 mybatis 动态sql
动态sql应用 一 .什么是动态sql 1.where条件 动态查询 根据姓名或年龄或地址查询 UserMapper.xml 1 <select id="findUser" ...
- MyBatis 动态SQL(十二)
动态条件查询 以下是我们数据库表 tb_user 的记录: 假设现在有一个需求,就是根据输入的用户年龄和性别,查询用户的记录信息.你可能会说,这太简单了,脑袋里立马蹦出如下的 SQL 语句: SELE ...
- MyBatis动态SQL之一使用 if 标签和 choose标签
bootstrap react https://segmentfault.com/a/1190000010383464 xml 中 < 转义 to thi tha <if test=&qu ...
- Mybatis动态sql及分页、特殊符号
目的: mybatis动态sql(案例:万能查询) 查询返回结果集的处理 mybatis的分页运用 mybatis的特殊符号 mybatis动态sql(案例:万能查询) 根据id查询 模糊查询 (参数 ...
- Mybatis 动态sql(转载)
原文地址:http://www.cnblogs.com/dongying/p/4092662.html 传统的使用JDBC的方法,相信大家在组合复杂的的SQL语句的时候,需要去拼接,稍不注意哪怕少了个 ...
- mybatis实战教程(mybatis in action)之八:mybatis 动态sql语句
mybatis 的动态sql语句是基于OGNL表达式的.可以方便的在 sql 语句中实现某些逻辑. 总体说来mybatis 动态SQL 语句主要有以下几类:1. if 语句 (简单的条件判断)2. c ...
- 9.mybatis动态SQL标签的用法
mybatis动态SQL标签的用法 动态 SQL MyBatis 的强大特性之一便是它的动态 SQL.如果你有使用 JDBC 或其他类似框架的经验,你就能体会到根据不同条件拼接 SQL 语句有多么 ...
- 自己动手实现mybatis动态sql
发现要坚持写博客真的是一件很困难的事情,各种原因都会导致顾不上博客.本来打算写自己动手实现orm,看看时间,还是先实现一个动态sql,下次有时间再补上orm完整的实现吧. 用过mybatis的人,估计 ...
- Mybatis动态SQL单一基础类型参数用if标签
Mybatis动态SQL单一基础类型参数用if标签时,test中应该用 _parameter,如: 1 2 3 4 5 6 <select id="selectByName" ...
- 超全MyBatis动态SQL详解!( 看完SQL爽多了)
MyBatis 令人喜欢的一大特性就是动态 SQL. 在使用 JDBC 的过程中, 根据条件进行 SQL 的拼接是很麻烦且很容易出错的. MyBatis 动态 SQL 的出现, 解决了这个麻烦. My ...
随机推荐
- Kubernetes 会不会“杀死” DevOps?
作者丨孙健波(天元) 阿里巴巴技术专家 导读:DevOps 这个概念最早是在 2007 年提出的,那时云计算基础设施的概念也才刚刚提出没多久,而随着互联网的逐渐普及,应用软件的需求爆发式增长,软件开 ...
- 学习集合Collection_通用方法
Collection 常用接口 集合List和Set通用的方法 public boolean add(E e) 添加对象到集合 public boolean remove(E e) 删除指定元素 pu ...
- MySQL数据库(三)
前提要述:参考书籍<MySQL必知必会> 2.1 MySQL简介 2.1.1 什么是MySQL MySQL是一种关系数据库管理系统.负责数据库中数据的存储,检索,管理和处理. 2.1.2 ...
- BeanUtils 如何拷贝 List?
BeanUtils 如何拷贝 List? 一.背景 我们在DO.Model.VO层数据间可能经常转换数据: Entity对应的是持久层数据结构(一般是数据库表的映射模型); Model 对应的是业务层 ...
- Objectarx 相交矩形求并集 面域转多段线
测试结果: 主要思路:拾取一个点作为矩形的插入点,分别以该点进行两次jig操作,就能得到白色的两个相交的polyline,之后需要变成红色的封闭多段线.做法就是:求出两个白色矩形的面域,然后通过boo ...
- APP开通支付宝支付 转账功能
注意:支付宝单笔转账到账户功能的准入条件 首先要在商家中心注册,从商家中心可以跳转到开放平台. 登陆蚂蚁金服开放平台 1 开发中心->网页&移动应用 2 根据需求选择应用类型创建应用 3 ...
- LR Java脚本编写方法
之前在某一家银行也接触过java写的性能接口脚本,最近因项目,也需编写java接口性能测试脚本,脑袋一下懵逼了,有点不知道从何入手.随后上网查了相关资料,自己又稍微总结了一下,与大家共同分享哈~ 首先 ...
- 79.纯 CSS 创作单元素麦当劳金拱门 Logo(原文)
1. 效果图: 效果地址:https://codepen.io/flyingliao/pen/JgavjX 原理:m是伪元素::before弄出来的,::after遮挡中间下方一小块. 感想:学到一个 ...
- window 10 安装Oracle odac 64位
下载地址:https://www.oracle.com/cn/database/technologies/windows/downloads.html 可以下载XCopy版,也可以继续往下看下载安装文 ...
- hadoop 基础
common 一组分布式文件系统和通用I/O的组件与接口(序列化.java RPC和持久化数据结构) Avro 一种支持高效.跨语言的RPC以及永久存储数据的序列化系统 MapReduce 分布式数据 ...