Java Mybatis批量修改封装详解
作者:头发多的码农 发布时间:2021-12-29 22:41:52
标签:Java,Mybatis,批量,修改
重点重点重点,不然会报错
连接数据库url后面加个参数
allowMultiQueries=true
用习惯了 insertList 怎么能没有 updateList呢
就两个类 直接上代码
package com.lancabbage.gorgeous.utils.mybatis;
import org.apache.ibatis.mapping.MappedStatement;
import tk.mybatis.mapper.entity.EntityColumn;
import tk.mybatis.mapper.mapperhelper.EntityHelper;
import tk.mybatis.mapper.mapperhelper.MapperHelper;
import tk.mybatis.mapper.mapperhelper.MapperTemplate;
import tk.mybatis.mapper.mapperhelper.SqlHelper;
import java.util.Set;
import static tk.mybatis.mapper.mapperhelper.SqlHelper.whereVersion;
/**
* ListUpdateProvider实现类,批量修改方法实现类
*
* @author lanyanhua
*/
public class ListUpdateProvider extends MapperTemplate {
public ListUpdateProvider(Class<?> mapperClass, MapperHelper mapperHelper) {
super(mapperClass, mapperHelper);
}
// /**
// * 通过主键更新全部字段
// *
// * @param ms
// */
// public String updateByPrimaryKey(MappedStatement ms) {
// Class<?> entityClass = getEntityClass(ms);
// StringBuilder sql = new StringBuilder();
// sql.append(SqlHelper.updateTable(entityClass, tableName(entityClass)));
// sql.append(SqlHelper.updateSetColumns(entityClass, null, false, false));
// sql.append(SqlHelper.wherePKColumns(entityClass, true));
// return sql.toString();
// }
/**
* 通过主键更新不为null的字段
*
* @param ms
* @return
*/
public String updateByPrimaryKeySelectiveList(MappedStatement ms) {
Class<?> entityClass = getEntityClass(ms);
StringBuilder sql = new StringBuilder();
sql.append("<foreach collection=\"list\" item=\"record\" >");
//set
sql.append(SqlHelper.updateTable(entityClass, tableName(entityClass)));
sql.append(SqlHelper.updateSetColumns(entityClass, "record", true, isNotEmpty()));
//where
sql.append("<where>");
Set<EntityColumn> columnSet = EntityHelper.getPKColumns(entityClass);
//当某个列有主键策略时,不需要考虑他的属性是否为空,因为如果为空,一定会根据主键策略给他生成一个值
for (EntityColumn column : columnSet) {
sql.append(" AND ").append(column.getColumnEqualsHolder("record"));
}
sql.append(whereVersion(entityClass));
sql.append("</where>");
sql.append(" ;\n");
sql.append("</foreach>");
return sql.toString();
}
}
package com.lancabbage.gorgeous.utils.mybatis;
import org.apache.ibatis.annotations.UpdateProvider;
import tk.mybatis.mapper.annotation.RegisterMapper;
import java.util.List;
/**
* 通用Mapper接口,更新
*
* @param <T> 不能为空
* @author lanyanhua
*/
@RegisterMapper
public interface ListUpdateByPrimaryKeySelectiveMapper<T> {
/**
* 根据主键更新属性不为null的值
*
* @param record
* @return
*/
@UpdateProvider(type = ListUpdateProvider.class, method = "dynamicSQL")
int updateByPrimaryKeySelectiveList(List<T> record);
}
我是使用的是Tk.mybatis。代码是复制的原来的updateByPrimaryKeySelective的代码进行的微调
保证最终的结构类似这种就ok
<foreach collection="list" item="record" separator=";">
UPDATE project
<set>id = id,
<if test="record.name != null">name = #{record.name},</if>
<if test="record.remotePath != null">remote_path = #{record.remotePath},</if>
<if test="record.createTime != null">create_time = #{record.createTime},</if>
<if test="record.isShow != null">is_show = #{record.isShow},</if>
<if test="record.displayOrder != null">display_order = #{record.displayOrder},</if>
</set>
<where>AND id = #{record.id}</where>
</foreach>
使用 就和其他的一样 在你的Mapper类上继承这个类ListUpdateByPrimaryKeySelectiveMapper就好了
public interface BaseMapper<T> extends Mapper<T>, MySqlMapper<T>, ListUpdateByPrimaryKeySelectiveMapper<T> {
}
来源:https://blog.csdn.net/lanyanhua/article/details/121034603
0
投稿
猜你喜欢
- 本文介绍了struts2的国际化实现网站整体中英文切换实例代码,分享给大家,具体如下:环境要求:Struts2框架环境搭建成功为了实现程序的
- 前言: 由于前段时间,项目组长分配的任务是要完成一个在线编写SQL并要实现查询功能的需求,最终需要将查询到的数据以JSON格式显示到响应数据
- 先看代码://设置可以同时处于活动状态的线程池的请求数目。 bool pool = ThreadPool.SetMaxThreads(8,
- 本文实例实现C#以一个收银付费的小程序演示switch case语法如何使用,读入用户选择,把用户的选择赋值给变量n,再根据用户的输入提示付
- Crypto 库是C/C++的加密算法库,这个加密库很流行,基本上涵盖了市面上的各类加密解密算法,以下代码是我在学习是总结的,放到这里用于后
- 在此附上超详细JDK1.8安装与配置超详细JDK1.8安装与配置一、卸载JDK应用程序①在开始处,点击设置②点击应用③点击程序和功能④打开程
- 归并排序算法思想:分而治之(divide - conquer);每个递归过程涉及三个步骤第一, 分解: 把待排序的 n 个元素的序列分解成两
- 背景WebView是在APP中,可以很方便的展示web页面,并且与web交互APP的数据。方便,并且更新内容无需APP发布新版本,只需要将最
- 概要笔者近期做到对天气预报JSON数据解析,在此小记。天气预报接口:http://wthrcdn.etouch.cn/weather_min
- 目录面试题1:如何判断对象是否存活1.引用计数算法2.可达性分析算法面试题2:哪些对象可以作为GC Roots?面试题3:你了解的对象引用方
- 1. 通过字节流实现文件的拷贝 /** * 通过字节流实现文件的拷贝 * @param sourcePath 源
- 1.简介其实这个效果几天之前就写了,但是一直没有更新博客,本来想着把芝麻分雷达图也做好再发博客的,然后今天看到鸿洋的微信公众号有朋友发了芝麻
- 部分网友会发现Activity在切换到后台或布局从横屏LANDSCAPE切换到PORTRAIT,会重新切换Activity会触发一次onCr
- 这个可以在Adapter里面写一般写完之后都会调用 public void removeItem(int pos){ &nbs
- 一、原理区别:Java * 是利用反射机制生成一个实现代理接口的匿名类,在调用具体方法前调用InvokeHandler来处理。而cglib
- spring中的bean依赖有大体上可以分为两类,共3中形式,下面简单介绍一下。第一类是构造方法中的循环依赖,这种会报错@Servicepu
- 今天碰到一个非常奇怪的问题: 在Android中ImageView无法显示加载的本地SDCard图片。 具体过程是:先调用本地照相机程序摄像
- java.util.NoSuchElementException报错的行数是一个scnner的next,本来和老师讨论了半天没有什么头绪,错
- 前言现在APP中用到H5页面的越来越多,而如何正确获取WebView的网页title是必须要考虑的。最近做项目的时候,老大让我把之前做的we
- 最近在做项目的时候,一直用一个叫做API的东西,controller注解我会写,这个东西我也会用,但是我确实不知道这个东西是个什么,有点神奇