使用Mybatis实现动态SQL(二)
使用Mybatis实现动态SQL
作者 : Stanley 罗昊
【转载请注明出处和署名,谢谢!】
写在前面:
*本章节适合有Mybatis基础者观看*
使用Mybatis实现动态SQL(一)链接:https://www.cnblogs.com/StanleyBlogs/p/10772878.html#4241746.
在上一章内容中,我介绍了一些在xml文件中使用一些标签来让我们一条sql语句更加灵活,那么下面,我将让条件变得更加多样性,根据需求去实现这些功能从而达到练习的目的;
在工作当中,可能会遇到这样的业务:
批量的删除或批量的查询,比如我们在网购的时候,在购物车中,我们往往可以批量的删除,勾选你想进行删除的商品,或者根据id批量的对这些数据进行处理,这个时候,我们确实要根据id去查询,但是根据一个id,那,确实很简单,但是要是类似于这种批量型的该怎么做呢?
其实很简单,只需要用的foreache这样标签就可以了,比如我们要进行批量删除,这个时候,传过来的一定是一串商品id,不再是单个id,因为批量嘛,所以这个时候传过来的值我们可以把它封装成list集合,再到我们的xml文件中,我们对接收过来的这个集合进行遍历处理是不是就达到了批量操作的目的啦?
<foreache>
foreache可以迭代的类型:数组、集合、属性、对象数组
我们先来看一下本次的业务是什么:
查询学号为1、2、53的学生信息;
首先我们先编写一下sql:
select * from student from student where stuno in(,,)
那么我现在要通过mybatis传参,传一个集合过来,比方说,1 2 53是外界传进来的,如果我们需要解析的话,我们就需要通过foreach标签进行解析;
比如会儿我传进来一个ids,这个ids可能是数组,或是集合,这个东西里面就包含这三个 1 2 53;
所以,我们的查询sql语句里面应该就写成:
select * from student from student where stuno in(ids)
但是光写成以上那样肯定不行,因为语法都不通过,所以,需要通过foreache标签来进行操作,因为你光写一个ids Mybatis里的Xml文件肯定不认识的,所以我们需要通过标签来把这个ids给解析出 1 2 53;
使用foreache迭代属性
迭代属性的话,首先,我们需要在学生类中定义一个学号属性:
学号类名:Grade
学生信息类:Student
//学号
private List<Integer> stuNos;
并且提供gat、set方法;
所以在做项目的时候,在需求中看到需要根据id或者某些唯一的字段进行批量操作数据,那么,你就可以把这个类中的这个属性设置成集合类型;
以上工作准备就绪后,我们就开始在xml文件中编写配置了;
首先,我们编写select标签,标识本标签起到查询的作用,紧接着定义接收值类型:parametetType=“Grade” 返回值类型:resultType = “Student” ;
因为我们要根据Grade类进行查询,所以,些一个where标签,让sql语句灵活起来,内部写一个if标签,用来判断传过来的这个Grade对象中的stuNos属性是否有值,如果有,就执行if中的sql语句;
在if中记得加and 因为where可以自动处理第一个and,然后我们把sql语句写进去,写完之后先别着急,因为我们还需要把增强for循环写进去,因为我们需要解析grade中的stuNos这个集合,语法:
<foreache collection = "stuNos" open "and stuno in (" close = ")" item = "ids" sepatator = ",">
#{ids}
</foreache>
我们发现,我们的查询条件被分割了,前面的一半时查询条件+(;后面close括号中是另一半的括号;
后面这个item想必各位都很熟了,没错,item双引号中的ids就是代表着传过来的stuNos集合中的每一个数据,说白了它就是 1 2 53;
sepatator中写的是,迭代出来的数据用什么符号进行分割,如果不写,你迭代出来的数据就是 1253;
如果1253作为条件,那么肯定不对,所以我们加了sepatator并且表用用“,”所以迭代出来的数据是这样的 1,2,53;
接下来,我们完整的写出来实现按照以上业务完成对xml中编写动态sql:
<select id = "selectStudentInfoByid" parameterType = "grade" resultType = "Student" >
select * from Studnet
<where>
<if test "stuNos ! = null and stuNos.size>0">
<foreache collection = "stuNos" open "and stuno in (" close = ")" item = "ids" sepatator = ",">
#{ids}
</foreache>
</where>
</select>
使用Mybatis实现动态SQL(二)的更多相关文章
- MyBatis框架——动态SQL、缓存机制、逆向工程
MyBatis框架--动态SQL.缓存机制.逆向工程 一.Dynamic SQL 为什么需要动态SQL?有时候需要根据实际传入的参数来动态的拼接SQL语句.最常用的就是:where和if标签 1.参考 ...
- 一分钟带你了解下MyBatis的动态SQL!
MyBatis的强大特性之一便是它的动态SQL,以前拼接的时候需要注意的空格.列表最后的逗号等,现在都可以不用手动处理了,MyBatis采用功能强大的基于OGNL的表达式来实现,下面主要介绍下. 一. ...
- Mybatis中动态SQL语句中的parameterType不同数据类型的用法
Mybatis中动态SQL语句中的parameterType不同数据类型的用法1. 简单数据类型, 此时#{id,jdbcType=INTEGER}中id可以取任意名字如#{a,jdbcType ...
- MyBatis的动态SQL详解
MyBatis的动态SQL是基于OGNL表达式的,它可以帮助我们方便的在SQL语句中实现某些逻辑,本文详解mybatis的动态sql,需要的朋友可以参考下 MyBatis 的一个强大的特性之一通常是它 ...
- Mybatis解析动态sql原理分析
前言 废话不多说,直接进入文章. 我们在使用mybatis的时候,会在xml中编写sql语句. 比如这段动态sql代码: <update id="update" parame ...
- mybatis 使用动态SQL
RoleMapper.java public interface RoleMapper { public void add(Role role); public void update(Role ro ...
- 使用Mybatis实现动态SQL(一)
使用Mybatis实现动态SQL 作者 : Stanley 罗昊 [转载请注明出处和署名,谢谢!] 写在前面: *本章节适合有Mybatis基础者观看* 前置讲解 我现在写一个查询全部的 ...
- MyBatis探究-----动态SQL详解
1.if标签 接口中方法:public List<Employee> getEmpsByEmpProperties(Employee employee); XML中:where 1=1必不 ...
- mybatis中的.xml文件总结——mybatis的动态sql
resultMap resultType可以指定pojo将查询结果映射为pojo,但需要pojo的属性名和sql查询的列名一致方可映射成功. 如果sql查询字段名和pojo的属性名不一致,可以通过re ...
随机推荐
- session与cookie的介绍和两者的区别之其相互的关系
转:https://blog.csdn.net/weixin_37196194/article/details/55806366 本文分别对Cookie与Session做一个介绍和总结,并分别对两个知 ...
- 【开发者portal在线开发插件系列五】命令的响应,即命令结果的上报(mid的使用)
基础篇 [开发者portal在线开发插件系列一]profile和基本上下行消息 [开发者portal在线开发插件系列二]多条上下行消息(messageId的使用) 基础场景见上面两个帖子,这里单独介绍 ...
- 每个开发人员都应该知道的11个Linux命令
本文主要挑选出读者有必要首先学习的 11 个 Linux 命令,如果不熟悉的读者可以在虚拟机或云服务器上实操下,对于开发人员来说,能熟练掌握 Linux 做一些基本的操作是必要的! 事不宜迟,这里有 ...
- 制作通用framework的几点注意
一.创建framework,调成静态的framework . 二.匹配bitcode 三.增加-ObjC 在BuildSettting ->Linking->Other Linker Fl ...
- IO 单个文件的多线程拷贝
package FileCopyThread; //自建的包,根据个人调整 import java.io.File; import java.io.FileNotFoundException; imp ...
- [TimLinux] JavaScript 取消异步请求
1. xhr.abort() 这个函数可以用来取消XMLHttpRequest()发起的异步请求,不是xhr.close()哦. 2. 场景 比如说,在关闭一个模态框后,数据可能还没有过来,这个时候需 ...
- HDU3247 Resource Archiver (AC自动机+spfa+状压DP)
Great! Your new software is almost finished! The only thing left to do is archiving all your n resou ...
- java之方法的参数传递(值传递和引用传递)
方法,必须有其所在类或对象调用时才有意义,若方法有参数: 形参:方法声明时的参数: 实参:方法调用时实际传给形参的参数值: java的实参如何传入方法呢? 首先要明确:变量分为两大类:基础数据类型.引 ...
- 十大C++实战项目,你会几个?【高薪必备】
前言 本文的文字及图片来源于网络,仅供学习.交流使用,不具有任何商业用途,版权归原作者所有,如有问题请及时联系我们以作处理.作者:实验楼 市面上有很多C++的实战项目,从简单到进阶,学习每个项目都 ...
- unity3d WeelCollider 漂移
物理漂移 基础控制不在说明 Forward Friction 为轮胎直线摩擦力 Sideways Friction 为侧面摩擦力 Extremum Slip为速度达到多少后产生漂移效果 Extremu ...