已经封装好的通用的批处理语句:
import java.io.FileNotFoundException; import java.io.FileReader; import java.io.IOException; import java.sql.*; import java.util.Properties;
/**
- 是一个工具类:
- 作用:用于封装通用的获取连接、通用的增删改、通用的查询
- 版本:v0.0.0.1
- 方法:getConn();
-
close();
- 问题:
-
OCP:对扩展开放,对修改的关闭;
-
现在数据库myjdbc,该库名,修改代码;用户 名 密码要改,也需要修改代码.
- 升级:
-
需要读取到db.properties的文件的内容;
-
需要的技术:io
-
Properties集合类;
*/ public class JDBCUtilTwo { //成员变量; static Properties prop=new Properties(); static String className=null; static String url=null; static String uname=null; static String pwd=null; //1.静态代码块,加载数据库的驱动,此处是mysql驱动; static { try { FileReader reader=new FileReader("db.properties"); prop.load(reader); //getProperty():获取的从文件读取的key; className=prop.getProperty("className"); url=prop.getProperty("url"); uname=prop.getProperty("uname"); pwd=prop.getProperty("pwd");
Class.forName(className);
} catch (ClassNotFoundException | FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
//2.获取链接;获取一个连接对象;
public static Connection getConn(){
Connection connection = null;
try {
connection = DriverManager.getConnection(url, uname, pwd);
} catch (SQLException e) {
e.printStackTrace();
}
return connection;
}
//3.关闭对象,结果集对象、语句对象、链接对象;
public static void close(ResultSet rs, Statement st, Connection conn){
if(rs!=null) {
try {
rs.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
if(st!=null)
try {
st.close();
} catch (SQLException e) {
e.printStackTrace();
}
if(conn!=null)
try {
conn.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
普通插入方式,耗时比较长:
/** * 执行时间:23 9786毫秒 * @throws SQLException */ @Test public void test021() throws SQLException { Connection conn = JDBCUtilTwo.getConn(); //常规语句对象+普通方式 Statement st = conn.createStatement(); //1万条数据; long startTime=System.currentTimeMillis(); for (int i = 5; i < 10005; i++) { String sql="insert t_user(username,passworld)values('tom','tom')"; st.executeUpdate(sql); }
st.close();
conn.close();
long endTime=System.currentTimeMillis();
System.out.println("执行时间:"+(endTime-startTime)+"毫秒");
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
Statement方式添加批处理,时间还比较慢。
/** * 使用批处理来进行操作; * 执行时间:21 4194毫秒 2468毫秒 * @throws SQLException */ @Test public void test022() throws SQLException { Connection conn = JDBCUtilTwo.getConn(); //设置链接,自动提交事务为false。 conn.setAutoCommit(false); //常规语句对象+普通方式 Statement st = conn.createStatement(); //1万条数据; String sql="insert t_user(username,passworld)values('tom','tom')";
long startTime=System.currentTimeMillis();
for (int i = 1; i <10010 ; i++) {
//将sql语句,添加到批处理里面;
st.addBatch(sql);
//在某个时间节点,执行一次批处理;
if(i%2000==0) {
st.executeBatch(); //执行批处理
st.clearBatch(); //清空一下批处理;
}
}
st.executeBatch(); //执行批处理
st.clearBatch(); //清空一下批处理;
//提交事务;
conn.commit();
JDBCUtilTwo.close(null,st,conn);
long endTime=System.currentTimeMillis();
System.out.println("执行时间:"+(endTime-startTime)+"毫秒");
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
时间还比较慢:可以在配置文件,修改mysql批处理为true。
className=com.mysql.cj.jdbc.Driver url=jdbc:mysql://localhost:3306/myjdbc?rewriteBatchedStatements=true uname=root pwd=root
1
2
3
4
再修改事务自动提交为false,会大幅度提交效率。
预编译语句方式,批处理:
/** * 执行时间:22 0170毫秒 1711毫秒 * @throws SQLException */ @Test public void test023() throws SQLException { Connection conn = JDBCUtilTwo.getConn(); String sql="insert t_user(username,passworld)values(?,?)"; PreparedStatement pst = conn.prepareStatement(sql);
long startTime=System.currentTimeMillis();
for (int i = 2; i < 10002; i++) {
pst.setString(1,"u"+i);
pst.setString(2,"p"+i);
//添加到批处理里面;
pst.addBatch();
if(i%2000==0){
pst.executeBatch();
pst.clearBatch();
}
}
pst.executeBatch();
pst.clearBatch();
JDBCUtilTwo.close(null,pst,conn);
long endTime=System.currentTimeMillis();
System.out.println("执行时间:"+(endTime-startTime)+"毫秒");
}
————————————————
标签:JDBC,PreparedStatement,SQLException,static,pst,Statement,close,null,conn From: https://blog.51cto.com/teayear/7079362