当前位置: 代码迷 >> SQL >> Statements & PreparedStatement & sql流入 & batch批处理
  详细解决方案

Statements & PreparedStatement & sql流入 & batch批处理

热度:302   发布时间:2016-05-05 13:06:16.0
Statements & PreparedStatement & sql注入 & batch批处理
Statement是PreparedStatement的父接口,不进行预编译操作。
PreparedStatement可以实现Statement的所有功能,但是之所以叫它预编译指令,是因为在创建它的一个对象时可以给定具有一定格式的SQL字符串,然后用它的setXXX方法给指定的SQL语句以填空的方式赋值,具有这样的特性后,它在多次执行一条固定格式的字符串时就很方便,也更效率.不像Statement那样每次执行都要先编译字符串在执行SQL了.

PreparedStatement能防止sql注入、Statements不能的原因:它们实现机制不同
Statement是程序中的sql和外部传入的数据拼接成一个完整的sql语句,然后发给数据库执行
PreparedStatement是把程序中的sql语句进行预编译,然后在执行过程中,外部传入的值只是作为数据进行处理,不会再对sql语句进行解析,因此避免了sql注入问题.

批处理:
1,多个sql语句一起执行
String delSql = "Begin DELETE tbl1 WHERE id=?;DELETE tbl2 WHERE id=?;End;"pstmt = connection.prepareStatement(sql);param = 1;pstmt.setLong(param++, id);pstmt.setLong(param++, id);

2,同一sql,多条数据同时插入
String insertSql = "insert into tbl1 (id, name) values (?, ?)";pstmt = connection.prepareStatement(insertSql );pstmt.setLong(1, id);pstmt.setLong(2, name);pstmt.addBatch();pstmt.setLong(1, id1);pstmt.setLong(2, name1);pstmt.addBatch();pstmt.setLong(1, id2);pstmt.setLong(2, name2);pstmt.addBatch();// 最后使用executeBatch一把提交id,name ; id1,name1; id2,name2的数据pstmt.executeBatch();
  相关解决方案