Mybatis动态sql的使用

通过mybatis提供的各种标签方法实现动态拼接sql。

为什么用if标签?

UserMapper.xml配置sql,如下:

<!-- 根据条件查询用户 -->
<select id="queryUserByWhere" parameterType="user" resultType="user">SELECT id, username, birthday, sex, address FROM `user`WHERE sex = #{sex} AND username LIKE'%${username}%'
</select>

Mapper接口

List<User> queryUserByWhere(User user);

测试方法
测试方法:

@Test
public void testQueryUserByWhere() {// mybatis和spring整合,整合之后,交给spring管理SqlSession sqlSession = this.sqlSessionFactory.openSession();// 创建Mapper接口的动态代理对象,整合之后,交给spring管理UserMapper userMapper = sqlSession.getMapper(UserMapper.class);// 使用userMapper执行根据条件查询用户User user = new User();user.setSex("1");user.setUsername("张");List<User> list = userMapper.queryUserByWhere(user);for (User u : list) {System.out.println(u);}// mybatis和spring整合,整合之后,交给spring管理sqlSession.close();
}

此时的测试结果是正常的,如果注释掉 user.setSex(“1”),那么输出的结果为空,因为我们的where中必须同时去匹配sex与username如果我们想通过其中任意一个查询数据库结果,那么又需要分别添加两个SQL语句代码,那么如果有多个条件呢?是不是每次都要重新添加,显然之前这种方式是不靠谱的,因为引入动态sql的if标签可以解决此问题。

使用if标签

注意:字符串类型的数据需要要做不等于空字符串校验。
and放在sex或者username的前面是合法的,如果前面没有条件会自动把and去掉,如果放在条件后面不会自动去掉,可能造成异常!
where 1=1是sql语句条件逻辑判断表达式,由于1=1成立,恒为真,该表达式1=1将始终返回”真”。
改造UserMapper.xml

<!-- 根据条件查询用户 -->
<select id="queryUserByWhere" parameterType="user" resultType="user">SELECT id, username, birthday, sex, address FROM `user`WHERE 1=1<if test="sex != null and sex != ''">AND sex = #{sex}</if><if test="username != null and username != ''">AND username LIKE'%${username}%'</if>
</select>

Where标签

上面的sql还有where 1=1 这样的语句,很麻烦
可以使用where标签进行改造
改造UserMapper.xml,如下

<!-- 根据条件查询用户 -->
<select id="queryUserByWhere" parameterType="user" resultType="user">SELECT id, username, birthday, sex, address FROM `user`
<!-- where标签可以自动添加where,同时处理sql语句中第一个and关键字 --><where><if test="sex != null">AND sex = #{sex}</if><if test="username != null and username != ''">AND username LIKE'%${username}%'</if></where>
</select>

sql片段使用

Sql中可将重复的sql提取出来,使用时用include引用即可,最终达到sql重用的目的。

把上面例子中的id, username, birthday, sex, address提取出来,作为sql片段,如下:
注意:申明用sql标签使用用include和里面的refid属性

<!-- 根据条件查询用户 -->
<select id="queryUserByWhere" parameterType="user" resultType="user"><!-- SELECT id, username, birthday, sex, address FROM `user` --><!-- 使用include标签加载sql片段;refid是sql片段id -->SELECT <include refid="userFields" /> FROM `user`<!-- where标签可以自动添加where关键字,同时处理sql语句中第一个and关键字 --><where><if test="sex != null">AND sex = #{sex}</if><if test="username != null and username != ''">AND username LIKE'%${username}%'</if></where>
</select><!-- 声明sql片段 -->
<sql id="userFields">id, username, birthday, sex, address
</sql>

如果要使用别的Mapper.xml配置的sql片段,可以在refid前面加上对应的Mapper.xml的namespace
这里写图片描述

foreach标签


向sql传递数组或List,mybatis使用foreach解析,如下:

根据多个id查询用户信息
查询sql:
SELECT * FROM user WHERE id IN (1,10,24)
QueryVo类
如下图在pojo中定义list属性ids存储多个用户id,并添加getter/setter方法

package com.itheima.mybatis.pojo;import java.io.Serializable;
import java.util.List;
/*** new Message* @author lx**/
public class QueryVo implements Serializable {/*** */private static final long serialVersionUID = 1L;//private User user;List<Integer> idsList;Integer[] ids;public List<Integer> getIdsList() {return idsList;}public void setIdsList(List<Integer> idsList) {this.idsList = idsList;}public Integer[] getIds() {return ids;}public void setIds(Integer[] ids) {this.ids = ids;}public User getUser() {return user;}public void setUser(User user) {this.user = user;}}

Mapper.xml文件
UserMapper.xml添加sql,如下:

<!-- 根据ids查询用户 -->
<select id="queryUserByIds" parameterType="queryVo" resultType="user">SELECT * FROM `user`<where><!-- foreach标签,进行遍历 --><!-- collection:遍历的集合,这里是QueryVo的ids属性 --><!-- item:遍历的项目,可以随便写,,但是和后面的#{}里面要一致 --><!-- open:在前面添加的sql片段 --><!-- close:在结尾处添加的sql片段 --><!-- separator:指定遍历的元素之间使用的分隔符 --><foreach collection="ids" item="item" open="id IN (" close=")"separator=",">#{item}</foreach></where>
</select>

测试方法:

@Test
public void testQueryUserByIds() {// mybatis和spring整合,整合之后,交给spring管理SqlSession sqlSession = this.sqlSessionFactory.openSession();// 创建Mapper接口的动态代理对象,整合之后,交给spring管理UserMapper userMapper = sqlSession.getMapper(UserMapper.class);// 使用userMapper执行根据条件查询用户QueryVo queryVo = new QueryVo();List<Integer> ids = new ArrayList<>();ids.add(1);ids.add(10);ids.add(24);queryVo.setIds(ids);List<User> list = userMapper.queryUserByIds(queryVo);for (User u : list) {System.out.println(u);}// mybatis和spring整合,整合之后,交给spring管理sqlSession.close();
}

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

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

相关文章

面向对象设计之CRC卡片

1.什么是 CRC card&#xff1f; CRC (Class-Responsibility-Collaborator) Card是目前比较流行的面向对象分析建模方法。在CRC建模中&#xff0c;用户、设计者、开发人员都有参与&#xff0c;完成对整个面向对象工程的设计。 CRC卡是一个标准索引卡集合&#xff0c;包括三个部分…

川藏线徒搭

http://www.mafengwo.cn/i/6296156.html

删数问题

Problem Description 键盘输入一个高精度的正整数n&#xff08;≤100位&#xff09;&#xff0c;去掉其中任意s个数字后剩下的数字按照原来的左右次序组成一个新的正整数。编程对给定的n与s&#xff0c;寻找一种方案&#xff0c;使得剩下的数字组成的新数最小。Input 输入有多组…

面试70问 经典回答

http://group.cnblogs.com/topic/37628.html

Mybatis整合spring

整合思路 1、SqlSessionFactory对象应该放到spring容器中作为单例存在。 2、传统dao的开发方式中&#xff0c;应该从spring容器中获得sqlsession对象。 3、Mapper代理形式中&#xff0c;应该从spring容器中直接获得mapper的代理对象。 4、数据库的连接以及数据库连接池事务…

最少拦截系统

某国为了防御敌国的导弹袭击,发展出一种导弹拦截系统.但是这种导弹拦截系统有一个缺陷:虽然它的第一发炮弹能够到达任意的高度,但是以后每一发炮弹都不能超过前一发的高度.某天,雷达捕捉到敌国的导弹来袭.由于该系统还在试用阶段,所以只有一套系统,因此有可能不能拦截所有的导弹…

云计算的理解

原文&#xff1a;http://www.chinacloud.cn/show.aspx?id15917&cid17 老叟发现&#xff0c;即使是一些搞计算机的人&#xff0c;也不了解“云”是什么。于是&#xff0c;俺卖车之余就写了一篇科普&#xff1a; 到底什么是云(云计算) 有很多关于云的介绍。然而&#xff0c;…

什么是Springmvc以及如果编写第一个入门程序

Spring web mvc和Struts2都属于表现层的框架,它是Spring框架的一部分,我们可以从Spring的整体结构中看得出来,如下图&#xff1a; Springmvc处理流程 入门程序 创建web工程 springMVC是表现层框架&#xff0c;需要搭建web工程开发。 如下图创建动态web工程&#xff1a; 输入…

迷瘴

Problem Description 通过悬崖的yifenfei&#xff0c;又面临着幽谷的考验—— 幽谷周围瘴气弥漫&#xff0c;静的可怕&#xff0c;隐约可见地上堆满了骷髅。由于此处长年不见天日&#xff0c;导致空气中布满了毒素&#xff0c;一旦吸入体内&#xff0c;便会全身溃烂而死。幸好y…

驳斥《沙盒用于数据防泄密是重大技术原理性失误》

http://blog.ifeng.com/article/30786929.html 最近网上出现了一篇名为《沙盒用于数据防泄密是重大技术原理性失误》的文章&#xff0c;经作者鉴定&#xff0c;是某不良公司攻击技术领先的竞争对手苏州深信达公司的软文。该公司为何主动公开攻击竞争对手&#xff0c;可能和最近…

windows驱动开发学习

序言] 很多人都对驱动开发有兴趣,但往往找不到正确的学习方式.当然这跟驱动开发的本土化资料少有关系.大多学的驱动开发资料都以英文为主,这样让很多驱动初学者很头疼.本人从事驱动开发时间不长也不短,大概也就3~4年时间.大多数人都认为会驱动开发的都是牛人,高手之类的.其实高…

Springmvc架构详解

框架结构 框架结构如下图&#xff1a; 架构流程 1、 用户发送请求至前端控制器DispatcherServlet 2、 DispatcherServlet收到请求调用HandlerMapping处理器映射器。 3、 处理器映射器根据请求url找到具体的处理器&#xff0c;生成处理器对象及处理器拦截器(如果有则生成)一…

区间覆盖问题

用i来表示x坐标轴上坐标为[i-1&#xff0c;i]的长度为1的区间&#xff0c;并给出n&#xff08;1≤n≤200&#xff09;个不同的整数&#xff0c;表示n个这样的区间。 现在要求画m条线段覆盖住所有的区间&#xff0c;条件是&#xff1a;每条线段可以任意长&#xff0c;但是要求所…

Windows驱动开发如何入门

http://blog.csdn.net/charlessimonyi/article/details/50904854 http://blog.csdn.net/charlessimonyi/article/details/50904956

springmvc整合mybatis之准备阶段与文件配置

文章出处&#xff1a;课程资料 web.xml等配置文件的解释&#xff1a;打开博客 为了更好的学习 springmvc和mybatis整合开发的方法&#xff0c;需要将springmvc和mybatis进行整合。 整合目标&#xff1a;控制层采用springmvc、持久层使用mybatis实现。 步骤详解&#xff1a; …

悼念512汶川大地震遇难同胞

Problem Description 时间&#xff1a;2008年5月16日&#xff08;震后第4天&#xff09; 地点&#xff1a;汶川县牛脑寨人物&#xff1a;羌族老奶奶【转载整理】牛脑寨是一个全村600多人的羌族寨子&#xff0c;震后几天&#xff0c;这里依然能常常听到隆隆的声音&#xff0c;那…

Win10下VS2015(WDK10)驱动开发环境配置

1、 概述 微软在”WDK7600“以后就不再提供独立的内核驱动开发包了&#xff0c;而是必须首先安装微软集成开发环境VisualStudio&#xff0c;然后再从微软官网下载集成的WDK开发包、或者离线安装包&#xff0c;但是安装后Visual Studio就集驱动程序开发&#xff0c;编译&…

懒虫小鑫

roblem Description 小鑫是个大懒虫&#xff0c;但是这一天妈妈要小鑫去山上搬些矿石去城里卖以补贴家用。小鑫十分的不开心。不开心归不开心&#xff0c;小鑫还是要做这件事情的。我们把这个事情简化一下。有n块矿石&#xff0c;设第i块矿石由两个数字wi和pi表示。分别表示这块…

springmvc与mybatis整合之实现商品列表

需求 实现商品查询列表&#xff0c;从mysql数据库查询商 品信息。. DAO开发 使用逆向工程&#xff0c;生成代码 注意修改逆向工程的配置文件 ItemService接口 public interface ItemService {/*** 查询商品列表* * return*/List<Item> queryItemList();}. ItemServi…

中断处理程序与中断服务例程

版权声明&#xff1a;本文为博主原创文章&#xff0c;未经博主允许不得转载。 目录(?)[-] 1 什么是中断2中断处理程序3中断服务例程4request_irq函数分析 1. 什么是中断 简单来说中断就是硬件设备与处理器的一种交流方式&#xff0c;比如当我按下一个键时&#xff0c;只有当处…