Mybatis Provider注解实现批量插入

这篇博客介绍了如何利用MyBatis的Provider特性创建一个通用的批量插入接口。通过Mapper接口定义批量插入方法,并在Provider中动态生成SQL语句,实现了根据实体类动态获取表名和字段,构建插入语句。最终生成的SQL类似`insert into my_table (col1, col2, col3) values (val1, val2, val3), (val1, val2, val3), ...`,有效地处理了批量数据的插入操作。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

需求

借助mybatis 的provider实现一个比较通用的,批量插入数据接口。

Mapper接口

第一参数为需要批量插入的数据,第二个参数为对应实体类的class

    public interface BaseDao<T> {
        @InsertProvider(type = BaseProvider.class, method = "batchInsert")
        int batchInsert(@Param("lists") List<T>lists, Class<T>clazz);
    }

Provider

工具类代码未贴。

主要是获取表名、获取数据库字段相关的类。

    public <T> String batchInsert(List<T>lists, Class<T> clazz) {
        String tableName = getTableName(clazz);
        List<Field>declaredFields = getSupperDeclaredFields(clazz);
        if(lists == null || lists.size() == 0) {
            return null;
        }
        StringBuilder sql = new StringBuilder();
        sql.append("insert into ").append(tableName);

        //value的格式
        StringBuilder pattern = null;
        //列
        StringBuilder cols = null;
        for (Field declaredField : declaredFields) {
            String name = declaredField.getName();

            if(cols == null) {
                cols = new StringBuilder(" ( " + name);
            }else {
                cols.append(" , ").append(name);
            }

            if(pattern == null) {
                pattern = new StringBuilder("(#'{'lists[{0}]." + name + "} ");
            } else {
                pattern.append(", #'{'lists[{0}].").append(name).append("} ");
            }

        }

        if(pattern == null) {
            return null;
        }

        pattern.append(")");
        cols.append(" ) values ");
        sql.append(cols);

        MessageFormat mf = new MessageFormat(pattern.toString());

        //填充value参数
        for (int i = 0; i < lists.size(); i++) {
            sql.append(mf.format(new Object[] {i})).append(" ,");
        }

        sql.deleteCharAt(sql.length() - 1);
        return sql.toString();
    }

代码解析

我们最后要拼装的sql大概这样

insert into my_table ( col1, col2, col3)  values  (val1, val2, val3), (val1, val2, val3), (val1, val2, val3)

比较关键的地方在于values后面的n个数据列表。

我的做法是是先构建一个模板:(这里的参数0表示占位符)

(#{lists[0].fieldName},  #{lists[0].fieldName}, #{lists[0].fieldNames})

当然,具体有多少个字段是不知道的,需要用循环构建。

得到pattern后,构建一个MessageFormat对象。

MessageFormat mf = new MessageFormat(pattern.toString());

然后循环的给模板赋值,并将得到的结果拼装到最终的sql中。

        for (int i = 0; i < lists.size(); i++) {
            sql.append(mf.format(new Object[] {i})).append(" ,");
        }

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值