MyBatis进阶八:Mybatis批处理;(批量插入,批量删除,批量更新待写…)

包括,【批量插入】,【批量删除】,【批量更新,待完成…】

目录

一:不使用批处理时,速度很慢,效率低(以插入为例)

(1)Mapper XML中的SQL语句

(2)测试代码:插入一万条数据;

二:批处理之:批量插入;(和一对比一下)

(1)Mapper XML中的SQL语句

(2)测试代码:批量插入一万条数据;

三:批处理的一些问题(以插入为例)

(1)问题1:因为是批量插入数据,无法获取到插入数据的id号:

(2)问题2:批量插入的时候,为了能够满足数据包大小的要求,有时需要采取【分组批量插入的策略】

问题说明:

问题解决案例代码(里面的if嵌套好多,以后改善吧)

四:批处理之:批量删除

(1)Mapper XML中的SQL语句

(2)测试代码:批量删除一万条数据;

五:批处理之:批量更新(待写……)


一:不使用批处理时,速度很慢,效率低(以插入为例)

(1)Mapper XML中的SQL语句

(2)测试代码:插入一万条数据;



/**
 * JUnit单元测试类
 */
public class MyBatisTestor {

    @Test
    public void testInsert1() throws Exception {
        SqlSession session = null;
        try {
            long st = new Date().getTime();
            session = MyBatisUtils.openSession();
            List list = new ArrayList();
            for(int i=0;i<10000;i++){
                Goods goods = new Goods();
                goods.setTitle("测试商品");
                goods.setSubTitle("测试子标题");
                goods.setOriginalCost(200f);
                goods.setCurrentPrice(100f);
                goods.setDiscount(0.5f);
                goods.setIsFreeDelivery(1);
                goods.setCategoryId(43);
                session.insert("goods.insert1", goods);

            }
            session.commit();
            long et = new Date().getTime();
            System.out.println("整个插入操作花费时间为:"+(et - st)+"毫秒。");

        } catch (Exception e) {
            if (session != null) {
                session.rollback();
            }
            throw e;
        }finally {
            MyBatisUtils.closeSession(session);
        }
    }
}

即上面代码的逻辑是每次只插入一条,一共调用了Mapper XML中的SQL一万次;

运行结果:


 

二:批处理之:批量插入;(和一对比一下)

利用集合保存数据,然后调用Mapper XML中的SQL语句,把这个集合作为参数传过去,实现批处理。

(1)Mapper XML中的SQL语句

    <!--
        insert into table(字段1,字段2) values(v1,v2),(v1,v2);
    -->
    <insert id="batchInsert" parameterType="java.util.List">
        insert into t_goods(title,sub_title,original_cost,current_price,discount,is_free_delivery,category_id)
        values
        <foreach collection="list" item="item" index="index" separator=",">
            (#{item.title},#{item.subTitle},#{item.originalCost},#{item.currentPrice},#{item.discount},#{item.isFreeDelivery},#{item.categoryId})
        </foreach>
    </insert>

说明:

(1)parameterType设置成List

(2)插入多条数据,(insert语句的用法可以参考MySQL对数据的基本操作二:INSERT语句(INSERT语句方言,IGNORE关键字,子查询查询整条记录后插入)

 

### MyBatis 进阶用法与最佳实践 MyBatis 是一种用于 Java 应用程序的持久化框架,它简化并加速了与关系型数据库(SQL 数据库)的工作流程[^1]。以下是有关 MyBatis 的一些高级用法和最佳实践: #### 动态 SQL 动态 SQL 是 MyBatis 中非常强大的功能之一,允许开发者根据条件构建灵活的查询语句。通过 `<if>`、`<choose>` 和其他标签可以实现复杂的逻辑。 ```xml <select id="findActiveBlogWithTitleLike" parameterType="map" resultType="Blog"> SELECT * FROM BLOG WHERE state = 'ACTIVE' <if test="title != null"> AND title like #{title} </if> </select> ``` 上述代码展示了如何基于参数是否存在来调整查询条件[^2]。 #### 缓存机制 MyBatis 提供了一级缓存(Session 级别)和二级缓存(Mapper 级别)。合理配置缓存能够显著提升性能,减少不必要的数据库访问次数。 启用二级缓存的方法如下所示,在 Mapper 文件中加入 `cache` 配置即可开启全局范围内的数据共享存储能力[^3]: ```xml <mapper namespace="com.example.mapper.BlogMapper"> <!-- Enable second level cache --> <cache/> ... </mapper> ``` #### 批量操作优化 当执行大量插入或者更新时,批量处理能有效降低网络开销以及提高吞吐率。利用 JDBC 的批处理特性配合 MyBatis 实现高效的数据同步过程[^4]。 示例代码片段展示了一个简单的批量插入方法: ```java public void batchInsert(List<User> users){ SqlSession session = sqlSessionFactory.openSession(ExecutorType.BATCH); try { UserMapper mapper = session.getMapper(UserMapper.class); for (User user : users) { mapper.insert(user); // No commit until flushStatements is called. } session.commit(); // Commit all statements at once after loop completes successfully. } finally { session.close(); } } ``` #### 使用注解替代 XML 映射文件 对于小型项目而言,采用注解方式定义 SQL 可以让代码更加紧凑简洁;然而需要注意的是复杂场景下仍推荐坚持传统 XML 方式以便维护可读性和灵活性[^5]. ```java @Select("SELECT * FROM blog WHERE id = #{id}") Blog selectBlogById(int id); ``` ---
评论 7
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值