Mybatis动态SQL语句使用

在实际开发中,有时候查询条件可能是不确定的,查询条件可能有多条也可能没有,这时候就需要用到动态的sql语句拼接功能。

 

一、ifwheresql标签的使用

需求:在一些高级查询中,查询条件存在的个数不确定。如,SELECT * FROM user WHERE username LIKE '%明%' AND sex = '1';

为了能够动态拼接sql语句可以采用以下方式:

UserMapper.xml

<select id="findUserByUserNameAndSex" parameterType="cn.itheima.pojo.User" resultType="cn.itheima.pojo.User">\
   SELECT * FROM user<!-- where标签作用:会自动向sql语句中添加where关键字会去掉第一个条件的and语句--><where><if test="username != null and username != ''">AND username LIKE '%${username}%'</if><if test="sex != null and sex != ''">AND sex=#{sex}</if></where></select>

where标签下的查询条件放在findUserByUserNameAndSex中,只能在该范围内使用。为了实现代码的重用性,通常将查询条件放在外面,由不同的查询共同调用。

  <sql id="user_where"><where><if test="username != null and username != ''">AND username LIKE '%${username}%'</if><if test="sex != null and sex != ''">AND sex=#{sex}</if></where></sql>
<select id="findUserByUserNameAndSex" parameterType="cn.itheima.pojo.User" resultType="cn.itheima.pojo.User">SELECT * FROM user<!-- 调用sql条件 --><include refid="user_where"></include></select>    

UserMapper.java中编写接口

List<User> findUserByUserNameAndSex(User user);

测试

    @Testpublic void testFindUserByUserNameAndSex() throws Exception {SqlSession session = sqlSessionFactory.openSession();UserMapper userMapper = session.getMapper(UserMapper.class);User user = new User();user.setUsername("明");user.setSex("1");List<User> userList = userMapper.findUserByUserNameAndSex(user);System.out.println(userList);}

 

二、foreach标签的使用

需求:SQL语句中,SELECT * FROM user WHERE id IN (1,15,22,28);为了从service层接收多个id值,然后使用foreach标签动态拼接多个id值组成完整的SQL语句。

UserMapper.xml

 

    <select id="findUserByIds" parameterType="cn.itheima.pojo.QueryVO" resultType="cn.itheima.pojo.User">SELECT * FROM user<where><if test="ids != null"><!--foreach:循环传入的集合参数collection:传入的集合的变量名称item:每次循环将循环出的数据放入这个变量open:循环开始拼接的字符串close:循环结束拼接的字符串separator:循环中拼接的分隔符--><foreach collection="ids" item="id" open=" id IN (" close=")" separator=",">#{id}</foreach></if></where></select>

 QueryVO.java

package cn.itheima.pojo;import java.util.List;public class QueryVO {private List<Integer> ids;public List<Integer> getIds() {return ids;}public void setIds(List<Integer> ids) {this.ids = ids;}
}

多个id值可以通过QueryVO类传递给DAO层。

UserMapper.java接口中编写接口

List<User> findUserByIds(QueryVO vo);

测试

    @Testpublic void testFindUserByIds() throws Exception {SqlSession session = sqlSessionFactory.openSession();UserMapper userMapper = session.getMapper(UserMapper.class);QueryVO vo = new QueryVO();List<Integer> ids = new ArrayList<Integer>();ids.add(1);ids.add(15);ids.add(22);ids.add(28);vo.setIds(ids);List<User> userList = userMapper.findUserByIds(vo);System.out.println(userList);}

 

转载于:https://www.cnblogs.com/binaway/p/9160258.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/366842.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

为什么Vue不能观察到数组length的变化?

官网解释如下 由于 JavaScript 的限制&#xff0c;Vue 不能检测以下变动的数组&#xff1a; 当你利用索引直接设置一个项时&#xff0c;例如&#xff1a;vm.items[indexOfItem] newValue 当你修改数组的长度时&#xff0c;例如&#xff1a;vm.items.length newLength 因为vue…

规则引擎drools的简单使用

规则引擎适用于有复杂多变的规则&#xff0c;如商品满减、积分赠送、考勤规则等 一、引入maven依赖 <dependency><groupId>org.drools</groupId><artifactId>drools-core</artifactId><version>7.13.0.Final</version> </depende…

使用MongoDB进行乐观锁定重试

在我以前的文章中&#xff0c;我谈到了对MongoDB批处理程序采用乐观锁定的好处。 如我之前所写&#xff0c;乐观锁异常是可恢复的异常&#xff0c;只要我们获取最新的Entity&#xff0c;我们就会对其进行更新并保存。 因为我们使用的是MongoDB&#xff0c;所以我们不必担心本地…

cx oracle 配置,cx_Oracle的配置啊。。终于搞出来了

参考。。http://www.blogjava.net/jelver/articles/294583.htmlhttp://shanchao7932297.blog.163.com/blog/static/1363624200710911543428/http://aofengblog.blog.163.com/blog/static/6317021201157111336764/http://www.cnblogs.com/ysisl/archive/2010/12/20/1911870.html…

JavaScript中发布/订阅模式的理解

订阅发布模式的介绍 发布订阅模式&#xff0c;它定义了一种一对多的关系&#xff0c;可以使多个观察者对象对一个主题对象进行监听&#xff0c;当这个主题对象发生改变时&#xff0c;依赖的所有对象都会被通知到。 在生活中我们常常遇到这样一种情况&#xff0c;我们在使用新…

java的list遍历

for(String str : list) {//增强for循环&#xff0c;其内部实质上还是调用了迭代器遍历方式&#xff0c;这种循环方式还有其他限制&#xff0c;不建议使用。System.out.println(str); } for( int i 0 ; i < list.size() ; i) {//普通for循环&#xff0c;内部不锁定&#xf…

Spring Data Solr入门

Spring Data Solr是Spring Data项目的扩展&#xff0c;该项目旨在简化Apache Solr在Spring应用程序中的使用。 请注意&#xff0c;这不是Spring&#xff08;数据&#xff09;或Solr的简介。 我认为您至少对这两种技术都有一些基本的了解。 在下面的文章中&#xff0c;我将展示如…

一个关于fixed抖动的小bug

前言 大家都知道position: fixed用于生成绝对定位的元素&#xff0c;相对于浏览器窗口进行定位。 元素的位置通过 "left", "top", "right" 以及 "bottom" 属性进行规定。 突然发现自己之前写的网页有个小bug&#xff1a;在购买页面的…

BBS论坛(十八)

18.首页轮播图实现 &#xff08;1&#xff09;front/css/front_base.css .main-container{width: 990px;margin: 0 auto;overflow: hidden; } .lg-container{width: 730px;float:left; } .sm-container{width: 250px;float:right; } &#xff08;2&#xff09;front_base.html …

eureka-7-多网卡下的ip选择

目前没有需求,后面需要的话&#xff0c;再补充 只是简单使用的话&#xff0c;只需要指定ip即可 eureka.instance.ip-address:127.0.0.1转载于:https://www.cnblogs.com/wenq001/p/9884591.html

Java DB中的Java用户定义类型(UDT)

Java DB是基于Java编程语言和SQL的关系数据库管理系统。 这是Apache软件基金会的开源Derby项目的Oracle版本。 Java SE 7 SDK中包含Java DB。 用户定义类型&#xff08;UDT&#xff09;是Java类&#xff0c;其实例&#xff08;对象&#xff09;存储在数据库表列中。 UDT定义为…

php 字符串与数字相加,注意!PHP中字符串与数字的比较

在日常开发过程中&#xff0c; 运算符是我们每天都会接触到的。这个运算符中其实埋了非常多的坑&#xff0c;今天我们就来看下字符串和数字用比较需要注意的问题。首先来看看这些代码&#xff1a;echo "1234" " 1234" is . (1234 1234), PHP_EOL;echo …

腾讯Node.js基础设施TSW正式开源

经过六年的迭代与沉淀&#xff0c;腾讯Tencent Server Web (以下简称TSW)这一公司级运维组件于今日正式开源。TSW是面向WEB前端开发者&#xff0c;以提升问题定位效率为初衷&#xff0c;提供云抓包、全息日志和异常发现的Node.js基础设施。TSW每天为百亿次请求提供稳定服务&…

Luogu P1535 【游荡的奶牛】

搜索不知道为什么没有人写bfs觉得挺像是标准个bfs的 状态因为要统计次数&#xff0c;不能简单地跳过一个被经过的点这样的话&#xff0c;状态量会爆炸采用记忆化设dp[i][j][k]表示在第k分钟到达点(i,j)的方案数以地点时间作为状态避免同一状态被反复拓展这样&#xff0c;状态量…

ORM框架greenDao 2 (用于了解旧版本的使用方法,目前最新版本为3.2.2,使用注释的方式来生成)...

摘要&#xff1a; Android中对SQLite数据库使用&#xff0c;是一件非常频繁的事情。现今&#xff0c;也有非常多的SQLite处理的开源框架&#xff0c;其中最著名的greenDao&#xff0c;它以占用资源少&#xff0c;处理效率高等特点&#xff0c;成为优秀的ORM框架之一。那么对于g…

配置MySQL以进行ADF开发

大家好。 今天&#xff0c;我将向您展示如何为Oracle ADF开发配置MySQL数据库。 恕我直言&#xff0c;当您将ADF与其他数据库而不是Oracle DB一起使用时&#xff0c;您将无法使用Oracle ADF的全部功能&#xff0c;有时您会发现自己正在寻找解决方法&#xff0c;以实现某些行为…

linux 强行杀死进程,Linux如何查看进程、杀死进程、启动进程等常用命令

查进程杀进程使用kill命令结束进程&#xff1a;常用&#xff1a;Linux下还提供了一个killall命令&#xff0c;可以直接使用进程的名字而不是进程标识号&#xff0c;例如&#xff1a;进入到进程的执行文件所在的路径下&#xff0c;执行文件 ./文件名附&#xff1a;修改文件日期命…

React Native面试知识点

本文原创首发于公众号&#xff1a;ReactNative开发圈&#xff0c;转载需注明出处。 本文会不定期不断更新&#xff0c;想查看最新版本请移步至https://github.com/forrest23/react-native-interview 1.React Native相对于原生的ios和Android有哪些优势&#xff1f; 1.性能媲美…

KIE-WB / JBPM控制台Ng –配置

大家好&#xff0c;这是我上一篇文章中有关如何使用jBPM Console的后续文章 。 这篇文章的主要思想是描述为了在您自己的公司中使用它&#xff0c;您需要对jBPM Console NG进行一些最常见的配置。 但是在讨论技术细节之前&#xff0c;我们将介绍KIE Workbench&#xff08;KIE-W…

EasyUI常用控件禁用方法

来自&#xff1a;http://blog.csdn.net/jin_guang/article/details/36905387 特此感谢 1.validatebox可以用的用法:前两种适用于单个的validatebox; 第三种应用于整个form里面的输入框; <1>.$("#id").attr("readonly", true); ----- $("#id…