05_mybatis动态sql
1.sql片段
1.sql片段****
mybatis核心 对sql语句进行灵活操作,通过表达式进行判断,对sql进行灵活拼接、组装。
2.需求
用户信息综合查询列表和用户信息查询列表总数这两个statement的定义使用动态sql。
对查询条件进行判断,如果输入参数不为空才进行查询条件拼接。
3.定义sql片段**
<!--定义sql片段-->
<!--id:标识sql片段-->
<!--经验:基于单表来定义sql片段,这样可以提高可重用性,一般不要包含where-->
<sql id="query_user_where">
<!--where 可以去掉条件中的第一个and-->
<if test="userCustom!=null">
<if test="userCustom.sex!=null and userCustom.sex!=''">
and user.sex=#{userCustom.sex}
</if>
<if test="userCustom.username!=null and userCustom.username!=''">
and user.username like '%${userCustom.username}%'
</if>
</if>
</sql>
4.引用sql片段
<select id="findUserList" parameterType="UserQueryVo" resultType="UserCustom">
select * from user
<where>
<!-- 引用sql片段,如果不在同一个mapper文件中,这时要加namespace-->
<include refid="query_user_where"/>
</where>
</select>
2.foreach
1.需求
在用户查询列表和查询总数的statement中增加多个id输入查询。
sql语句如下:
两种方法:
SELECT * FROM USER WHERE id=1 OR id=10 OR id=16
<!-- 法2-->
SELECT * FROM USER WHERE id IN(1,10,16)
2.在输入参数类型中添加List ids传入多个id**
/**
* Description: 查询时,将多个对象的属性集合在此类
* User: jiatp
* Date:2019/9/3 0003 下午 4:39
*/
public class UserQueryVo {
//用户的查询条件
private UserCustom userCustom;
//传入多个id
private List<Integer> ids;
//可以包装其它信息,商品,订单 等
public List<Integer> getIds() {
return ids;
}
public void setIds(List<Integer> ids) {
this.ids = ids;
}
public UserCustom getUserCustom() {
return userCustom;
}
public void setUserCustom(UserCustom userCustom) {
this.userCustom = userCustom;
}
}
3.修改mapper.xml
<!--定义sql片段-->
<!--id:标识sql片段-->
<!--经验:基于单表来定义sql片段,这样可以提高可重用性,一般不要包含where-->
<sql id="query_user_where">
<!--where 可以去掉条件中的第一个and-->
<if test="userCustom!=null">
<if test="userCustom.sex!=null and userCustom.sex!=''">
and user.sex=#{userCustom.sex}
</if>
<if test="userCustom.username!=null and userCustom.username!=''">
and user.username like '%${userCustom.username}%'
</if>
<if test="ids!=null">
<!--<foreach collection="ids" open="and (" close=")" item="user_id" separator="or">-->
<!--id=#{user_id}-->
<!--</foreach>-->
<foreach collection="ids" open="and id in(" close=")" item="user_id" separator=",">
#{user_id}
</foreach>
</if>
</if>
</sql>
4.测试代码
//综合查询,用户的所有信息 foreach
@Test
public void findUserListForEach(){
SqlSession sqlSession = sqlSessionFactory.openSession();
UserQueryVoMapper mapper = sqlSession.getMapper(UserQueryVoMapper.class);
//创建包装对象
UserQueryVo userQueryVo = new UserQueryVo();
UserCustom userCustom = new UserCustom();
//由于设置了动态sql
userCustom.setSex("1");
//userCustom.setUsername("李四");
userQueryVo.setUserCustom(userCustom);
//加入多个id进行查询
List<Integer> ids = new ArrayList<Integer>();
ids.add(1);
ids.add(10);
ids.add(22);
userQueryVo.setIds(ids);
//调用查询
List<UserCustom> userList = mapper.findUserList(userQueryVo);
for(UserCustom us:userList) {
System.out.println(us);
}
}
}
持续补充中…
05_mybatis动态sql的更多相关文章
- 值得注意的ibatis动态sql语法格式
一.Ibatis常用动态sql语法,简单粗暴用一例子 <select id="iBatisSelectList" parameterClass="java.util ...
- Mysql - 游标/动态sql/事务
游标这个在我目前的项目里面用的还不多, 但是其功能还是很强大的. 动态sql以前都没用过, 是跟着富士康(不是张全蛋的富土康哦)过来的同事学的. 还是挺好用的. 我的数据库方面, 跟他学了不少. 在此 ...
- MyBatis4:动态SQL
什么是动态SQL MyBatis的一个强大特性之一通常是它的动态SQL能力.如果你有使用JDBC或其他相似框架的经验,你就明白条件串联SQL字符串在一起是多么地痛苦,确保不能忘了空格或者在列表的最后的 ...
- 分享公司DAO层动态SQL的一些封装
主题 公司在DAO层使用的框架是Spring Data JPA,这个框架很好用,基本不需要自己写SQL或者HQL就能完成大部分事情,但是偶尔有一些复杂的查询还是需要自己手写原生的Native SQL或 ...
- MySQL存储过程动态SQL语句的生成
用Mysql存储过程来完成动态SQL语句,使用存储过程有很好的执行效率: 现在有要求如下:根据输入的年份.国家.节假日类型查询一个节假日,我们可以使用一般的SQL语句嵌入到Java代码中,但是执行效率 ...
- 【Java EE 学习 79 下】【动态SQL】【mybatis和spring的整合】
一.动态SQL 什么是动态SQL,就是在不同的条件下,sql语句不相同的意思,曾经在“酒店会员管理系统”中写过大量的多条件查询,那是在SSH的环境中,所以只能在代码中进行判断,以下是其中一个多条件查询 ...
- 自定义函数执行动态sql语句
--函数中不能调用动态SQL,使用用存储过程吧.如果还要对函数做其他操作,换成存储过程不方便,可以考虑把其他操作一起封装在存储过程里面.如: create proc [dbo].[FUN_YSCL ...
- mybatis入门基础(五)----动态SQL
一:动态SQL 1.1.定义 mybatis核心对sql语句进行灵活操作,通过表达式进行判断,对sql进行灵活拼接.组装. 1.2.案例需求 用户信息综合查询列表这个statement的定义使用动态s ...
- mybatis 动态sql表达式相关应用
一.mybatis 表达式简介 对于mybatis3 ,提供了一种动态sql的方式.通过动态sql我们可以直接在mybatis 的xm映射文件中直接通过条件判断的方式进行查询添加的拼接.mybatis ...
随机推荐
- leetcode-126-单词接龙
题目描述: class Solution: def findLadders(self, beginWord: str, endWord: str, wordList: list) -> list ...
- JUC 一 CountDownLatch(闭锁)
java.util.concurrent 介绍 CountDownLatch是一个同步辅助类,在完成一组正在其他线程中执行的操作之前,它允许一个或多个线程一直等待 CountDownLatch cou ...
- SXOI2018酱油记
Day 0: 嗯前一天刚听说要去参加省选(可能以前也说了不过没听见),作为弱省高一的蒟蒻准备去打打酱油.下午去五中试机啥也没敲晃荡一圈又回去了.今年来也就是打打酱油心情自然是很平静,真不知道明年现在我 ...
- AtCoder ARC061E Snuke's Subway Trip 最短路
目录 Catalog Solution: (有任何问题欢迎留言或私聊 && 欢迎交流讨论哦 Catalog Problem:传送门 Portal 原题目描述在最下面. \(n(1 ...
- mysql开启操作日志(包含所有操作)
配置 方法一:设置配置文件my.cnf(需重启) 添加以下参数 [mysqld] log_output=FILE # 日志打印到文件,默认配置,可以配置成table,日志就会记录到mysql库中的相应 ...
- 2019 USP Try-outs 练习赛
// 好久没更博客了,最近打了很多场练习赛&校内PK赛,大概自闭忙于补题吧 // 9.26 周四练习赛 A. Kolkhozy 题意 有 n 个数 \(f[i]\) ,有 q 次询问(l, r ...
- anjs 分词器初步使用
由于ik没有歧义分词的功能,打算用anjs 对前端传递过来的数据用anjs进行分词 anjs 操作文档官网地址:http://nlpchina.github.io/ansj_seg/ 刚刚开始由于ja ...
- 如何提高阿里云cdn命中率?原命中率极低。
博客搬迁了,给你带来的不便,敬请谅解! http://www.suanliutudousi.com/2017/08/29/%E5%A6%82%E4%BD%95%E6%8F%90%E9%AB%98%E9 ...
- 分享一套高级Java笔试题(实拍高清图)
分享一套高级Java笔试题 微信群里群友分享的 刚好他在笔试 有些问题不会发到群里求助 如果你最近正好在面试 需要参考需要提升 这套试题或许对你有用 下面是部分分享原图 下面是微信群中群友的热议 非常 ...
- StringUtils里的isEmpty和isBlank的区别
这边首先以一个简单的测试代码来解释这两者的区别: @Test void stringTest(){ String a = " "; boolean empty = StringUt ...