关于JDBC的批量更新的疑问

关于JDBC的批量更新的疑问

批量插入我理解为拼sql语句 如:insert value (),(),() ; ,请问JDBC批量更新在数据库中的执行逻辑是什么样的,求解惑。

建立一个连接,然后分别执行你的insert语句,最后再提交

JDBC批量更新允许在一次数据库交互中执行多个更新操作,以提高性能和减少与数据库的通信次数。执行逻辑大致有下面的步骤:

  1. 创建一个 Connection 对象:首先,需要使用 JDBC API 建立一个到数据库的连接,并创建一个 Connection 对象。

  2. 打开一个事务:为了确保批量更新的原子性和可回滚性,通常会在批量更新之前开启一个事务。通过 connection.setAutoCommit(false) 将自动提交设置为 false 来启用事务。

  3. 创建一个 StatementPreparedStatement 对象:这两个对象都用于执行 SQL 语句。如果 SQL 语句是静态的并且不需要动态参数,可以使用 Statement 对象。如果 SQL 语句包含动态参数,可以使用 PreparedStatement 对象,并使用 ? 占位符来表示参数。

  4. 添加批量更新的 SQL 语句:使用 addBatch() 方法将 SQL 语句添加到批处理队列中。可以多次调用 addBatch() 方法,以添加要在批量更新中执行的多个 SQL 语句。

  5. 执行批量更新:使用 executeBatch() 方法来执行批次中的所有 SQL 语句。此方法将返回一个整数数组,其中包含每个 SQL 语句所影响的行数。

  6. 提交事务或回滚事务:根据操作的结果,可以选择提交事务或回滚事务。如果所有更新成功,则使用 connection.commit() 提交事务。如果出现错误或某些更新失败,则使用 connection.rollback() 回滚事务。

  7. 关闭连接和相关资源:在批量更新结束后,关闭数据库连接、StatementPreparedStatement 对象以及其他打开的数据库资源。

这是 JDBC 批量更新的基本逻辑。

  • 你可以参考下这个问题的回答, 看看是否对你有帮助, 链接: https://ask.csdn.net/questions/1063356
  • 这篇博客你也可以参考下:JDBC查询数据库时出现 sql语句正确,但是查询英文可以,汉字不行的情况解决办法
  • 除此之外, 这篇博客: Java中JDBC的本质及使用详解(妹子看了都说好!!!)中的 2.不需要处理查询结果集的JDBC实例(执行的sql语句是为增、删、改时) 部分也许能够解决你的问题, 你可以仔细阅读以下内容或跳转源博客中阅读:
  • JavaBean 还有数据表我就继续用上面准备好的就行。
    这里我只演示“增”(即向学生表中添加一条数据),其他的“删”和“改”基本过程都一样,只有sql语句和站位符位置不一样,留给大家自由探索

    代码如下(示例):

    import java.sql.Connection;
    import java.sql.DriverManager;
    import java.sql.PreparedStatement;
    import java.sql.SQLException;
    
    public class JDBCAddTest {
    
    	public static void main(String[] args) {
    		JDBCAddTest jdbcAddTest = new JDBCAddTest();
    		jdbcAddTest.addStudent();
    
    	}
    
    	private void addStudent() {
    		Connection connection = null;
    		PreparedStatement preparedStatement = null;
    		try {
    			// 1、启动驱动
    			Class.forName("com.mysql.jdbc.Driver");
    			// 2、建立连接
    			connection = DriverManager.getConnection("jdbc:mysql://localhost:3306/mydb", "root", "123456");
    			// 3、获取数据库操作对象
    			Student student = new Student(5, "jack");
    			String sql = "insert into student values(?,?)";
    			preparedStatement = connection.prepareStatement(sql);
    			preparedStatement.setString(2, student.getStudentName());
    			preparedStatement.setInt(1, student.getStudentID());
    			// 4、执行sql语句
    			int executeUpdate = preparedStatement.executeUpdate();
    			System.out.println(executeUpdate);
    		} catch (Exception e) {
    			e.printStackTrace();
    		} finally {
    			// 6、关闭资源
    			if (preparedStatement != null) {
    				try {
    					preparedStatement.close();
    				} catch (SQLException e) {
    					e.printStackTrace();
    				}
    				preparedStatement = null;
    			}
    
    			if (connection != null) {
    				try {
    					connection.close();
    				} catch (SQLException e) {
    					e.printStackTrace();
    				}
    				connection = null;
    			}
    		}
    		
    	}
    
    }
    

    代码如下(输出):

    这里输出的1代表的是数据库中有一条数据受到了影响(如果是其他的数值的返回对相应的就是数据库中有几条数据被影响了)

    1
    

    为了保险起见查看一下数据库中的学生表
    在这里插入图片描述

  • 您还可以看一下 孔德孟老师的Java数据库编程JDBC入门实战案例课程中的 采用自带客户端创建表并进行SQL编程小节, 巩固相关知识点
  • 以下回答由chatgpt基于相关博客总结生成:

    JDBC批量更新的执行逻辑及步骤如下:

    1. 在dao层的add方法中,需要修改为批量插入的形式,使用PreparedStatement的addBatch()方法和executeBatch()方法来实现。具体代码如下所示:
    public int add(List<User> userList) {
        Connection conn = null;
        PreparedStatement ps = null;
        try {
            // 1.加载驱动程序
            Class.forName("com.mysql.jdbc.Driver");
            // 2.获得数据库链接
            conn = DriverManager.getConnection(url, userName, password);
            sql = "insert into t_user(name,age)values(?,?) ";
            // 3.通过数据库的连接操作数据库,实现增删改查
            ps = conn.prepareStatement(sql);
    
            for(User user : userList) {
                ps.setString(1, user.getName());
                ps.setInt(2, user.getAge());
                // 添加到批处理中
                ps.addBatch();
            }
    
            // 执行批处理
            int[] result = ps.executeBatch();
    
            return result.length;
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            try {
                ps.close();
                conn.close();
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
        return 0;
    }
    
    1. 在servlet层的代码中,需要修改添加用户的方法,将单次添加改为批量添加。具体代码如下所示:
    // 获取请求类型的参数
    String task = request.getParameter("task");
    if ("batchAdd".equals(task)) {
        // 表示批量添加用户
        List<User> userList = new ArrayList<>();
        // 从form表单中获取需要添加的用户信息
        String[] names = request.getParameterValues("name");
        String[] ages = request.getParameterValues("age");
    
        for(int i=0; i<names.length; i++) {
            User user = new User();
            user.setAge(Integer.parseInt(ages[i]));
            user.setName(names[i]);
            userList.add(user);
        }
    
        // 调用service的批量添加方法
        userService.batchAdd(userList);
        // 让用户重新查询一次
        response.sendRedirect(request.getContextPath() + "/userServlet");
    }
    
    1. 修改add.jsp页面的表单,添加多个输入框来支持批量添加。具体代码如下所示:
    <h1>批量添加用户信息</h1>
    <form action="userServlet?task=batchAdd" method="post">
        姓名:<input type="text" name="name[]"><br>
        年龄:<input type="text" name="age[]"><br>
        姓名:<input type="text" name="name[]"><br>
        年龄:<input type="text" name="age[]"><br>
    
        <!-- 可以根据需求继续添加更多输入框 -->
    
        <input type="submit" value="提交">
    </form>
    

    通过以上步骤,就可以实现JDBC的批量更新功能,并将多条数据一次性插入到数据库中。每次插入的数据量可以根据实际需求进行调整。如果还有其他问题,或者需要进一步了解,请及时告知。