前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >MyBatisPlus的SQL注入器批量插入更新方法

MyBatisPlus的SQL注入器批量插入更新方法

作者头像
半月无霜
发布2024-03-29 11:31:43
2460
发布2024-03-29 11:31:43
举报
文章被收录于专栏:半月无霜半月无霜

MyBatisPlus的SQL注入器批量插入更新方法

一、介绍

在前几天,我们使用了MyBatis plusSQL注入器成功注入了我们想要的SQL写法。

MyBatisPlus的SQL注入器 | 半月无霜 (banmoon.top)

现在我又新增了一个方法,来看看

二、代码

其他代码就不贴了,去上一篇文章那看,这边只贴具体的方法实现

代码语言:javascript
复制
package com.banmoon.business.mybatis.method;

import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.core.metadata.TableFieldInfo;
import com.baomidou.mybatisplus.core.metadata.TableInfo;
import com.baomidou.mybatisplus.core.metadata.TableInfoHelper;
import com.baomidou.mybatisplus.core.toolkit.sql.SqlInjectionUtils;
import com.baomidou.mybatisplus.core.toolkit.sql.SqlScriptUtils;
import org.apache.ibatis.executor.keygen.Jdbc3KeyGenerator;
import org.apache.ibatis.executor.keygen.KeyGenerator;
import org.apache.ibatis.executor.keygen.NoKeyGenerator;
import org.apache.ibatis.mapping.MappedStatement;
import org.apache.ibatis.mapping.SqlSource;

import java.util.List;

public class InsertOnDuplicateKeyUpdateBatchMethod extends InsertOnDuplicateKeyUpdateMethod {

    private static final String METHOD_NAME = "insertOnDuplicateKeyUpdateBatch";

    private static final String METHOD_PARAM_NAME = "entityList";

    public InsertOnDuplicateKeyUpdateBatchMethod() {
        super(METHOD_NAME);
    }

    @Override
    public MappedStatement injectMappedStatement(Class<?> mapperClass, Class<?> modelClass, TableInfo tableInfo) {
        KeyGenerator keyGenerator = NoKeyGenerator.INSTANCE;
        List<TableFieldInfo> fieldList = tableInfo.getFieldList();
        String insertSqlColumn = getKeyInsertSqlColumn(tableInfo) + this.filterTableFieldInfo(fieldList, null, TableFieldInfo::getInsertSqlColumn, EMPTY);
        String columnScript = LEFT_BRACKET + insertSqlColumn.substring(0, insertSqlColumn.length() - 1) + RIGHT_BRACKET;
        String insertSqlProperty = tableInfo.getKeyInsertSqlProperty(false, ENTITY_DOT, false) +
                                           this.filterTableFieldInfo(fieldList, null, i -> i.getInsertSqlProperty(ENTITY_DOT), EMPTY);
        insertSqlProperty = LEFT_BRACKET + insertSqlProperty.substring(0, insertSqlProperty.length() - 1) + RIGHT_BRACKET;
        String valuesScript = SqlScriptUtils.convertForeach(insertSqlProperty, METHOD_PARAM_NAME, null, ENTITY, COMMA);
        String keyProperty = null;
        String keyColumn = null;
        // 表包含主键处理逻辑,如果不包含主键当普通字段处理
        if (tableInfo.havePK()) {
            if (tableInfo.getIdType() == IdType.AUTO) {
                /* 自增主键 */
                keyGenerator = Jdbc3KeyGenerator.INSTANCE;
                keyProperty = tableInfo.getKeyProperty();
                // 去除转义符
                keyColumn = SqlInjectionUtils.removeEscapeCharacter(tableInfo.getKeyColumn());
            } else {
                if (null != tableInfo.getKeySequence()) {
                    keyGenerator = TableInfoHelper.genKeyGenerator(this.methodName, tableInfo, builderAssistant);
                    keyProperty = tableInfo.getKeyProperty();
                    keyColumn = tableInfo.getKeyColumn();
                }
            }
        }
        String duplicateKeyUpdateScript = generateDuplicateKeyUpdateScript(tableInfo);
        String sql = String.format(SQL_TEMPLATE, tableInfo.getTableName(), columnScript, valuesScript, duplicateKeyUpdateScript);
        SqlSource sqlSource = super.createSqlSource(configuration, sql, modelClass);
        return this.addInsertMappedStatement(mapperClass, modelClass, methodName, sqlSource, keyGenerator, keyProperty, keyColumn);
    }

    private String getKeyInsertSqlColumn(TableInfo tableInfo) {
        String keyColumn = tableInfo.getKeyColumn();
        String keyProperty = tableInfo.getKeyProperty();
        if (tableInfo.havePK()) {
            if (tableInfo.getIdType() == IdType.AUTO) {
                return SqlScriptUtils.convertIf(keyColumn + COMMA, String.format("%s[0].%s != null", METHOD_PARAM_NAME, keyProperty), true);
            }
            return keyColumn + COMMA + NEWLINE;
        }
        return EMPTY;
    }
}

测试一下

代码语言:javascript
复制
package com.banmoon;

import cn.hutool.core.collection.CollUtil;
import com.banmoon.entity.UserEntity;
import com.banmoon.mapper.UserMapper;
import org.junit.Assert;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.junit4.SpringRunner;

import javax.annotation.Resource;
import java.util.List;

@SpringBootTest
@RunWith(SpringRunner.class)
public class ServerTest {

    @Resource
    private UserMapper userMapper;

    @Test
    public void testBatch() {
        UserEntity userEntity = new UserEntity();
        userEntity.setId(6);
        userEntity.setUsername("测试1");
        userEntity.setPassword("1234");
        userEntity.setStatus(1);
        UserEntity userEntity1 = new UserEntity();
        userEntity1.setId(7);
        userEntity1.setUsername("测试2");
        userEntity1.setPassword("1234");
        userEntity1.setStatus(1);
        List<UserEntity> list = CollUtil.newArrayList(userEntity, userEntity1);

        int i = userMapper.insertOnDuplicateKeyUpdateBatch(list);
        Assert.assertEquals(list.size(), i);

        userEntity.setUsername("测试覆盖1");
        userEntity1.setUsername("测试覆盖2");
        i = userMapper.insertOnDuplicateKeyUpdateBatch(list);
        Assert.assertEquals(list.size() * 2, i);
    }

}
image-20240328222745086
image-20240328222745086

三、最后

还有一点需要注意,这边的主键要么都要有值,要么都没值(数据库自动生成)

我是半月,你我一同共勉!!!

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2024-03-28,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • MyBatisPlus的SQL注入器批量插入更新方法
    • 一、介绍
      • 二、代码
        • 三、最后
        相关产品与服务
        腾讯云服务器利旧
        云服务器(Cloud Virtual Machine,CVM)提供安全可靠的弹性计算服务。 您可以实时扩展或缩减计算资源,适应变化的业务需求,并只需按实际使用的资源计费。使用 CVM 可以极大降低您的软硬件采购成本,简化 IT 运维工作。
        领券
        问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档