(二)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 ...
随机推荐
- 【转】iOS 7免费设计资源汇总
原文链接:http://mobile.51cto.com/hot-406317.htm#585532-tsina-1-28470-7e393678b940a4d55500bf3feae3d2e9 以下 ...
- Java Calendar类(java.util包)
Date 类最主要的作用就是获得当前时间,同时这个类里面也具有设置时间以及一些其他的功能,但是由于本身设计的问题,这些方法却遭到众多批评,不建议使用,更推荐使用 Calendar 类进行时间和日期的处 ...
- [Err] 1055 - Expression #1 of ORDER BY clause is not in GROUP BY clause报错问题的解决
run SQL: select version(),@@sql_mode;SET sql_mode=(SELECT REPLACE(@@sql_mode,'ONLY_FULL_GROUP_BY','' ...
- Frogger POJ - 2253(求两个石头之间”所有通路中最长边中“的最小边)
题意 题目主要说的是,有两只青蛙,在两个石头上,他们之间也有一些石头,一只青蛙要想到达另一只青蛙所在地方,必须跳在石头上.题目中给出了两只青蛙的初始位置,以及剩余石头的位置,问一只青蛙到达另一只青 ...
- Webpack实战(四):教教你如何轻松搞定-预处理器(loader)
前面三节,我主要给大家分享了有关webpack的一些配置的知识点,如何打包js文件,而如果我们遇到其他类型的资源如图片.css.字体font等等,我们该如何处理呢?今天会介绍预处理器(loader), ...
- 由Kaggle竞赛wiki文章流量预测引发的pandas内存优化过程分享
pandas内存优化分享 缘由 最近在做Kaggle上的wiki文章流量预测项目,这里由于个人电脑配置问题,我一直都是用的Kaggle的kernel,但是我们知道kernel的内存限制是16G,如下: ...
- docker安装的gitlab的备份与恢复
1.对docker容器安装gitlab备份 1) 查看容器id docker ps 2) 将容器备份成镜像文件 docker commit -a 'James' -m 'gitlab_backup' ...
- ancconda创建爬虫项目
# 安装 conda env list conda create -n <envname> conda activate <envname> conda install scr ...
- newSQL 到底是什么?
数据库发展至今已经有3代了: SQL,传统关系型数据库,例如 MySQL noSQL,例如 MongoDB newSQL SQL 的问题 互联网在本世纪初开始迅速发展,互联网应用的用户规模.数据量都越 ...
- Identity 4 -1创建一个登录中心
准备知识 官网地址:https://identityserver4.readthedocs.io/ 通过nuget安装 Identity Server4