首页 > 代码库 > MyBatis批量增删改的另外一种思路(推荐)

MyBatis批量增删改的另外一种思路(推荐)

零、传统拼接SQL语句的弊端

传统上利用Mybatis进行批量操作的方式本质来说是拼接SQL语句,然后交给底层执行,如之前博文而言。
其实这种方式是存在弊端的:
1. SQL语句可能会过长,DB的引擎可能不支持。
2. MyBatis拼接耗费资源不说还容易写错。

一、新思路

使用JDBC底层的batch进行批量操作
1. 先添加如下xml,注册一个batchSession
<!--
        单独配置一个执行JDBC批量操作的session,底层等于sqlSessionFactory.openSession(ExecutorType.BATCH); 
        底层使用org.apache.ibatis.executor.BatchExecutor作为执行引擎
-->
<bean id="batchSqlSessionTemplate" class="org.mybatis.spring.SqlSessionTemplate">
    <constructor-arg index="0" ref="sqlSessionFactory"/>
    <constructor-arg index="1" value="BATCH"/>
</bean>
2. 使用注入
/** 注入批处理SqlSessionTemplate */
    @Autowired
    private SqlSessionTemplate batchSqlSessionTemplate;

    //这里的Transactionl一定要加,底层实现是命中SQL和Statement,必须使用的是同一个Connection
    /**
     * 批量 insert
     * @param models
     * @return
     */
    @Transactional
    public int batchcInsert(List<Model> models){
        int result = 0;
        BaseMapper<Model> modelMapper = (BaseMapper<Model>) batchSqlSessionTemplate.getMapper(mapperClass);
        for (Model model:models) {
            result += modelMapper.insert(model);
        }
        return result;
    }
    
    //这里的Transactionl一定要加,底层实现是命中SQL和Statement,必须使用的是同一个Connection
    /**
     * 批量update
     * @param models
     * @return
     */
    @Transactional
    public int batchcUpdate(List<Model> models){
        BaseMapper<Model> modelMapper = (BaseMapper<Model>) batchSqlSessionTemplate.getMapper(mapperClass);
        int result = 0;
        for (Model model:models) {
            result += modelMapper.update(model);
        }
        return result;
    }
    
    // 批量删除delete

 

MyBatis批量增删改的另外一种思路(推荐)