String sql1="delete * from A where name=?";
String sql2="delete * from B where id=?";
怎么使用PrepareStatement 防注入的方法 并且 使用事务来处理?
connection=SQLHelper.getConnection();
connection.setAutoCommit(false);
preparedStatement=SQLHelper.getPrepareStatement(connection,sql1);
preparedStatement.setInt(1, name);
preparedStatement.executeUpdate();
preparedStatement=SQLHelper.getPrepareStatement(connection,sql2);
preparedStatement.setInt(1, id);
preparedStatement.executeUpdate();
connection.commit();
这样写是不是有问题?
另外 像这样的情况(多个不同类型的sql)能否用addBatch()来处理?

解决方案 »

  1.   

    PrepareStatement不是字符串拼接,不存在注入问题。事务在JDBC connection 设。或者根据数据库不同,直接用SQL.
    START TRANSACTION for MySQL
    BEGIN TRANSACTION for MS SQL Server
     
      

  2.   

    PrepareStatement能防止SQL注入,批量时可以添加不同类型
      

  3.   


    举个例子?不同类型的SQL
      

  4.   

    你用了PreparedStatement就不怕注入了事务跟PreparedStatement没什么关系,commit之前的多个操作(DML)算一个事务你这样写应该可以
      

  5.   


    PreparedStatement不会遇到注入攻击,
    lz所说的“拼接字符串”问题,具体是什么意思?
    举个例子说明一下吧关于事务,你这样写是可以的应该,
    不行的话要看看那个SQLHelper里面是怎么写的good luck
      

  6.   


    String sql1="delete * from A where name=?";
    String sql1="delete * from A where name="+name;   preparedStatement=SQLHelper.getPrepareStatement(connection,sql1);
    SQLHelper里面就是 connection.getPrepareStatement(sql1)
      

  7.   

    为什么用了PrepareStatement还用
    String sql1="delete * from A where name="+name;
    呢?good luck
      

  8.   


    用了PrepareStatement的话 肯定String sql1="delete * from A where name=?";但我不知道我那样用PrepareStatement执行事务 对不对
      

  9.   

    这个与addBatch()有关系吗?如果想用,无非加个变量进行判断即可