tk.mybatis的批量插入扩展

当前的tkmybatis插件,默认的批量插入功能,是需要自动生成主键的(tk.mybatis.mapper.common.special.InsertListMapper),不能通过调用者自己指派主键的形式。经过分析和改造后,在原来InsertListMapper的形式上,额外扩展了允许自己指派主键的批量插入。代码如下:

第一步:创建InsertListExtMapper接口,注意接口上要增加@RegisterMapper注解

import org.apache.ibatis.annotations.InsertProvider;
import org.apache.ibatis.annotations.Options;
import org.apache.poi.ss.formula.functions.T;
import tk.mybatis.mapper.provider.SpecialProvider;

import java.util.List;

@tk.mybatis.mapper.annotation.RegisterMapper
public interface InsertListExtMapper<T> {
    /**
     * 批量插入全部字段,包括主键
     * @param recordList 数据列表
     * @return
     */
    @InsertProvider(type = SpecialSqlExtProvider.class, method = "dynamicSQL")
    int insertListAllFied(List<? extends T> recordList);
}

第二步:创建SpecialSqlExtProvider类,用于提供动态批量语句的生成


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;

/**
 * 专用sql扩展提供者。扩展tk.mybatis类。
 */
public class SpecialSqlExtProvider extends MapperTemplate {
    public SpecialSqlExtProvider(Class<?> mapperClass, MapperHelper mapperHelper) {
        super(mapperClass, mapperHelper);
    }

    /**
     * 批量插入所有字段,包括主键。
     *
     * @param ms
     */
    public String insertListAllFied(MappedStatement ms) {
        final Class<?> entityClass = getEntityClass(ms);
        //开始拼sql
        StringBuilder sql = new StringBuilder();
        sql.append("<bind name=\"listNotEmptyCheck\" value=\"@tk.mybatis.mapper.util.OGNL@notEmptyCollectionCheck(list, '" + ms.getId() + " 方法参数为空')\"/>");
        sql.append(SqlHelper.insertIntoTable(entityClass, tableName(entityClass)));
        sql.append(SqlHelper.insertColumns(entityClass, false, false, false));
        sql.append(" VALUES ");
        sql.append("<foreach collection=\"list\" item=\"record\" separator=\",\" >");
        sql.append("<trim prefix=\"(\" suffix=\")\" suffixOverrides=\",\">");
        //获取全部列
        Set<EntityColumn> columnList = EntityHelper.getColumns(entityClass);
        for (EntityColumn column : columnList) {
            if (column.isInsertable()) {
                sql.append(column.getColumnHolder("record") + ",");
            }
        }
        sql.append("</trim>");
        sql.append("</foreach>");

        // 反射把MappedStatement中的设置主键名
        EntityHelper.setKeyProperties(EntityHelper.getPKColumns(entityClass), ms);

        return sql.toString();
    }
}

第三步:将需要使用的Mapper接口继承InsertListExtMapper接口:

import tk.mybatis.mapper.common.BaseMapper;
import tk.mybatis.mapper.common.ConditionMapper;
import tk.mybatis.mapper.common.IdsMapper;
import tk.mybatis.mapper.common.special.InsertListMapper;

/**
 * Description: 定制版MyBatis Mapper插件接口,如需其他接口参考官方文档自行添加
 */
public interface MyMapper<T> extends BaseMapper<T>, ConditionMapper<T>, IdsMapper<T>, InsertListMapper<T>, InsertListExtMapper<T> {

}

然后启动,运行即可。

好的,下面是使用 tk.mybatis 进行批量插入的示例代码: 假设我们有一个 User 实体类,其中包含 id、name 和 age 三个属性: ```java public class User { private Long id; private String name; private Integer age; // 省略 getter 和 setter } ``` 现在我们需要批量插入一组用户数据,可以按照以下步骤进行: 1. 在 Mapper 接口中添加一个批量插入的方法: ```java @InsertProvider(type = BatchInsertProvider.class, method = "dynamicSQL") int batchInsert(List<User> userList); ``` 其中,方法的注解为 `@InsertProvider`,表示这是一个插入操作,`type` 参数指定了插入操作的提供者,这里使用了 tk.mybatis 提供的 `BatchInsertProvider`,`method` 参数指定了调用提供者中哪个方法来生成 SQL 语句。 2. 定义 BatchInsertProvider 类,并在其中添加一个 `batchInsert` 方法: ```java public class BatchInsertProvider { public String batchInsert(Map<String, Object> map) { List<User> userList = (List<User>) map.get("list"); StringBuilder sql = new StringBuilder(); sql.append("INSERT INTO user (name, age) VALUES "); for (int i = 0; i < userList.size(); i++) { sql.append("(#{list[").append(i).append("].name}, #{list[").append(i).append("].age})"); if (i != userList.size() - 1) { sql.append(","); } } return sql.toString(); } } ``` 其中,`Map` 参数中包含了一个名为 `list` 的键,对应了要插入的用户列表。在 `batchInsert` 方法中,我们将这个列表转换成一条 SQL 语句,使用 `StringBuilder` 拼接每个用户的信息。 3. 在 Service 中调用 Mapper 的批量插入方法: ```java @Service public class UserService { @Autowired private UserMapper userMapper; public int batchInsert(List<User> userList) { return userMapper.batchInsert(userList); } } ``` 在 Service 中,我们直接调用 Mapper 的批量插入方法,并将要插入的用户列表传入即可。 这样就完成了使用 tk.mybatis 进行批量插入的操作。需要注意的是,在 Mapper 中使用 `@InsertProvider` 注解进行插入操作时,需要使用 `dynamicSQL` 方法来生成动态 SQL 语句。同时,我们还需要手动添加实体类中的字段到 SQL 语句中,这里只添加了 `name` 和 `age` 两个字段,如果实体类中有更多的字段,需要手动添加
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值