栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

基于Mybatis-Plus实现DuplicateKeyUpdateMapper

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

基于Mybatis-Plus实现DuplicateKeyUpdateMapper

Yohann-study 基于Mybatis-Plus实现DuplicateKeyUpdateMapper 思路
  • 参考Mybatis-Plus方法生成策略(com.baomidou.mybatisplus.core.injector.methods.Update)

  • 参考MySQL的INSERT INTO ON DUPLICATE KEY UPDATE语法

  • 生成动态SQL脚本模板

创建数据表
CREATE TABLE `test_entity`
(
    `id`   int(11) NOT NULL AUTO_INCREMENT,
    `name` varchar(20) DEFAULT NULL,
    `age`  int(11)     DEFAULT NULL,
    PRIMARY KEY (`id`)
) ENGINE = InnoDB
  DEFAULT CHARSET = utf8mb4
定义实体
@Data
public class TestEntity {
    
    @TableId
    private Integer id;
    
    private String name;
    
    private Integer age;
}
定义Mapper接口
  • 注意需要继承BaseMapper
public interface DuplicateKeyUpdateMapper extends BaseMapper {

    
    int duplicateKeyUpdate(List list);

}
动态SQL实现
public class DuplicateKeyUpdateMethod extends AbstractMethod {

    @Override
    public MappedStatement injectMappedStatement(Class mapperClass, Class modelClass, TableInfo tableInfo) {
        //脚本模板
        String sql = "";
        //字段list(除了主键)
        List fieldList = tableInfo.getFieldList();
        //全部字段
        List allFieldName = fieldList.stream()
                .map(TableFieldInfo::getColumn)
                .collect(Collectors.toList());
        allFieldName.add(0, tableInfo.getKeyColumn());

        //生成所需的sql片段
        String fieldNames = String.join(", ", allFieldName);
        String insertFields = allFieldName.stream()
                .map(field -> "#{item." + field + "}")
                .collect(Collectors.joining(", "));
        insertFields = "(" + insertFields + ")";
        String updateFields = fieldList.stream()
                .map(field -> {
                    String column = field.getColumn();
                    return column + "=values(" + column + ")";
                })
                .collect(Collectors.joining(",n"));

        //生成具体脚本
        String sqlResult = String.format(sql, tableInfo.getTableName(), fieldNames, insertFields, updateFields);
        SqlSource sqlSource = languageDriver.createSqlSource(configuration, sqlResult, modelClass);
        return this.addUpdateMappedStatement(mapperClass, modelClass, "duplicateKeyUpdate", sqlSource);
    }

}
注入自定义Mapper
public class MyBatisPlusConfig {

    @Bean
    public DefaultSqlInjector myLogicSqlInjector() {
        return new DefaultSqlInjector() {
            @Override
            public List getMethodList(Class mapperClass) {
                List methodList = super.getMethodList(mapperClass);
                methodList.add(new DuplicateKeyUpdateMethod());
                return methodList;
            }
        };
    }
}
转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/930037.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号