在《java使用JDBC连接MySql数据库》中说明了JDBC链接数据库的基本方式,其中执行SQL语句使用的是Statement接口,这里介绍一个更好用的接口,PreparedStantment接口。
PreparedStatement是什么?
public interface PreparedStatement extends Statement
使用方法:
Class.forName("com.mysql.jdbc.Driver");
Connection conn = DriverManager.getConnection(URL, USERNAME, PASSWORD);
String sql = "insert into person(name,age,description)values(?,?,?)";
PreparedStatement ps = conn.prepareStatement(sql);
//设置占位符对应的值,问号是为占位符,有几个问号就代表要插入几个列,这样看来sql代码就比较简洁。
ps.setString(1, p.getName());
ps.setInt(2, p.getAge());
ps.setString(3, p.getDescription());
ps.executeUpdate();
ps.close();
conn.close();
相对于Statement,PreparedStatement的特点是:参数化查询;
优点是什么?
1.提高代码的可读性
SELECT name FROM table1 WHERE age=?
ps.setString(1, "小明");
?:占位符
2.提高性能
使用 PreparedStatement 最重要的一点好处是它拥有更佳的性能优势,SQL语句会预编译在数据库系统中。执行计划同样会被缓存起来,它允许数据库做参数化查询。使用预处理语句比普通的查询更快,因为它做的工作更少(数据库对SQL语句的分析,编译,优化已经在第一次查询前完成了)。为了减少数据库的负载,生产环境中的JDBC代码你应该总是使用PreparedStatement 。值得注意的一点是:为了获得性能上的优势,应该使用参数化sql查询而不是字符串追加的方式。
3.防止SQL注入式攻击
什么是SQL注入?链接
在使用参数化查询的情况下,数据库系统(eg:MySQL)不会将参数的内容视为SQL指令的一部分来处理,而是在数据库完成SQL指令的编译后,才套用参数运行,因此就算参数中含有破坏性的指令,也不会被数据库所运行
参考资料
1.MySQL数据库学习笔记(九)—-JDBC的ResultSet接口(查询操作)、PreparedStatement接口重构增删改查(含SQL注入的解释): 链接
2.SQL注入攻击 : 链接
3.JDBC为什么要使用PreparedStatement而不是Statement:链接