在JDBC2.0之后对于整个的数据库操作多出了如下的几个核心内容:
- 可滚动结果集:传统的ResultSet只能够由前向后获取数据,但是在新版本里面ResultSet可以直接定位数据,还可以实现前后滚动,或者直接采用分页的方式来进行处理,但是这样的操作有一个前提:你需要将数据库中的所有数据保存在内存;
- 结果集更新操作:可以直接利用ResultSet实现数据的增加、修改、删除的操作;
- 数据批处理:可以同时利用JDBC向数据库中每条命令执行的时候进行若干次的更新。
如果要想实现批处理的操作,主要可以靠Statement接口、PreparedStatement 接口来实现,首先来观察接口中所提供的方法:
- Statement
- 增加批处理:public void addBatch(String sql) throws SQLException;
- 执行批处理:public int[] executeBatch() throws SQLException;
- PreparedStatement
public void addBatch() throws SQLException
不管现在使用的是Statement 接口还是PreparedStatement接口最终执行批处理的时候都会使用“executeBatch()"方法完成。
此时批处理操作返回的数据类型是一个整型数组,接收所有更新的返回结果,对于每一条更新的结果在JDBC中给出了若干常量:
- 执行成功:public static int SUCCESS_ NOINFO = -3;
- 执行失败:public static int EXECUTE_FAILED = -2;
对于批处理的返回结果有两类,以上的常量的内容为第1类,但是如果使用的是MySQL数据库,则返回的常量内容就是每条更新语句所影响到的数据行数。
范例:通过Statement实现批处理
import java.sql.*;
import java.util.Arrays;
public class PreparedStatmentDemo {
public static final String DRIVER = "com.mysql.cj.jdbc.Driver"; //数据库的驱动程序
public static final String URL="jdbc:mysql://localhost:3306/yootk"; //连接地址
public static final String USER = "root"; //用户名
public static final String PASSWORD = "mysqladmin"; //密码
public static void main(String[] args) throws Exception{
long currentPage = 1; //当前所在页
int lineSize = 2; //每页获取的数据行
String column = "name"; //查询列名称,而不是数据
String keyword = "李"; //模糊关键字
Class.forName(DRIVER); //将数据的驱动程序加载到容器内部
Connection connection = DriverManager.getConnection(URL,USER,PASSWORD); //获取数据库的连接
Statement statement = connection.createStatement();
//追加批处理
statement.addBatch("INSERT INTO user (name) VALUE ('张三')");
statement.addBatch("INSERT INTO user (name) VALUE ('李四')");
statement.addBatch("INSERT INTO user (name) VALUE ('王五')");
statement.addBatch("DELETE FROM user");
int[] result = statement.executeBatch(); //执行批处理
System.out.println("【批处理结果】:"+ Arrays.toString(result));
connection.close(); //关闭连接
}
}
【批处理结果】:[1, 1, 1, 6]
如果现在使用的是PreparedStatement实现数据的批处理的操作,那么在程序执行的过程之中对于预处理就必须使用相同的SQL命令,但是不同的语句有不同的数据而已。
范例:通过PreparedStatement实现预处理操作
import java.sql.*;
import java.util.Arrays;
public class PreparedStatmentDemo {
public static final String DRIVER = "com.mysql.cj.jdbc.Driver"; //数据库的驱动程序
public static final String URL="jdbc:mysql://localhost:3306/yootk"; //连接地址
public static final String USER = "root"; //用户名
public static final String PASSWORD = "mysqladmin"; //密码
public static void main(String[] args) throws Exception{
long currentPage = 1; //当前所在页
int lineSize = 2; //每页获取的数据行
String column = "name"; //查询列名称,而不是数据
String keyword = "李"; //模糊关键字
Class.forName(DRIVER); //将数据的驱动程序加载到容器内部
Connection connection = DriverManager.getConnection(URL,USER,PASSWORD); //获取数据库的连接
String sql = "INSERT INTO user (name) VALUE (?)";
PreparedStatement sta = connection.prepareStatement(sql);
for (int i = 0; i < 10; i++) {
sta.setObject(1,"王五-"+i);
sta.addBatch();//追加批处理
}
int[] result = sta.executeBatch(); //执行
System.out.println("【批处理结果】:"+ Arrays.toString(result));
connection.close(); //关闭连接
}
}
【批处理结果】:[1, 1, 1, 1, 1, 1, 1, 1, 1, 1]
如果在日后你在求职的过程之中有人询问你面对于大规模的数据写入你该怎么做?单独说数据库保存这一功能来讲, 一定要通过原生的JDBC技术实现批处理。