前言
这里大概整理一下对于PreparedStatement的理解
一、为什么选择PreparedStatement?
Statement对象在每次执行SQL语句时都将该语句传给数据库。这样,多次执行同一个语句时效率较低。为了提高语句的执行效率,可以使用PreparedStatement接口对象。
二、创建PreparedStatement对象
使用PreparedStatement对象可以将SQL语句传给数据库做预编译,以后每次执行这个SQL语句时,速度就可以提高很多。另外,PreparedStatement对象还可以创建带参数的SQL语句,在SQL语句中指出接受哪些参数,然后进行预编译。
创建PreparedStatement对象使用Connection接口的preparedStatement()方法。与创建statement对象不同的是,这里需要给该方法传递一个SQL命令。
Connection接口中的preparedStatement()方法:
三、带参数的SQL语句
PreparedStatement对象通常用来执行带参数的SQL语句,使用问好(?)作为占位符。
- eg:String sql = “insert into user values (?,?,?)”;
PreparedStatement pstmt = conn.preparedStatement(sql);
通过API中的setXXX方法对参数进行设置。如:
public void setInt(int parameterIndex, int x);
public void setString(int parameterIndex, String x);
代码如下(示例)
public static void main(String[] args) {
String sql = "insert into user values (?,?,?)";
int user_id = 10;
String user_name = "Chern";
String user_pwd = "gfwgfyw";
update(sql, user_id,user_name,user_pwd);
}
public static void update(String sql,Object ... args){
Connection conn = null;
PreparedStatement ps = null;
try {
conn = JDBCUtils.getConnection();
ps = conn.prepareStatement(sql);
for(int i = 0;i < args.length;i++){
ps.setObject(i + 1, args[i]);
}
ps.execute();
} catch (Exception e) {
e.printStackTrace();
}finally{
JDBCUtils.closeResource(conn, ps);
}
}
JDBC.class:
public static Connection getConnection() {
Connection conn = null;
String url = "jdbc:mysql://127.0.0.1/Test?characterEncoding=UTF-8";
String user = "Test";
String pwd = "123";
try {
Class.forName("com.mysql.cj.jdbc.Driver");
conn = DriverManager.getConnection(url, user, pwd);
}catch(ClassNotFoundException e) {
e.printStackTrace();
}catch(SQLException e) {
e.printStackTrace();
}
return conn;
}
public static void closeResource(Connection conn,PreparedStatement pstmt) {
try {
pstmt.close();
conn.close();
} catch (Exception e) {
e.printStackTrace();
}
}