文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

解决mybatis plus 批量插入方法不能用默认值的问题

2023-09-09 12:03

关注

当使用InsertBatchSomeColumn 批量插入时,字段为null时会报错,而单条插入时会使用默认值,两者行为不统一,会对开发过程产生困扰。此方法改良了原版的批量插入方法,使得批量插入和单条插入结果一致。

由于mp的接口变化较快,构造器不同版本都不一样,可能需要小改。

测试mp版本 3.5.3.1

package xxxxxxx;import com.baomidou.mybatisplus.annotation.IdType;import com.baomidou.mybatisplus.core.enums.SqlMethod;import com.baomidou.mybatisplus.core.injector.AbstractMethod;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.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;import java.util.function.Predicate;@SuppressWarnings("serial")public class InsertBatchSomeColumn extends AbstractMethod {        private Predicate predicate;        protected InsertBatchSomeColumn(String methodName) {        super(methodName);    }    public String getMethod(SqlMethod sqlMethod) {        // 自定义 mapper 方法名        return methodName;    }    @SuppressWarnings("Duplicates")    @Override    public MappedStatement injectMappedStatement(Class mapperClass, Class modelClass, TableInfo tableInfo) {        KeyGenerator keyGenerator = NoKeyGenerator.INSTANCE;        SqlMethod sqlMethod = SqlMethod.INSERT_ONE;        List fieldList = tableInfo.getFieldList();        String insertSqlColumn = tableInfo.getKeyInsertSqlColumn(true, false) +            this.filterTableFieldInfo(fieldList, predicate, TableFieldInfo::getInsertSqlColumn, EMPTY);        String columnScript = LEFT_BRACKET + insertSqlColumn.substring(0, insertSqlColumn.length() - 1) + RIGHT_BRACKET;        String insertSqlProperty = tableInfo.getKeyInsertSqlProperty(true, ENTITY_DOT, false) +            this.filterTableFieldInfo(fieldList, predicate, i -> getInsertSqlProperty(i,ENTITY_DOT), EMPTY);        insertSqlProperty = LEFT_BRACKET + insertSqlProperty.substring(0, insertSqlProperty.length() - 1) + RIGHT_BRACKET;        String valuesScript = SqlScriptUtils.convertForeach(insertSqlProperty, "list", null, ENTITY, COMMA);        String keyProperty = null;        String keyColumn = null;        // 表包含主键处理逻辑,如果不包含主键当普通字段处理        if (tableInfo.havePK()) {            if (tableInfo.getIdType() == IdType.AUTO) {                                keyGenerator = Jdbc3KeyGenerator.INSTANCE;                keyProperty = tableInfo.getKeyProperty();                keyColumn = tableInfo.getKeyColumn();            } else {                if (null != tableInfo.getKeySequence()) {                    keyGenerator = TableInfoHelper.genKeyGenerator(getMethod(sqlMethod), tableInfo, builderAssistant);                    keyProperty = tableInfo.getKeyProperty();                    keyColumn = tableInfo.getKeyColumn();                }            }        }        String sql = String.format(sqlMethod.getSql(), tableInfo.getTableName(), columnScript, valuesScript);        SqlSource sqlSource = languageDriver.createSqlSource(configuration, sql, modelClass);        return this.addInsertMappedStatement(mapperClass, modelClass, getMethod(sqlMethod), sqlSource, keyGenerator, keyProperty, keyColumn);    }    public InsertBatchSomeColumn setPredicate(final Predicate predicate) {        this.predicate = predicate;        return this;    }    private String getInsertSqlProperty(TableFieldInfo tableFieldInfo,final String prefix) {        String newPrefix = prefix == null ? "" : prefix;        String elPart = SqlScriptUtils.safeParam(newPrefix + tableFieldInfo.getEl());        //属性为空时使用默认值        String result =  SqlScriptUtils.convertIf(elPart,                String.format("%s != null", newPrefix + tableFieldInfo.getEl()),false)       + SqlScriptUtils.convertIf("default",                String.format("%s == null", newPrefix + tableFieldInfo.getEl()),false);        return result + ",";    }}

配置方法与原批量插入相同

    @Bean    public CommonSqlInjector commonSqlInjector () {        return new CommonSqlInjector();    }    public class CommonSqlInjector extends DefaultSqlInjector {        @Override        public List getMethodList(Class mapperClass, TableInfo tableInfo) {            List methodList =  super.getMethodList(mapperClass, tableInfo);            methodList.add(new InsertBatchSomeColumn("insertBatchSomeColumn")); // 添加InsertBatchSomeColumn方法            return methodList;        }    }

来源地址:https://blog.csdn.net/xiananliu/article/details/129799731

阅读原文内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     813人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     354人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     318人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     435人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     224人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-数据库
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯