PreparedStatement
preparedStatement简介:
preparedStament是Statement的子接口,可以传入带占位符的SQL语句并且提供了补充占位符的方法
PreparedStatement相对于Statement的优点:
-
代码的可读性和可维护性更高
-
PreparedStatement可最大程度的提高性能
语句会在被DBServer的编译器编译后的代码被缓存下来,下次调用 时相同的语句就不需要再次编译
在statement中只要是相同的操作但因为数据内容不一样,整个语句本身不能匹配,没有缓存的意思,每执行一次都得对传入的语句重新编译一次 -
PreparedStatement可以防止SQL注入
-关于SQL注入下一篇博客会说
代码对比演示:
- 不用preparedStatement时sql语句要进行拼串操作
public class PreparedStagementDemo {
public static void main(String[] args) {
System.out.println("DateBase:");
//实现一条数据对象的插入操作
String sql1 = "insert into student3(name,age,birth) values ";
//进行拼串和更新操作
JDBCTools.update1(sql1);
System.out.println("End");
}
}
JDBCTools类中
public static void update1(String sql) {
Connection conn = null;
Statement stms = null;
try {
//得到一个Connection类
conn = JDBCTools.getConnection();
//初始化需要插入的数据项
String name = "JXK1";
int age = 21;
Date birth = new Date(new java.util.Date().getTime());
//拼串
sql = sql + "('"
+ name
+"',"
+ age
+","
+ birth
+")";
//得到Statement对象
stms = conn.createStatement();
//执行插入操作
stms.executeUpdate(sql);
} catch (Exception e) {
e.printStackTrace();
} finally {
//关闭资源
JDBCTools.closeResource(conn, stms, null);
}
}
其中得到一个Connection以及关闭资源的操作在上一篇博客中有说到
上一篇博客链接
问题:sql拼串过于繁琐
- 用PreparedStatement进行拼串操作
public class PreparedStagementDemo {
public static void main(String[] args) {
System.out.println("DateBase:");
String sql2 = "insert into student(name,age) values (?,?)";
JDBCTools.update2(sql2);
System.out.println("End");
}
}
update2函数
public static void update2(String sql) {
//声明一个Connection对象
Connection conn = null;
//声明一个PreparedStatement对象
PreparedStatement preparedStatement = null;
try {
//得到Connection对象
conn = JDBCTools.getConnection();
//生成一个PreparedStatement对象(参数:String sql)
preparedStatement = conn.prepareStatement(sql);
//补充占位符
preparedStatement.setString(1, "tom");
preparedStatement.setInt(2, 33);
//执行SQL语句(不需要参数)
preparedStatement.executeUpdate();
} catch (Exception e) {
e.printStackTrace();
} finally {
//关闭资源
JDBCTools.closeResource(conn, preparedStatement, null);
}
}
- 一个加强版的PreparedStatement操作
update3函数
public static void update3(String sql,Object ...args ) {
//声明一个Connection对象
Connection conn = null;
//声明一个PreparedStatement对象
PreparedStatement preparedStatement = null;
try {
//声明一个Connection对象
conn = JDBCTools.getConnection();
//生成一个PreparedStatement对象(参数:String sql)
preparedStatement = conn.prepareStatement(sql);
//对传入进来的边长数组的值逐个进行补充占位
//占位位下标从一开始
for (int i = 0; i < args.length; i++) {
preparedStatement.setObject(i+1, args[i]);
}
//执行sql
preparedStatement.executeUpdate();
} catch (Exception e) {
e.printStackTrace();
} finally {
//关闭资源
JDBCTools.closeResource(conn, preparedStatement, null);
}
}
特别的:
PreparedStatement补充占位符时若存在一个date数据项需要占位,它只接收java.sql.Date类型的参数,而java.sql.Date初始化需要一个毫秒数,我们可以通过java.util.Date类得到
Date data= new Date(new java.util.Date().getTime());