Java Mybatis批量修改封装详解

 更新时间:2021年11月03日 08:46:07   作者:头发多的码农  
这篇文章主要介绍了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> {
}

总结

本篇文章就到这里了,希望能够给你带来帮助,也希望您能够多多关注脚本之家的更多内容!

相关文章

  • h2database在springboot中的使用教程

    h2database在springboot中的使用教程

    这篇文章主要介绍了h2database在springboot中的使用,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-10-10
  • Java WebService技术详解

    Java WebService技术详解

    本文详细讲解了Java WebService技术工作原理以及调用方式。对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2021-12-12
  • @PathVariable注解,让spring支持参数带值功能的案例

    @PathVariable注解,让spring支持参数带值功能的案例

    这篇文章主要介绍了@PathVariable注解,让spring支持参数带值功能的案例,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2021-02-02
  • 解决无法解析javax.servlet的方法

    解决无法解析javax.servlet的方法

    最近在创建一个servlet时,自动生成的代码中出现servlet无法解析的提示,令我无法正常使用servlet里的方法,在对各个步骤进行查看后,发现了问题所在,需要的朋友可以参考下
    2021-05-05
  • 详解在spring boot中消息推送系统设计与实现

    详解在spring boot中消息推送系统设计与实现

    这篇文章主要介绍了详解在spring boot中消息推送系统设计与实现,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2019-05-05
  • 5分钟搭建SpringCloud Eureka服务注册中心的实现

    5分钟搭建SpringCloud Eureka服务注册中心的实现

    这篇文章主要介绍了5分钟搭建SpringCloud Eureka服务注册中心的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2021-03-03
  • SpringBoot 拦截器返回false显示跨域问题

    SpringBoot 拦截器返回false显示跨域问题

    这篇文章主要介绍了SpringBoot 拦截器返回false显示跨域问题,文章围绕主题展开详细的内容介绍,需要的小伙伴可以参考一下
    2022-04-04
  • Java实现JDBC批量插入原理详解

    Java实现JDBC批量插入原理详解

    在JDBC中,executeBatch这个方法可以将多条dml语句批量执行,效率比单条执行executeUpdate高很多,这是什么原理呢?在mysql和oracle中又是如何实现批量执行的呢?本文将给大家介绍这背后的原理
    2023-03-03
  • struts1登录示例代码_动力节点Java学院整理

    struts1登录示例代码_动力节点Java学院整理

    这篇文章主要介绍了struts1登录示例代码,需要的朋友可以参考下
    2017-08-08
  • crawler4j抓取页面使用jsoup解析html时的解决方法

    crawler4j抓取页面使用jsoup解析html时的解决方法

    crawler4j对response没有指定编码的页面,解析成乱码,很让人烦恼,下面给出解决方法,需要的朋友可以参考下
    2014-04-04

最新评论