批量插入我理解为拼sql语句 如:insert value (),(),() ; ,请问JDBC批量更新在数据库中的执行逻辑是什么样的,求解惑。
建立一个连接,然后分别执行你的insert语句,最后再提交
JDBC批量更新允许在一次数据库交互中执行多个更新操作,以提高性能和减少与数据库的通信次数。执行逻辑大致有下面的步骤:
创建一个 Connection
对象:首先,需要使用 JDBC API 建立一个到数据库的连接,并创建一个 Connection
对象。
打开一个事务:为了确保批量更新的原子性和可回滚性,通常会在批量更新之前开启一个事务。通过 connection.setAutoCommit(false)
将自动提交设置为 false 来启用事务。
创建一个 Statement
或 PreparedStatement
对象:这两个对象都用于执行 SQL 语句。如果 SQL 语句是静态的并且不需要动态参数,可以使用 Statement
对象。如果 SQL 语句包含动态参数,可以使用 PreparedStatement
对象,并使用 ?
占位符来表示参数。
添加批量更新的 SQL 语句:使用 addBatch()
方法将 SQL 语句添加到批处理队列中。可以多次调用 addBatch()
方法,以添加要在批量更新中执行的多个 SQL 语句。
执行批量更新:使用 executeBatch()
方法来执行批次中的所有 SQL 语句。此方法将返回一个整数数组,其中包含每个 SQL 语句所影响的行数。
提交事务或回滚事务:根据操作的结果,可以选择提交事务或回滚事务。如果所有更新成功,则使用 connection.commit()
提交事务。如果出现错误或某些更新失败,则使用 connection.rollback()
回滚事务。
关闭连接和相关资源:在批量更新结束后,关闭数据库连接、Statement
或 PreparedStatement
对象以及其他打开的数据库资源。
这是 JDBC 批量更新的基本逻辑。
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
为了保险起见查看一下数据库中的学生表
JDBC批量更新的执行逻辑及步骤如下:
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;
}
// 获取请求类型的参数
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");
}
<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的批量更新功能,并将多条数据一次性插入到数据库中。每次插入的数据量可以根据实际需求进行调整。如果还有其他问题,或者需要进一步了解,请及时告知。