JavaEE JDBC PreparedStatement
PreparedStatement
@author ixenos
PreparedStatement工作原理
注意:虽然mysql不支持PreparedStatement优化,但依然有预编译的实现!
PreparedStatement相较Statement的优点
1.预编译缓存的支持,能提高执行效率
2.防范SQL注入
statement有sql注入的风险
比如
SELECT * FROM boss WHERE user='root' OR 1=1 --' AND password='f3f.3e&^';
由于--是SQL脚本中的注释,所以插入 【 ' OR 1=1 -- 】这一段将导致全为真,任意的用户密码都能获得true的判断
简单示例
package com.ixenos.demo; import java.sql.Connection; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.sql.SQLException; import java.sql.Statement; import org.junit.Test; import com.ixenos.jdbc.util.JDBCUtil; public class testDB { /** * 测试preparedstatement */ @Test public void test3() { Connection con = null; PreparedStatement preStmt = null; ResultSet rs = null; try { // 1.加载驱动程序 // 2.获得数据库连接 con = JDBCUtil.getConnection(); // 3.创建预编译SQL语句 String sql = "SELECT * FROM boss WHERE name=?"; // 4.创建stateMent preStmt = con.prepareStatement(sql); preStmt.setString(1,"Alex"); // DQL操作返回一个结果集对象,同样需要释放资源!! rs = preStmt.executeQuery(sql); // 5.输出结果 while (rs.next()) { System.out.println(rs.getString(3)); } } catch (SQLException e) { e.printStackTrace(); } finally { // 后打开的先释放 JDBCUtil.close(preStmt, con, rs); } } }
注意:填入参数时,按参数位置的索引来填入
----------------------------------------------------------