说明:
数据库:mysql
库名:test
表名:user
字段:name varchar(50);id int.
一、JDBC
我们知道,要做一个jdbc查询操作要经历如下步骤:
1、加载类驱动
Class.forName("com.mysql.jdbc.Driver");
2、获取连接connection
String user = "root";
String pass = "root";
String url = "jdbc:mysql://localhost:3306/test";
Connection conn = DriverManager.getConection(user, pass, url);
3、创建语句对象
Statement stmt = conn.CreateStatment();
4、执行jdbc操作(比如执行查询),并获得结果集
ResultSet rs = stmt.executeQuery("select name, id from user");
5、遍历结果集
while(rs.next()){
String name = rs.getString(1);
Integer id = rs.getInt(2);
System.out.println("name:"+name + ",id:"+id);
}
6、关闭资源
rs.close();
stmt.close();
conn.close();
常规的语句对象有两个缺点:
a、每次操作都需要包sql语句传送给服务器,就算是执行相同的操作也是如此。如此以来带宽就被无情的浪费了。
b、对常规的语句对象,可能会产生sql注入问题,不安全。
二、预编译
可能是为了解决上面的缺陷,PreparedStatment应运而生。
获取连接时需要传入一个参数开启预编译。
String url = "jdbc:mysql://localhost:3306/test?useServerPrepStmts=true";
创建语句对象时要改成占位符形式传参
PreparedStatement pstmt = conn.prepareStatement("select name, id from user where id =?");
pstmt.setInt(1, 1);
三、批量写入
但是仅仅是这样还不够,虽然安全了,但是性能反而降低了。对于需要执行多次的操作,比如插入操作,在性能上表现就会很差。
为了解决这个问题,我们需要开启批量写入功能
获取连接时需要开启批量写。
String url = "jdbc:mysql://localhost:3306/test?useServerPrepStmts=true&rewriteBatchedStatement=true";
创建语句对象时可以这么写
PreparedStatement pstmt = conn.prepareStatement("insert into user (name, id) values(?,?)");
for(int i=0;i<100;i++){
pstmt.setString(1, "tom");
pstmt.setInt(2, i);
pstmt.addBatch();
}
pstmt.executeBatch();