JAVA-JDBC解决SQL注入问题

只要用户提供信息不参与SQL语句的编译过程,问题就解决了。
即使用户提供的信息中含有SQL语句的关键字,但是没有参与编译,不起作用。


PreparedStatement预操作

使用java.sql.PreparedStatement,其继承了java.sql.Statement
PreparedStatement是属于与编译的数据库操作对象。


import java.sql.*;

public class JDBCTest04 {
    public static void main(String[] args) {
        Connection conn = null;
        PreparedStatement ps = null;
        ResultSet rs = null;

        try {
            //1.注册驱动
            Class.forName("com.mysql.jdbc.Driver");
            //2.获取连接
            conn = DriverManager.getConnection("jdbc:mysql://localhost/test","root","xxx");

            //3.获取数据库操作对象
                // 其中一个?,表示一个占位符,一个?将来接受一个“值”,注意:占位符不能使用单引号括起来。
            String sql = "SELECT * FROM t_user WHERE id = ? AND c_id =?";
            ps = conn.prepareStatement(sql);
                // 给占位符?传值
            ps.setInt(1,2);
            ps.setInt(2,101);
            //4.执行sql
            //excuteUpdate
            rs = ps.executeQuery(); //专门执行DQL语句的方法
            //5.处理查询结果
            while (rs.next()){
                String id = rs.getString("id");
                String username = rs.getString("username");
                String c_id = rs.getString("c_id");
                System.out.println(id + "," + username + "," + c_id);
            }

        }catch (Exception e){
            e.printStackTrace();
        }finally {
            if (rs != null){
                try{
                    rs.close();
                }catch (Exception e){
                    e.printStackTrace();
                }
            }
            if (ps != null){
                try{
                    ps.close();
                }catch (Exception e){
                    e.printStackTrace();
                }
            }
            if (conn != null){
                try{
                    conn.close();
                }catch (Exception e){
                    e.printStackTrace();
                }
            }
        }
    }
}

Statement和PreparedStatement对比

  • Statement存在SQL注入,PreparedStatement解决了SQL注入问题。
  • Statement是编译一次执行一次,PreparedStatement是编译一次,可执行N次。PreparedStatement效率更高。
  • PreparedStatement会在编译阶段做类型的安全检查。

综述:PreparedStatement使用情况较多。只有极少数的情况下需要使用Statement

什么情况下必须使用Statement

  • 业务方面要求必须支持SQL注入
  • statement支持SQL注入,凡是业务方面要求是需求进行SQL语句拼接的,必须使用statement。(例如在order by 后面加asc或者desc)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值