MyBatis的动态SQL语句

2023-11-01

1. 动态SQL之<if>标签

我们根据实体类的不同取值,使用不同的SQL语句来进行查询。比如在id如果不为空时可以根据id查询,如果username不为空时还要加入用户名作为条件,这种情况在我们的多条件组合查询中经常会碰到。

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.joker.dao.IUserDao">
	
	<select id="findByUser" resultType="user" parameterType="user">
		select * from user where 1=1
		<if test="username!=null and username != '' ">
			and username like #{username}
		</if>
		<if test="address != null">
			and address like #{address}
		</if>
	</select>
</mapper>

注意:<if>标签的test属性中写的是对象的属性名,如果是包装类的对象要使用OGNL表达式的写法。另外要注意where 1=1的作用。

2. 动态SQL之<where>标签

为了简化上面where 1=1的条件拼装,我们可以采用<where>标签来简化开发。

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.joker.dao.IUserDao">
	
	<select id="findByUser" resultType="user" parameterType="user">
		select * from user
		<where>
			<if test="username!=null and username != '' ">
				and username like #{username}
			</if>
			<if test="address != null">
				and address like #{address}
			</if>
		</where>
	</select>
</mapper>

3. 动态SQL之<foreach>标签

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.joker.dao.IUserDao">
	
	<!-- 查询所有用户在 id的集合之中 
		foreach标签:用于遍历集合
			* collection:代表要遍历的集合元素,注意编写时不要写 #{}
			* open:代表语句的开始部分
			* close:代表结束部分
			* item:代表遍历集合的每个元素,生成的变量名
			* sperator:代表分隔符
	-->
	<select id="findInIds" resultType="user" parameterType="queryvo">
		select * from user
		<where>
			<if test="ids != null and ids.size() > 0">
				<foreach collection="ids" open="id in ( " close=")" item="uid" separator=",">
					#{uid}
				</foreach>
			</if>
		</where>
	</select>
</mapper>

4. MyBatis中的SQL片段

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

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.joker.dao.IUserDao">
	
	<!-- 抽取重复的语句代码片段 -->
	<sql id="defaultSql">
		select * from user
	</sql>

	<select id="findAll" resultType="user">
		<include refid="defaultSql"></include>
	</select>
	
	<select id="findById" resultType="User" parameterType="int">
		<include refid="defaultSql"></include>
		where id = #{uid}
	</select>

</mapper>
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

MyBatis的动态SQL语句 的相关文章

随机推荐

  • Kylin ext3/4 xfs手动扩容根分区

    1 环境 云平台 兼容OpenStack Queens的发行版 HOST OS Kylin Server 10 SP1 Release Build20 20210518 arm64 虚拟机镜像ISO Kylin Server V10 GFB
  • Flask-模板

    视图函数的作用是生成请求的响应 但是直接在视图函数里处理业务逻辑和表现逻辑 会显的代码混乱 可以把表现逻辑移到模板中 模板是包含响应文本的文件 其中包含用占位变量表示的动态部分 其具体值只在请求的上下文中才能知道 使用真实值替换变量 再返回
  • IT行业相关技术介绍

    IT行业常见技术体系 一 前端开发 前端开发是创建WEB页面 网页 或APP等前端界面呈现给用户的过程 通过HTML CSS JavaScript以及衍生出来各种技术 框架 来实现互联网产品的用户界面交互 1 核心技术 1 HTML 网页的
  • Gitlab详细使用说明

    1 下载安装 下载gitlab和安装就不用详细说了 下载可以到官网下载 官网下载速度慢的 可以到我网盘下载 网盘地址链接 https pan baidu com s 1LZ6wq0PZNyB5SzGAzd74ew 提取码 uccq 2 使用
  • Vant库的使用,及日期组件的一些注意点

    Vant库对于开发商城类项目 真的是非常nice 会让你情不自禁爱上它 Vant库支持按需加载 为移动端商城设计的风格 非常完美 但是 本人在实际开发中 也遇到了一些小问题 折腾了老半天 最终得以解决 下面先说说在vue中使用Vant库的流
  • 小米2022春招内推

    小米2022春招内推 内推码 DSpvRGae 登录小米招聘官网http campus hr xiaomi com 投递简历时填入内推码 或者直接微信扫描下方二维码投递 2022春季补招或2023届实习可投递 岗位类型 研发 产品 设计 运
  • 【Python】Pycharm中The file size exceeds the configured limit 的解决方法

    文章目录 问题描述 解决方案 问题描述 用PyCharm打开较大文件的时候 出现错误提示 The file size 11 42 MB exceeds the configured limit 2 56 MB Code insight fe
  • 数据结构与算法—二分查询

    一 二分查询的概念 二 算法思想 程序的非递归实现 int binaryFind int nums int n int key int left 0 right n 1 int mid 0 int pos 1 while left lt r
  • Python实现双端队列

    Python实现双端队列 关于双端队列的介绍 请参考 https blog csdn net weixin 43790276 article details 104033337 双端队列的数据存储结构可以是顺序表 也可以是链表 本篇文章使用
  • java计算机毕业设计基于springboo+vue的准妈妈孕期育儿婴幼儿交流平台

    项目介绍 随着科学技术的飞速发展 社会的方方面面 各行各业都在努力与现代的先进技术接轨 通过科技手段来提高自身的优势 准妈妈孕期交流平台当然也不能排除在外 准妈妈孕期交流平台是以实际运用为开发背景 运用软件工程原理和开发方法 采用sprin
  • Python学习----不同分类器的Calibration比较

    Well calibrated classifiers are probabilistic classifiers for which the output of predict proba can be directly interpre
  • Visual C++ 6.0 如何添加一个对话框

    1 创建一个MFC单文档应用程序 2 为IDR MAIN FRAME主窗口添加新的菜单 关于 介绍 其中介绍菜单ID ID TELL 3 添加一个新的对话框IDD DIALOG1 并为它添加一个类 类名为Tell 4 为菜单 介绍 添加消息
  • 程序员去大公司面试,Java岗大厂面试官常问的那些问题,进阶学习

    前言 这段时间一直在学习Netty相关知识 因为涉及知识点比较多 也走了不少弯路 目前网上关于Netty学习资料琳琅满目 不知如何下手 其实大家都是一样的 学习方法和技巧都是总结出来的 我们在没有找到很好的方法之前不如按部就班先从基础开始
  • 我希望我知道的七个JavaScript技巧 译(转)

    23 April 2014 如果你是一个JavaScript新手或仅仅最近才在你的开发工作中接触它 你可能感到沮丧 所有的语言都有自己的怪癖 quirks 但从基于强类型的服务器端语言转移过来的开发人员可能会感到困惑 我就曾经这样 几年前
  • networkx报错:TypeError: object of type 'dictionary-keyiterator' has no len()

    TypeError object of type dictionary keyiterator has no len 这是networkx1 x和network2 x不同导致的 在node集合的基础上加list 即可 更多 https bl
  • Sigmoid激活函数和ReLU激活函数的区别:

    Sigmoid激活函数和ReLU激活函数的区别 特性 Sigmoid 激活函数 ReLU 激活函数 梯度弥散 只有在0附近的时候有比较好的激活性 在正负饱和区 其梯度都接近于0 导致梯度弥散 在大于0的部分梯度为常数 不会出现梯度弥散 单侧
  • 第一篇:UE4如何输出全景图,和自定义截图

    首先 向大家介绍一下UE4的两种输出全景图的方法 一种是利用UE4自带的输出插件 一种是NVIDIA的插件 一 UE4自带插件 1 打开Edit gt Plugins 选择Stereo Panoramic Movie Capture插件导入
  • QT 学习之键盘事件( keyPressEvent)

    Qt keyPressEvent keyPressEvent是QWidget里面的函数 所以凡是继承自QWidget的类都可以通过实现这个函数来完成对按键事件的响应 要让当前的widget能够响应按键事件 最先需要做的事情是 调用 setF
  • golang知识点

    一 Go的GC机制 1 Go的垃圾回收机制采用了标记 清除算法和三色标记法 垃圾回收器会在程序运行期间定期地扫描堆上的对象 并将其标记为 活动对象 或 垃圾对象 当所有的活动对象都被标记后 垃圾回收器会清除所有未标记的对象 这个过程被称为
  • MyBatis的动态SQL语句

    文章目录 1 动态SQL之