发表于: 2020-04-08 11:59:56
1 1312
Statement和preparedStatement的区别
PreparedStatement:表示预编译的 SQL 语句的对象。
接口:public interface PreparedStatement extends Statement之间有继承关系
SQL 语句被预编译并存储在 PreparedStatement 对象中。然后可以使用此对象多次高效地执行该语句。
注:(setShort、setString 等等)必须指定与输入参数的已定义 SQL 类型兼容的类型。例如,如果 IN 参数具有 SQL 类型 INTEGER,那么应该使用 setInt 方法,问号的位置也是应该注意的,因为第一个问好的位置为1,第二个问号的位置为2.
如果需要任意参数类型转换,使用 setObject 方法时应该将目标 SQL 类型作为其参数。
在以下设置参数的示例中,con 表示一个活动连接:
PreparedStatement pstmt = con.prepareStatement("UPDATE EMPLOYEES SALARY = ? WHERE ID = ?");
pstmt.setBigDecimal(1, 1533.00)
pstmt.setInt(2, 1102)
pstmt.execute()//注意提交时这里不能再有sql语句,不同于Statment
参考链接:https://blog.csdn.net/suwu150/article/details/52745055
Statement:用于执行静态 SQL 语句并返回它所生成结果的对象。
接口:public interface Statement extends Wrapper
在默认情况下,同一时间每个 Statement 对象只能打开一个 ResultSet 对象。因此,如果读取一个 ResultSet 对象与另一个交叉,则这两个对象必须是由不同的 Statement 对象生成的。
如以下操作:创建statement对象
Statement stat=conn.createStatement();
String sql="insert into lover values(6,'suxingxing',to_date('21-9-2016','dd-mm-yyyy'))";
stat.execute(sql);//这里提交时应该有sql语句,不同于PreparedStatment
sql注入攻击防护的了解
如果用简单的statement查询就会导致数据库返回所有结果:
但用防止sql注入的预编译prepareStatement查询就得到不一样的sql语句:将整个String视为一个name
针对 SQL 注入漏洞的防护,主要是要意识到这种漏洞的存在,不信任任何来自客户端 的数据。可以通过过滤一些 SQL 关键字的方式进行防护,比如“select”、“insert”这一类 关键字,“`” (反引号) 、“ ””(双引号)、“--”( SQL 注释开头)这一类保留字符等。当然因为各种编码和绕过技术,手工进行过滤是不够的,容易遗漏,比较安全的方式是采用语言 预置的功能,例如,用 Java 的 PreparedStatment 进行 SQL 操作。
下次内容:jdbc事务
评论