1 尽量采用PreparedStatement代替Statement,因为PreparedStatement相比于Statement有如下优点
(1)PreparedStatement有助于防止SQL注入,因为它会自动对特殊字符转义;
(2)PreparedStatement可以将编译过的SQL语句进行缓存,避免重复编译;
(3)PreparedStatement用setter方法设置参数,更加符合面向对象编程;
(4)PreparedStatement执行速度更快;
2 对于需要由多条SQL语句来完成的操作,可以考虑写成存储过程,然后通过JDBC的API调用执行存储过程,调用存储过程示例代码如下所示:
CallableStatement stmt = con.prepareCall("{call callableProcessName(?,?,?,?,?,?)}");
3 需要执行多条语句来完成的操作,可以考虑采用JDBC 2.0提供的批量接口,减少与数据库进行交互的次数,示例如下
Connection conn = getConnection();
ResultSet rs = null;
PreparedStatement stmt=null;
try {
String sql = "INSERT INTO t_student values (?, ?)";
stmt = conn.prepareStatement(sql);
conn.setAutoCommit(false);
stmt.clearBatch();
//Insert 3 rows of data
for (int i=0; i<3; i++) {
stmt.setString(1, ""+i);
stmt.setString(2, "name_"+i);
stmt.addBatch();
}
int[] updateCounts = stmt.executeBatch();
System.out.println(updateCounts);
conn.commit();
} catch (Exception b) {
//TODO
}finally {
//TODO
}
(1)PreparedStatement有助于防止SQL注入,因为它会自动对特殊字符转义;
(2)PreparedStatement可以将编译过的SQL语句进行缓存,避免重复编译;
(3)PreparedStatement用setter方法设置参数,更加符合面向对象编程;
(4)PreparedStatement执行速度更快;
2 对于需要由多条SQL语句来完成的操作,可以考虑写成存储过程,然后通过JDBC的API调用执行存储过程,调用存储过程示例代码如下所示:
CallableStatement stmt = con.prepareCall("{call callableProcessName(?,?,?,?,?,?)}");
3 需要执行多条语句来完成的操作,可以考虑采用JDBC 2.0提供的批量接口,减少与数据库进行交互的次数,示例如下
Connection conn = getConnection();
ResultSet rs = null;
PreparedStatement stmt=null;
try {
String sql = "INSERT INTO t_student values (?, ?)";
stmt = conn.prepareStatement(sql);
conn.setAutoCommit(false);
stmt.clearBatch();
//Insert 3 rows of data
for (int i=0; i<3; i++) {
stmt.setString(1, ""+i);
stmt.setString(2, "name_"+i);
stmt.addBatch();
}
int[] updateCounts = stmt.executeBatch();
System.out.println(updateCounts);
conn.commit();
} catch (Exception b) {
//TODO
}finally {
//TODO
}