MyBatis动态SQL_MyBatis批量插入(Oracle数据库)
- 格式:pdf
- 大小:1.53 MB
- 文档页数:10
动态 SQLMyBatis 的一个强大的特性之一通常是它的动态 SQL 能力。
如果你有使用 JDBC 或其他相似框架的经验,你就明白条件地串联 SQL 字符串在一起是多么的痛苦,确保不能忘了空格或在列表的最后省略逗号。
动态 SQL 可以彻底处理这种痛苦。
通常使用动态 SQL 不可能是独立的一部分,MyBatis 当然使用一种强大的动态 SQL 语言来改进这种情形,这种语言可以被用在任意映射的 SQL 语句中。
动态 SQL 元素和使用 JSTL 或其他相似的基于 XML 的文本处理器相似。
在 MyBatis 之前的版本中,有很多的元素需要来了解。
MyBatis 3 大大提升了它们,现在用不到原先一半的元素就能工作了。
MyBatis 采用功能强大的基于 OGNL 的表达式来消除其他元素。
ifchoose (when, otherwise)trim (where, set)foreachif在动态 SQL 中所做的最通用的事情是包含部分 where 字句的条件。
比如:[html] view plaincopy<select id="findActiveBlogWithTitleLike"parameterType="Blog" resultType="Blog">SELECT * FROM BLOGWHERE state = ‘ACTIVE’<if test="title != null">AND title like #{title}</if></select>这条语句会提供一个可选的文本查找功能。
如果你没有传递 title,那么所有激活的博客都会被返回。
但是如果你传递了 title,那么就会查找相近的 title(对于敏锐的检索,这中情况下你的参数值需要包含任意的遮掩或通配符)的博客。
oracle数据库⼀条sql语句批量插⼊数据最近有个功能是需要重置不同⾝份的密码根据不同的规则,其中⼀个规则就是⼿机号码后六位,有多个⾝份,并且底层数据封装的⽐较死,只能通过公⽤⽅法去更新密码,但是这好⼏个⾝份都有共同的数据特性,⽤户编码,⽤户名称,⼿机号码,将这些字段存⼊⼀张临时表,在开始时根据需要选中某个单位的某个⾝份进⾏密码重置,这就涉及多个表插⼊临时表,当数据多的时候每次插⼊⼀条记录,⼀万条数据执⾏⼀万次记录很不现实,所以需要执⾏⼀次sql插⼊多条记录到数据库当中ORACLE 数据库插⼊多条记录的sql结构为:INSERT ALLINTO TABLENAME(FIELDS1, FIELD2) VALUES(VALUE1, VALUE2)INTO TABLENAME(FIELDS1, FIELD2) VALUES(VALUE1, VALUE2)SELECT 1 FROM DUAL;与mysql稍有不同,⽐如在前台根据需要选择要初始化密码的⾝份StringBuilder strSQL = new StringBuilder ();if(选中⾝份1){strSQL.Append ("INTO TABLENAME(FIELD1, FIELD2) VALUES (VALUE1, VALUE2 ")}if(选中⾝份2){strSQL.Append ("INTO TABLENAME(FIELD1, FIELD2) VALUES (VALUE1, VALUEE2 ")}if(选中⾝份3){strSQL.Append ("INTO TABLENAME(FIELD1, FIELD2) VALUES (VALUE1, VALUE2 ")}if (strSQL.Length == 0){“未查询到数据”return;}strSQL.Insert (0, "INSERT ALL ");strSQL.Append (" SELECT 1 FROM DUAL ");bool = 执⾏sql在后续截取密码中,先判断⼿机号码是否合法,strTelphone = "156********";strTelphone.substring(strTelphone.length -6); //后六位。
mybatis oracle批量更新的语句在使用MyBatis和Oracle数据库进行批量更新时,我们可以通过批量操作来提高性能和效率。
本文将介绍如何使用MyBatis和Oracle数据库来执行批量更新操作。
对于批量更新操作,我们可以使用MyBatis的动态SQL和Oracle数据库的批处理功能来实现。
下面是一个示例,用于批量更新指定表中的多行数据。
首先,我们需要创建一个Mapper接口,定义批量更新的方法。
在这个方法中,我们使用@Param注解来传递需要更新的数据列表。
```javapublic interface MyMapper {void batchUpdate(@Param("list") List<Bean> list);}```接下来,我们需要在Mapper.xml文件中编写批量更新的SQL语句。
使用foreach标签来循环遍历需要更新的数据列表,并生成相应的更新语句。
在这个示例中,我们假设需要更新的表名为"table_name",需要更新的字段为"column1"和"column2"。
```xml<update id="batchUpdate" parameterType="java.util.List"><foreach collection="list" item="item" index="index" separator=";">UPDATE table_name SET column1 = #{item.column1}, column2 =#{item.column2} WHERE id = #{item.id}</foreach></update>```在这个SQL语句中,我们使用了动态变量#{item.xxx}来引用列表中的每个对象的字段值。
MyBatis批量插⼊数据的三种⽅法实例⽬录前⾔准备⼯作1.循环单次插⼊2.MP批量插⼊①控制器实现②业务逻辑层实现③数据持久层实现MP性能测试MP源码分析3.原⽣批量插⼊①业务逻辑层扩展②数据持久层扩展③添加UserMapper.xml原⽣批量插⼊性能测试缺点分析解决⽅案总结前⾔批量插⼊功能是我们⽇常⼯作中⽐较常见的业务功能之⼀,之前我也写过⼀篇关于《》的⽂章,但评论区的反馈不是很好,主要有两个问题:第⼀,对 MyBatis Plus(下⽂简称 MP)的批量插⼊功能很多⼈都有误解,认为 MP 也是使⽤循环单次插⼊数据的,所以性能并没有提升;第⼆,对于原⽣批量插⼊的⽅法其实也是有坑的,但鲜有⼈知。
所以综合以上情况,磊哥决定再来⼀个 MyBatis 批量插⼊的汇总篇,同时对 3 种实现⽅法做⼀个性能测试,以及相应的原理分析。
先来简单说⼀下 3 种批量插⼊功能分别是:1. 循环单次插⼊;2. MP 批量插⼊功能;3. 原⽣批量插⼊功能。
准备⼯作开始之前我们先来创建数据库和测试数据,执⾏的 SQL 脚本如下:-- ------------------------------ 创建数据库-- ----------------------------SET NAMES utf8mb4;SET FOREIGN_KEY_CHECKS = 0;DROP DATABASE IF EXISTS `testdb`;CREATE DATABASE `testdb`;USE `testdb`;-- ------------------------------ 创建 user 表-- ----------------------------DROP TABLE IF EXISTS `user`;CREATE TABLE `user` (`id` int(11) NOT NULL AUTO_INCREMENT,`name` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NULL DEFAULT NULL,`password` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NULL DEFAULT NULL,`createtime` datetime NULL DEFAULT CURRENT_TIMESTAMP,PRIMARY KEY (`id`) USING BTREE) ENGINE = InnoDB AUTO_INCREMENT = 6 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_bin ROW_FORMAT = Dynamic;-- ------------------------------ 添加测试数据-- ----------------------------INSERT INTO `user` VALUES (1, '赵云', '123456', '2021-09-10 18:11:16');INSERT INTO `user` VALUES (2, '张飞', '123456', '2021-09-10 18:11:28');INSERT INTO `user` VALUES (3, '关⽻', '123456', '2021-09-10 18:11:34');INSERT INTO `user` VALUES (4, '刘备', '123456', '2021-09-10 18:11:41');INSERT INTO `user` VALUES (5, '曹操', '123456', '2021-09-10 18:12:02');SET FOREIGN_KEY_CHECKS = 1;数据库的最终效果如下:1.循环单次插⼊接下来我们将使⽤ Spring Boot 项⽬,批量插⼊ 10W 条数据来分别测试各个⽅法的执⾏时间。
mysql注解批量添加mybatis_Mybatis注解方式实现批量插入数据库MyBatis是一个开源的持久化框架,它提供了一种简单而灵活的方式来访问关系数据库。
在MyBatis中,可以使用注解方式来实现批量插入数据库的操作。
本文将介绍如何使用MyBatis注解来实现批量插入数据。
首先,需要在Maven或Gradle中添加MyBatis依赖。
以下是使用Maven的示例配置:```xml<dependencies><dependency><groupId>org.mybatis</groupId><artifactId>mybatis</artifactId><version>3.5.7</version></dependency></dependencies>```接下来,需要创建一个数据模型类,用于表示数据库中的表结构。
假设我们有一个名为User的表,包含id、name和age字段,那么对应的数据模型类可以如下所示:```javapublic class Userprivate Long id;private String name;private Integer age;// 省略getter和setter方法```然后,需要创建一个Mapper接口,用于定义数据库操作的方法。
在该接口中,我们将使用注解方式来实现批量插入数据的方法。
假设我们的Mapper接口为UserMapper,那么可以如下所示:```javapublic interface UserMapper"<script>","INSERT INTO user (name, age) VALUES ","<foreach collection='list' item='user' separator=','>","(#{}, #{user.age})","</foreach>","</script>"})```接下来,需要在MyBatis的配置文件中配置Mapper接口的扫描路径,并且使用注解配置的方式来启用Mapper接口。
MyBatis动态SQL————MyBatis动态SQL标签的⽤法1.MyBatis动态SQLMyBatis 的强⼤特性之⼀便是它的动态 SQL,即拼接SQL字符串。
如果你有使⽤ JDBC 或其他类似框架的经验,你就能体会到根据不同条件拼接 SQL 语句有多么痛苦。
拼接的时候要确保不能忘了必要的空格,还要注意省掉列名列表最后的逗号。
利⽤动态 SQL 这⼀特性可以彻底摆脱这种痛苦。
通常使⽤动态 SQL 不可能是独⽴的⼀部分,MyBatis 当然使⽤⼀种强⼤的动态 SQL 语⾔来改进这种情形,这种语⾔可以被⽤在任意的 SQL 映射语句中。
动态 SQL 元素和使⽤ JSTL 或其他类似基于 XML 的⽂本处理器相似。
在 MyBatis 之前的版本中,有很多的元素需要来了解。
MyBatis 3 ⼤⼤提升了它们,现在⽤不到原先⼀半的元素就可以了。
MyBatis 采⽤功能强⼤的基于 OGNL 的表达式来消除其他元素。
2.动态SQL标签:if,choose (when, otherwise),trim (where, set),foreach2.1 if标签:直接上代码<select id="queryByIdAndTitle"resultType="Blog">SELECT * FROM BLOGWHERE 1=1<if test="id!= null and title!=null">AND id=#{id} and title=#{title}</if></select>注:if标签⼀般⽤于⾮空验证,如上例,若id为空,if标签⾥的代码,将不会执⾏,反之,则会执⾏。
2.2 choose(when,otherwise)标签:直接上代码<select id="queryBy"resultType="Blog">SELECT * FROM BLOG WHERE 1=1<choose><when test="title != null">AND title like #{title}</when><otherwise>AND id= 1</otherwise></choose></select>注:choose(when,otherwise)标签相当于switch(case,default) ,如上例,若title 为空,when标签⾥的代码,将不会执⾏,默认执⾏otherwise 标签⾥⾯的代码。
mybatis 批量插入原理MyBatis是一种流行的Java持久化框架,它提供了一种简单、高效的方式来处理数据库操作。
其中,批量插入是MyBatis的一个重要特性,它可以大大提高数据库的插入性能。
本文将介绍MyBatis批量插入的原理及其实现方式。
一、MyBatis批量插入的原理在传统的数据库操作中,每次向数据库插入一条记录都需要进行一次网络传输,这样会导致插入大量数据时性能较低。
而MyBatis批量插入通过一次网络传输插入多条记录,从而减少了网络开销,提高了插入性能。
MyBatis批量插入的原理主要是通过JDBC的批量操作实现的。
JDBC提供了addBatch()和executeBatch()方法,分别用于添加批量操作的SQL语句和执行批量操作。
MyBatis在底层封装了这些方法,提供了更加简便的接口供开发者使用。
二、MyBatis批量插入的实现方式MyBatis提供了两种方式来实现批量插入:使用foreach标签和使用batch插件。
1. 使用foreach标签foreach标签是MyBatis中的一个循环标签,可以用于遍历集合或数组,并将元素传递给SQL语句中的参数。
在批量插入中,可以使用foreach标签来遍历插入的数据集合,并将每条记录作为参数传递给SQL语句。
具体实现步骤如下:(1)在SQL语句中使用foreach标签定义一个循环,指定要遍历的集合和循环变量名。
(2)在循环体中编写插入语句,使用循环变量作为参数。
(3)在Java代码中调用MyBatis的insert方法,传入数据集合。
2. 使用batch插件batch插件是MyBatis官方提供的一个插件,它可以将多个相同类型的SQL语句合并为一个批量操作。
在批量插入中,可以使用batch插件来将多条插入语句合并为一个批量插入操作。
具体实现步骤如下:(1)在MyBatis的配置文件中配置batch插件。
(2)在Java代码中调用MyBatis的insert方法,传入数据集合。
MyBatis 动态批量插入sql语句方法MyBatis实现动态批量插入的SQL语句可以采用foreach标签,具体方法如下:XML映射文件:xml<insert id="batchInsert">insert into USER (NAME, AGE)<foreach collection="list" item="item" separator="union all">(#{},#{item.age})</foreach></insert>Java代码:javaList<User> list = new ArrayList<>();list.add(new User("John", 20));list.add(new User("Tom", 25));list.add(new User("Jack", 30));SqlSession session = sqlSessionFactory.openSession();UserMapper mapper = session.getMapper(UserMapper.class);mapper.batchInsert(list);mit();最后生成的SQL语句为:sqlinsert into USER (NAME, AGE)values('John', 20)union allvalues('Tom', 25)union allvalues('Jack', 30)通过foreach标签,动态拼接了多条insert语句,并使用union all连接,最终实现了批量插入。
主要特点:1. 将需要批量插入的数据封装在List集合中2. 在foreach标签内,使用#{item.属性}的方式访问集合中的每条记录3. 使用separator属性,指定union all连接多条insert语句4. 将封装好的List集合,作为参数传入mapper方法,执行批量插入批量插入能有效减少数据库交互次数,提高插入效率。
mybatis generator 批量插入方法MyBatis Generator是一款优秀的Java代码生成工具,它可以帮助我们快速生成MyBatis的CRUD(创建、读取、更新、删除)代码。
在处理大量数据时,批量插入方法可以提高数据插入的效率,下面我们就来介绍如何使用MyBatis Generator生成批量插入方法。
**一、设置生成器配置**首先,你需要在MyBatis Generator的配置文件中,指定需要生成代码的表和对应的字段。
你需要提供表的结构信息,包括每个字段的数据类型、长度、是否主键等。
在生成的配置文件中,需要设置好数据库连接信息。
**二、编写Mapper接口**在Mapper接口中,你需要定义对应的批量插入方法。
这个方法会接收一个包含所有要插入数据的List对象,然后通过MyBatis Generator自动生成的CRUD方法将数据逐条插入数据库。
**三、生成代码**运行MyBatis Generator,根据你的配置文件生成对应的代码。
生成的代码中,应该包含Mapper接口中的批量插入方法以及对应的SQL语句。
你还可以在数据库表对应的实体类中看到自动生成的批量插入方法的调用方式。
**四、使用代码**在主程序中,你可以使用生成的代码进行批量插入操作。
注意,由于是批量插入,插入的数据量较大时,需要考虑到数据库的性能和内存使用情况,适当调整数据库连接数和JVM内存大小。
**示例代码**假设我们有一个User实体类,其中有id、name、age三个字段:1. 配置文件mybatis-generator-config.xml:```xml<configuration><environments default="development"><environment id="development"><database driver="com.mysql.jdbc.Driver"url="jdbc:mysql://localhost:3306/test" user="root"password="123456"><table name="user" schema="test"><propertyname="idColumn">id</property><propertyname="insertColumn">name,age</property><propertyname="mapperPrefix">UserMapper</property></table></database></environment></environments></configuration>```2. Mapper接口UserMapper:```javapublic interface UserMapper {void insertBatch(@Param("users") List<User> users);}```3. User实体类:```javapublic class User {private Integer id;private String name;private Integer age;// getter and setter methods...}```4. 使用生成的代码进行批量插入:在主程序中:```javaList<User> users = new ArrayList<>(); // 假设有多个User 对象需要插入数据库...UserMapper userMapper =MyBatisUtil.getMapper(UserMapper.class); // 获取Mapper接口实例...userMapper.insertBatch(users); // 调用批量插入方法...```以上就是使用MyBatis Generator生成批量插入方法的完整流程。
在MyBatis 中,你可以使用以下两种方式来进行批量插入:方法一:使用<foreach>标签MyBatis 提供了<foreach>标签,你可以使用它来遍历集合,并对集合中的每个元素执行SQL 语句。
以下是使用<foreach>标签进行批量插入的示例:xml复制代码<insert id="batchInsert" parameterType="java.util.List">INSERT INTO your_table (column1, column2, ...)VALUES<foreach collection="list" item="item" separator=",">(#{item.column1}, #{item.column2}, ...)</foreach></insert>在上面的示例中,你需要将your_table替换为你要插入数据的表名,column1, column2, ...替换为表中的列名。
list是传递给SQL 语句的参数名称,item是每次遍历的元素名称。
方法二:使用ExecutorType.BATCH执行器MyBatis 还提供了ExecutorType.BATCH执行器,它专门用于批量操作。
以下是使用ExecutorType.BATCH执行器进行批量插入的示例:java复制代码try (SqlSession sqlSession = sqlSessionFactory.openSession(ExecutorType.BATCH)) { YourMapper mapper = sqlSession.getMapper(YourMapper.class);for (YourObject obj : yourList) {mapper.insert(obj);}mit();} catch (Exception e) {// 处理异常}在上面的示例中,你需要将YourMapper替换为你的Mapper 接口,YourObject替换为你要插入的对象类型,yourList替换为包含要插入对象的列表。