使用mybatis在测试类中往数据库插入数据但是表里没有数据

在使用Mybatis进行数据库操作时,遇到测试类中数据插入成功但实际表内无数据的问题。原因在于未提交事务。解决方法包括在关闭SqlSession前调用commit(),或者使用自定义的MybatisUtil工具类,通过getSession()方法自动提交事务。提供了一个MybatisUtil工具类的示例代码。

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

标题使用mybatis在测试类中往数据库插入数据但是表里没有数据的原因

在这里插入图片描述
在这里插入图片描述
测试完之后控制台输出正确但是表里没有数据

  • 原因:没有提交事务,
  • 解决方法1:在sqlsession.close()之前加入sql.commit()语句
    在这里插入图片描述问题解决
  • 解决方法2:定义一个Mybatis工具类,在工具类中定义一个静态方法,返回的方法参数中设为true
    工具类如下:
package com.zhang.util;

import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;

import java.io.IOException;
import java.io.InputStream;

public class MybatisUtil {
    //sqlSessionFactory-->sqlSession
    private static SqlSessionFactory sqlSessionFactory;

    static {
        try {
            //使用mybatis第一步:获取sqlSessionFactory对象
            String resource = "mybatis-config.xml";
            InputStream inputStream = Resources.getResourceAsStream(resource);
            sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
    public static SqlSession getSession(){
        return sqlSessionFactory.openSession(true);
    }

}

<think>好的,我现在需要解决用户的问题,就是如何将Java中的List分批,每次插入10条到数据库。用户提到了分页和批量插入,还给出了两个参考引用,我需要仔细看看这些引用,然后结合自己的知识来给出正确的解决方案。 首先,用户提供的引用[1]是关于MySQL JDBC连接的配置,里面有一些参数比如useUnicode、characterEncoding、allowMultiQueries和rewriteBatchedStatements=true。我记得rewriteBatchedStatements这个参数对于批量插入很重要,启用后可以让JDBC将多个插入语句打包成一个批量操作,提高性能。所以在代码中配置这个参数是必要的。 引用[2]中的代码示例展示了一个分批插入的方法,其中根据列的大小和每批200条来计算分批次的数量。不过用户希望的是每次插入10条,所以需要调整这个逻辑。原来的例子用了400和200,可能有些计算上的问题,但用户的需求是每次10条,所以分批次的大小应该是10。 接下来,我需要考虑如何将List分割成每10个元素一组。Java中可以使用循环或者现有的工具类来处理。例如,使用subList方法,从起始索引开始,每次取10条,直到处理完整个列。同时,分页的计算需要考虑余数的情况,比如总共有25条数据,分成3批,前两批各10条,最后一批5条。 然后是关于JDBC的批量插入操作。用户可能使用的是原生的JDBC,或者像MyBatis这样的ORM框架。这里以原生JDBC为例,需要先创建连接,准备预处理语句,然后循环添加每一批的数据,最后执行批量操作。注意要使用addBatch()和executeBatch()方法,并且在连接字符串中启用批处理优化参数。 另外,事务管理也是一个需要注意的点。如果希望在插入过程中出现错误时回滚所有操作,应该将批量插入放在一个事务中。即关闭自动提交,在全部批次执行成功后再提交,否则回滚。 可能的代码结构大致如下:确定列大小,计算总批次数,循环处理每个批次,使用subList获取当前批的数据,然后遍历这一批数据,设置预处理语句的参数,添加到批处理中,最后执行批处理。同时,处理可能的异常,并关闭资源。 需要注意的是,每次批处理执行后应该清空批处理队列,避免重复提交。另外,如果使用连接池,要确保正确释放连接回池中。 用户可能还关心效率问题,比如为什么选择10条一次,是否可以调整这个数值。一般来说,批处理的大小需要根据数据库和网络的情况来调整,过大的批处理可能导致内存问题,过小则增加网络开销。10条可能是一个测试值,实际可以调整到更合适的数值,比如100或500,根据性能测试结果决定。 最后,总结步骤应该是:配置JDBC连接参数,分割列为每10条一批,使用预处理语句和批处理操作执行插入,处理事务,异常处理和资源释放。同时提供示例代码,让用户能够直接参考实现。</think>要将Java中的List分批每次插入10条到数据库,可以按照以下步骤实现: ### 1. 分页逻辑实现 使用`subList()`方法分割List,计算公式: $$总批次数 = \left\lceil \frac{列长度}{每批数量} \right\rceil$$ 示例代码: ```java public void batchInsert(List<YourEntity> dataList) { int batchSize = 10; int total = dataList.size(); int batches = (total + batchSize - 1) / batchSize; // 向上取整 for (int i = 0; i < batches; i++) { int from = i * batchSize; int to = Math.min((i+1)*batchSize, total); List<YourEntity> subList = dataList.subList(from, to); insertBatch(subList); } } ``` ### 2. 批量插入优化 在JDBC连接字符串中添加关键参数[^1]: ```java String url = "jdbc:mysql://host/db?rewriteBatchedStatements=true&useServerPrepStmts=false"; ``` ### 3. 使用PreparedStatement批量操作 ```java private void insertBatch(List<YourEntity> batch) { String sql = "INSERT INTO table (col1, col2) VALUES (?, ?)"; try (Connection conn = dataSource.getConnection(); PreparedStatement pstmt = conn.prepareStatement(sql)) { conn.setAutoCommit(false); for (YourEntity item : batch) { pstmt.setString(1, item.getCol1()); pstmt.setInt(2, item.getCol2()); pstmt.addBatch(); } pstmt.executeBatch(); conn.commit(); } catch (SQLException e) { // 处理异常 } } ``` ### 4. 事务管理建议 - 建议关闭自动提交`conn.setAutoCommit(false)` - 批处理执行后统一提交`conn.commit()` - 发生异常时执行`conn.rollback()`
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值