MyBatis批量插入有多种写法,最后博主总结一些常见的批量插入写法供大家参考文章来源地址https://www.toymoban.com/news/detail-669676.html
方式列表
- 使用XML配置文件进行批量插入:在XML映射文件中使用
<insert>
标签,并通过foreach
标签迭代批量数据,然后在SQL语句中使用VALUES
关键字。 - 使用Java注解进行批量插入:在实体类上使用
@Insert
注解,并通过@Param
注解传入批量数据的参数。 - 使用Java编程语言提供的数据绑定进行批量插入:在Java代码中使用
List<Entity>
类型的参数,通过SqlSession.insert()
方法进行批量插入。 - 使用MyBatis Plus的LambdaUpdate进行批量插入:在实体类上使用
@LambdaUpdate
注解,并通过Lambda表达式定义批量插入的SQL语句。 - 使用MyBatis Plus的UpdateProvider进行批量插入:在实体类上使用
@UpdateProvider
注解,并指定一个自定义的UpdateProvider
类,该类通过反射生成批量插入的SQL语句。 - 使用Java编程语言提供的批处理机制进行批量插入:在Java代码中使用
PreparedStatement
的addBatch
和executeBatch
方法,将多个插入操作添加到批处理队列中,然后一次性执行所有操作。 - 使用MyBatis Plus的BatchExecutor进行批量插入:在Java代码中使用
BatchExecutor
类,通过指定SQL语句和参数列表,执行批量插入操作。 - 使用MyBatis Plus的BatchInsertBuilder进行批量插入:在实体类上使用
@AutoBatchInsert
注解,并使用BatchInsert
类提供的静态方法进行批量插入操作。 - 使用MyBatis的批量执行器BatchExecutor进行批量插入:在Java代码中使用
ExecutorType.BATCH
类型的执行器,通过SqlSessionFactory.getSqlSession()
方法获取批量执行的SqlSession,然后使用SqlSession.insert()
方法进行批量插入操作。 - 使用MyBatis Plus的Mapper批量插入:在Java代码中使用
BaseMapper
接口的insertList()
方法,通过传入批量插入的数据列表进行操作。
主要的方式
XML方式
<insert id="insertBatch" parameterType="java.util.List">
INSERT INTO table_name (column1, column2, ...)
VALUES
<foreach collection="list" item="item" separator=",">
(#{item.column1}, #{item.column2}, ...)
</foreach>
</insert>
注解方式
@LambdaUpdate({
@QuerySql("INSERT INTO table_name (column1, column2, ...) VALUES ",
"#{list,jdbcType=VARCHAR},#{list2,jdbcType=INTEGER}")
})
void insertBatch(List<Entity> list);
Plus方式
servicce.saveBatch(List<entity>,size)//size默认1000
Provider方式
@UpdateProvider(sql = "INSERT INTO table_name (column1, column2, ...) VALUES ",provider = BatchEntityProvider.class)
void insertBatch(List<Entity> list);
public class BatchEntityProvider extends AbstractEntityProvider<Entity> {
public BatchEntityProvider() {
super(Entity.class);
}
@Override
public String createSql(Entity model, String sql, LambdaSqlContext ctx) {
StringBuilder sqlBuilder = new StringBuilder(sql);
List<Object> params = ctx.getParams();
sqlBuilder.append(" VALUES ");
for (int i = 0; i < params.size(); i++) {
sqlBuilder.append("(");
Object param = params.get(i);
if (param instanceof Map) { // 当参数是一个Map时,map的key对应属性名,value对应属性值。属性名顺序需要和Entity保持一致。
Map<String, Object> map = (Map<String, Object>) param;
for (Object key : map.keySet()) { // 遍历map的key,拼接sql。
sqlBuilder.append("#{" + key + ",jdbcType=" + JdbcType.class.getName().replace(".", ",").replace("JdbcType", "").replace("}", "").replace("}", "") + "},"); // 去掉JdbcType后的所有括号以及.号拼接到sql中。
}
} else { // 当参数不是Map时,直接拼接sql。属性顺序需要和Entity保持一致。
for (int j = 0; j < model.getColumns().size(); j++) { // 遍历Entity的所有属性,拼接sql。
sqlBuilder.append("#{" + model.getColumns().get(j) + "},"); // 拼接到sql中。
}
}
sqlBuilder.deleteCharAt(sqlBuilder.length() - 1); // 删除最后一个逗号。
if (i != params.size() - 1) { // 如果不是最后一个参数,需要添加逗号隔开每个子语句。
sqlBuilder.append(",");
} else { // 是最后一个参数,不需要添加逗号隔开每个子语句。
sqlBuilder.append(")"); // 需要添加括号结束子语句。
}
if (i != params.size() - 1) { // 如果不是最后一个参数,需要添加逗号隔开每个子语句的左括号。
sqlBuilder.append(",");
} else { // 是最后一个参数,不需要添加逗号隔开每个子语句的左括号。
sqlBuilder.append(" "); // 需要添加空格结束每个子语句的左括号。
}
}
return sqlBuilder.toString(); // 返回拼接好的SQL语句。
}
}
鸣谢
- 非常感谢你从头到尾阅读了这篇文章,希望其中的内容对你有所启发和帮助。如果你还有其他问题或需要进一步的了解,欢迎随时关注我的动态并留言
- 最后可以给作者点个关注和小赞赞嘛,谢谢!
- 觉得有收藏价值可以进行收藏
文章来源:https://www.toymoban.com/news/detail-669676.html
到了这里,关于Mybatis批量插入方式有哪些的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!