如何改进Mybatis的xml自定义sql

MyBatis实现动态SQL MyBatis实现动态SQL ​ MyBatis 最强大的特性之一就是它的动态语句功能。如果您以前有使用JDBC或者类似框架的 经历,您就会明白把SQL语句条件连接在一起是多么的痛苦,要确保不能忘记空格或者不要在 columns列后面省略一个逗号等。动态语句能够完全解决掉这些痛苦。 ​ 尽管与动态SQL一起工作不是在开一个party,但是MyBatis确实能通过在任何映射SQL语句中 使用强大的... 阅读详情

 如何改进Mybatis的xml自定义sql

mybatis的用法:

a)

使用动态 SQL 最常见情景是根据条件包含 where 子句的一部分。比如:

<select id="findActiveBlogWithTitleLike"
     resultType="Blog">
  SELECT * FROM BLOG
  WHERE state = ‘ACTIVE’
  <if test="title != null">
    AND title like #{title}
  </if>
</select>

b)

foreach
动态 SQL 的另一个常见使用场景是对集合进行遍历(尤其是在构建 IN 条件语句的时候)。比如:

<select id="selectPostIn" resultType="domain.blog.Post">
  SELECT *
  FROM POST P
  <where>
    <foreach item="item" index="index" collection="list"
        open="ID in (" separator="," close=")" nullable="true">
          #{item}
    </foreach>
  </where>
</select>

是不是很累赘,本来简单的事情,却变得复杂了。

下面来看下,如何使用简单的方法来实现。

1.List, Set转SQL in

定义的sql:

select * from orders where userid in #{userid @in}

Java代码:

			Map<String, Object> map = new HashMap<>();
			
			List<String> list=new ArrayList<>();
			list.add("bee");
			list.add("orders3");
			list.add("orders4");
			map.put("userid", list);

            select(sqlIn, map);


	private static void select(String sql,Map<String,Object> map) {
		List<Orders> list3 = preparedSql.select(sql, new Orders(), map,1,3);//map
		for (int i = 0; i < list3.size(); i++) {
			Logger.info(list3.get(i).toString());
		}
	}

生成的sql:

[INFO] [Bee] ========= get the dbName from the Connection is :MySQL
[INFO] [Bee] PreparedSql select SQL: select * from orders where userid in  (?,?,?)   [values]: bee(String),orders3(String),orders4(String)
[INFO] [Bee] PreparedSql select SQL:  ( ExecutableSql )
select * from orders where userid in  ('bee','orders3','orders4')
[INFO] [Bee]  | <--  select rows: 5

Bee V1.11 对in操作,支持List, Set两种类型

2. 批量插入操作

无需像foreach之类的标签, Bee框架会自动为我们处理.

			String sql9="INSERT INTO orders(id,name,userid) VALUES (#{id},#{name},#{userid});";
			final String USERID="userid";
			final String NAME="name";
			final String ID="id";
			Map<String,Object> insertMap1=new HashMap<>();
			insertMap1.put(USERID, "1001");
			insertMap1.put(NAME, "bee");
			insertMap1.put(ID, 121L);
			
			Map<String,Object> insertMap2=new HashMap<>();
			insertMap2.put(USERID, "1001");
			insertMap2.put(NAME, "bee");
			insertMap2.put(ID, 122L);
			
			Map<String,Object> insertMap3=new HashMap<>();
			insertMap3.put(USERID, "1001");
			insertMap3.put(NAME, "bee");
			insertMap3.put(ID, 123L);
			
			List<Map<String, Object>> parameterMapList=new ArrayList<>();
			parameterMapList.add(insertMap1);
			parameterMapList.add(insertMap2);
			parameterMapList.add(insertMap3);
			

	//		preparedSql.insertBatch(sql9, parameterMapList,2);

			preparedSql.insertBatch(sql9, parameterMapList);

生成的sql:

INSERT INTO orders(id,name,userid) VALUES (?,?,?), (?,?,?), (?,?,?)

可以看到,使用Mysql时,Bee框架会为我们智能的添加多组占位符.

3. <if isNotNull>,<if isNotBlank>

select * from orders where <if isNotNull>userid in #{userid@in}</if>

当#{userid@in}里声明的参数userid的值不为null时,才解析<if isNotNull> </if>之间的代码.

<if isNotBlank>类似,表示不为null且不为空字符时,才解析.

select * from orders where <if isNotBlank>name like #{%name}</if>

当不解析if时,

sql变为:select * from orders where,

Bee为自动将where删除. 变成正确的: select * from orders

4.@toIsNULL1,@toIsNULL2

我们看下这个SQL自定义语句.

select * from orders where userid=#{userid}

当userid为null时,会转成
 

select * from orders where userid=null

这是不对的.应该是:

select * from orders where userid is null

使用@toIsNULL1和@toIsNULL1就可以解决这个问题.当是null时, 就转成is null.
 

select * from orders where userid=#{userid @toIsNULL1}

select * from orders where id>=#{id@toIsNULL2}

@toIsNULL1,@toIsNULL2后面的数字1和2是告诉Bee框架,要将标签前的一个或两个字符删除.

一般是"="或">="之类的符号.

可以看到,使用ORM Bee更加简单方便。

源码官网:

https://github.com/automvc/bee

源码:

src/main/java/org/teasoft/exam/bee/osql/PreparedSqlCustomAutoSqlTokenExam.java · automvc/bee-exam - Gitee.com

MyBatis基于XML的使用——缓存 阅读详情

相关推荐

MyBatis自定义改进版本的深入解析

本文还有配套的精品资源,点击获取 简介:MyBatis修改版针对原版MyBatis框架进行了性能优化和定制化调整,特别关注了代理对象实现和SQL执行效率的改进。通过减少代理对象创建的开销、提高事务管理效率、优化缓存控制、增强参数映射、提升SQL执行效率以及增强日志记录,改进版的MyBatis旨在提高开发效率和性能。测试用例 mybatis_test 用于验证功...

weixin_36328210的博客 1200

自定义动态SQL标签(易用,效率高)

1.List, Set转SQL in 定义的sql: select * from orders where userid in #{userid @in} Java代码: Map<String, Object> map = new HashMap<>(); List<String> list=new ArrayList<>(); list.add("bee"); list.add("orders3"); lis

abckingaa的博客 4168

AWR射频仿真基本操作(一)

这里只讲述一个基本的操作: 软件是AWR 14版本

钢丝 2万+

93.QuerySet转换为SQL的条件:迭代,切片(指定步长),len函数,list函数,判断

生成一个QuerySet对象并不会马上转换为SQL语句去执行。 books = Book.objects.filter(pk=3) print(connection.queries) 打印出django底层执行的sql语句:是一个空的列表[] 在以下情况下QuerySet会被转换为SQL语句执行: 1. 迭代:在遍历QuerySet对象的时候,会执行这个sql语句,然后再把执行的结果返回进行迭代...

zjy123078_zjy的博客 726

从扇束到平行束:等角重排算法在CT重建中的核心原理与MATLAB实践

本文深入解析了CT图像重建中等角扇束重排算法的核心原理与MATLAB实现。通过将实际采集的扇束投影数据,利用几何映射和两次关键插值,转换为适用于经典滤波反投影算法的平行束数据,打通了高效重建的关键路径。文章结合Shepp-Logan模型仿真,提供了完整的MATLAB代码实践,并分析了源-物距、采样率等关键参数对重建质量的影响。

cnn8visionary的博客 647

基于MCP协议的AssistAI:深度集成Eclipse的AI编程助手实战指南

在AI辅助编程领域,大型语言模型(LLM)与开发工具的深度集成是提升开发效率的关键。其核心原理在于通过标准化的协议(如MCP,Model Context Protocol),将IDE的功能封装为AI可调用的工具集,从而实现环境感知与操作同步。这项技术的价值在于打破了传统AI编程工具与开发者工作流的割裂,使AI能够以符合工程规范的方式直接操作项目,如进行代码重构、运行测试和交互式调试。其典型应用场景包括复杂代码导航、自动化测试生成与精准的增量编译。本文以Eclipse插件AssistAI为例,详细解析了如何通

weixin_42531579的博客 558

mysql语言中in_mybatis的xml中sql语句中in的写法(迭代遍历)

这里使用 foreach标签#{item}foreach元素的属性主要有 item,index,collection,open,separator,close。item表示集合中每一个元素进行迭代时的别名.index指 定一个名字,用于表示在迭代过程中,每次迭代到的位置.open表示该语句以什么开始,separator表示在每次进行迭代之间以什么符号作为分隔 符.close表示以什么结束.1.如果...

weixin_36393718的博客 328

保姆级教程:用rosbag录制和回放你的第一个ROS机器人数据(附C++/Python代码)

本文提供了一份详细的ROS机器人数据录制与回放教程,涵盖从命令行操作到C++/Python编程实现的全流程。通过rosbag工具,开发者可以高效记录和回放机器人运行时的传感器数据和控制指令,适用于故障复现、算法调试等多种场景。教程还包含高级技巧如时间同步和大文件处理,帮助用户快速掌握ROS数据管理核心技能。

weixin_29313239的博客 283

java Mybatis Xml Sql 中 IN 的两种写法: #{item} => #{collection[${index}]}

mybatis xml 中 foreach 中 取值的两种方式: #{item} => #{collection[${index}]}

weixin_40415768的博客 2292

极验第四代滑块验证码破解(三):滑块轨迹构造

极验第四代滑块验证码破解(三):滑块轨迹构造声明 声明 原创文章,请勿转载! 本文内容仅限于安全研究,不公开具体源码。维护网络安全,人人有责。 本文关联文章超链接:

帯泪的鱼的博客 8624

【不说废话】MyBatis系列(一):手写简单持久层框架

不说废话,直接开始 分析jdbc操作问题 思考 jdbc已经能够完成数据库的操作,已经能完成增删该查的操作,为什么改需要 MyBatis 呢? 原因 jdbc操作存在一些问题,哪些问题?通过 jdbc 代码分析 public static void main(String[] args) { Connection connection = null; PreparedStatement preparedStatement = null; ResultSet resultSet

ZXCoder的博客 235

基于imx6ull平台opencv的图像采集、ffmpeg推流和Windows端拉流(多线程)

本文档是针对imx6ull平台`opencv`的图像采集、ffmpeg推流和Windows端拉流。首先创建一个线程`opencv`通过摄像头采集视频图像,接着再创建两个线程,其中一个线程获取采集的视频图像送给ffmpeg服务,另一个线程用于获取采集的视频图像并处理,处理完并在显示屏上显示,详细的流程请参看如下。

程小二的博客 1607

MyBatis v3.4.1 发布下载,持久层框架

http://www.linuxidc.com/Linux/2016-06/132741.htm MyBatis v3.4.1 发布下载,MyBatis 是支持定制化 SQL、存储过程以及高级映射的优秀的持久层框架。MyBatis 避免了几乎所有的 JDBC 代码和手动设置参数以及获取结果集。MyBatis 可以对配置和原生Map使用简单的 XML 或注解,将接口和 Java 的

气自华 1661

Android 系统状态栏中实现高斯模糊背景

至此,我们已经完成了在 Android 系统的 SystemUI 中实现高斯模糊背景的过程。通过以上的布局和代码修改,我们可以在状态栏中看到具有高斯模糊效果的背景。同时,为了在不同版本的 Android 系统上适配高斯模糊效果,可能需要进行一些额外的代码调整和兼容性处理。希望本文能够帮助你理解如何在 Android 系统的 SystemUI 中实现高斯模糊背景,并通过提供的源代码进行相应的开发和调试。首先,我们需要在 SystemUI 的布局文件中添加一个用于展示高斯模糊背景的视图。属性来开启模糊效果。

CyberSparkZ的博客 870

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

Mybatis框架 JDBC操作数据库、动态SQL语句、配置相应的XML文件、注解的SQL语句

MyBatis是一款优秀的 持久层 框架,用于简化JDBC的开发。MyBatis本是 Apache的一个开源项目iBatis,2010年这个项目由apache迁移到了google code,并且改名为MyBatis。2013年11月迁移到Github。Mybatis框架让程序员更关注于SQL语句,动态sql用法持久层和框架这两个词,就是Mybatis特点持久层:指的是就是数据访问层(dao),是用来操作数据库的。框架:是一个半成品软件,是一套可重用的、通用的、软件基础代码模型。

2301_77358195的博客 1387

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

myBatis xml文件SQL编写( if、where、if-else、set 、foreach )

myBatis xml文件SQL编写( if、where、if-else、set 、foreach )1. if 标签2. where 标签3. choose, when, otherwise 标签 (if - else if - else )4. set 标签5. foreach 标签 MyBatis 的强大特性之一便是它的动态 SQL。如果你有使用 JDBC 或其它类似框架的经验,你就能体会到根据不同条件拼接 SQL 语句的痛苦。例如拼接时要确保不能忘记添加必要的空格,还要注意去掉列表最后一个列名的逗

廷赫斯的博客 1万+

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

mybatis执行任意SQL

mybatis执行任意SQL 用一个方法可灵活方便执任意自定义SQL,不需要在XML或接口中声明,以下是实现,采用注解,XML没测试,应该类似。 1:声明一个接口,里面包括一个超级SQL方法: // A code block var foo = 'bar'; public interface SqlDao{ @Select("${sql}") List<LinkedHashMap...

continentlu的博客 1801

Mybatis之动态SQL

MyBatis 的强大特性之一便是它的动态 SQL。如果你有使用 JDBC 或其它类似框架的经验,你就能体会到根据不同条件拼接 SQL 语句的痛苦。例如拼接时要确保不能忘记添加必要的空格,还要注意去掉列表最后一个列名的逗号。 利用动态 SQL 这一特性可以彻底摆脱这种痛苦。 虽然在以前使用动态 SQL 并非一件易事,但正是 MyBatis 提供了可以被用在任意 SQL 映射语句中的强大的动态 SQ...

JustinNeil的博客 1万+

MyBatis 中的动态SQL查询

MyBatis 中的动态SQL查询 动态查询简介 MyBatis 的一个强大的特性之一通常是它的动态 SQL 能力。如果你有使用 JDBC 或其他相似框架的经验,你就明白条件地串联 SQL 字符串在一起是多么的痛苦,确保不能忘了空格或在列表的最后省略逗号。动态 SQL 可以彻底处理这种痛苦。 通常使用动态 SQL 不可能是独立的一部分,MyBatis 当然使用一种强大的动态 SQL 语言来改进...

jssd的博客 5640

Mybatis XML映射器,动态SQL

MyBatis 的真正强大在于它的语句映射,这是它的魔力所在。由于它的异常强大,映射器的 XML 文件就显得相对简单。如果拿它跟具有相同功能的 JDBC 代码进行对比,你会立即发现省掉了将近 95% 的代码。MyBatis 致力于减少使用成本,让用户能更专注于 SQL 代码。...

buhuikaifa的博客 518

Mybatis 比 IBatis 比较大的几个改进是什么?

MyBatis 是 IBatis 的继承者和改进版本,它在多个方面进行了优化和增强。

weixin_45422672的博客 605

mybatis里mapper.xml中SQL语句if语句嵌套if语句

为了实现一个sql可以根据条件不同实现sql语句的动态查询,所以在使用mybatis时,对应的mapper.xml的sql语句可以根据条件值的不同执行不同的sql语句, 最开始在我的where子句中我的if语句是这么写的: <where> <if test="status==0 "> status=#{status} </if&g...

高山仰止,景行行止 2万+

MyBatis 从入门到精通:MyBatis动态SQL功能

在MyBatis中,动态SQL是一项非常强大的功能,允许我们根据不同的条件生成不同的SQL语句。动态SQL是MyBatis中一个核心的功能,它可以帮助我们在编写SQL时更加灵活,根据不同的情况生成不同的SQL语句,从而满足各种复杂的业务需求。动态SQL是MyBatis中非常重要的一个功能,通过灵活运用动态SQL,我们可以轻松地构建出符合不同条件的SQL语句,从而满足各种业务需求。我们可以期待在未来的版本中看到更多新功能的加入。通过本文的学习,相信你对MyBatis中的动态SQL功能有了更深入的了解。

沉淀所学,分享所思,让热爱与成长同行。商务记录AI实战经验,助力开发者快速成长。 热爱AI,希望做出有影响力的技术成果。 技术点亮生活,分享连接价值与机会。 专注AI落地实战,陪你走好技术每一步。 1382

myBatis3之SQL映射的XML文件(resultMap元素之三)

myBatis3之SQL映射的XML文件(resultMap元素之三) ----------   高级结果映射之id,result元素   &lt;id property="id" column="post_id"/&gt; &lt;result property="subject" column="post_subject"/&gt; 这些是结果映射最基本内容。id和resul

fhd001的专栏 185
上一篇: 请DeepSeek分析对比Hibernate,mybatis, Bee三种Java ORM工具的优缺点
下一篇: python开发订单查询功能(flask+orm bee)
abckingaa
博客等级 码龄12年 783粉丝 541原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值