使用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 ...
随机推荐
- 配置防盗链、访问控制Directory和FilesMatch
5月31日任务 课程内容: 11.25 配置防盗链11.26 访问控制Directory11.27 访问控制FilesMatch扩展几种限制ip的方法 http://ask.apelearn.com/ ...
- MyEclispe启动Tomcat7时出现错误The servlets named [LoginServlet] and [com.liu.control.LoginServlet] are both
刚开始尝试写Servlet代码,第一天就碰到这个错误,在网上找了很多资料才找到解决办法,在此记录一下. org.apache.catalina.LifecycleException: Failed t ...
- ASCII, Unicode, UTF-8
(本文参考:http://www.ruanyifeng.com/blog/2007/10/ascii_unicode_and_utf-8.html) 1. ASCII码 我们知道,在计算机内部,所有的 ...
- 失去循环标记的Python,我这样实现跳出外层循环
不完美的Python 自从各类Python大火,感觉天上地下哪儿都有Python的一席之地,Python功夫好啊-但python有些细节上缺少其他语言的便利.今天我们就来举几个例子. 跳出外层循环 大 ...
- 深度研究:回归模型评价指标R2_score
回归模型的性能的评价指标主要有:RMSE(平方根误差).MAE(平均绝对误差).MSE(平均平方误差).R2_score.但是当量纲不同时,RMSE.MAE.MSE难以衡量模型效果好坏.这就需要用到R ...
- poi-tl二次开发
poi-tl二次开发 poi-tl是一款非常好用的word模板生成库,更新响应快.文档demo齐全.堪称word模板界的小军刀! 写在前面 如果你对word模板技术有了解.或者有兴趣,更甚者工作中接触 ...
- luogu P1807 最长路_NOI导刊2010提高(07)
题目描述 设G为有n个顶点的有向无环图,G中各顶点的编号为1到n,且当为G中的一条边时有i < j.设w(i,j)为边的长度,请设计算法,计算图G中<1,n>间的最长路径. 输入格式 ...
- enumerate用法总结
enumerate在字典上是枚举.列举的意思 对于一个可迭代的(iterable)/可遍历的对象(如列表.字符串),enumerate将其组成一个索引序列,利用它可以同时获得索引和值 enumerat ...
- 10分钟搞定nginx实现负载均衡
10.1 负载均衡的概念 对用户请求的数据进行调度的作用 对用户访问的请求网站可以进行压力的分担 10.2 常见的代理方式 10.2.1 正向代理 10.2.2 反向代理 10.3 负载均衡的部署环节 ...
- 551. 学生出勤纪录 I
给定一个字符串来代表一个学生的出勤纪录,这个纪录仅包含以下三个字符: 'A' : Absent,缺勤 'L' : Late,迟到 'P' : Present,到场 如果一个学生的出勤纪录中不超过一个' ...