数据库——占位符的使用

博客介绍了使用占位符操作SQL语句的好处。一是能避开SQL语句注入风险,因使用Statement接口操作的SQL语句用字符串拼接可能存在安全风险且拼接麻烦;二是传入字符串参数时无需再用单引号包裹,通过代码对比可体现。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

使用占位符的好处

1 避开了SQL语句注入的风险

        SQL注入风险:使用Statement接口操作的sql语句需要使用字符串拼接的方式实现,这样的方式可能存在sql注入的安全风险并且拼接字符串比较麻烦的

2 传入字符串参数时无需用再用单引号包裹

观察如下两段代码:
代码一:不使用占位符

public class JdbcTest {
    public static void main(String[] args)  {
    //  调用selectLogin(String name, String password)方法时,若在传入的password参数后面拼接一个"OR"字符串和一个返回值为true的字符串表达式,则无论"OR"前面的字符串是否满足条件,都能成功查询到myuser数据表中username字段名下name的所有信息
        selectLogin("'smith'", "'sddsaf' OR 1=1");  //传入字符串参数时需将字符串用单引号包裹
    }

    public static boolean selectLogin(String name, String password) {
        Connection conn = getConnection();        // getconnection():自定义的连接数据库的方法
        try {
//  当传入的参数较多时,字符串的拼接会比较麻烦
            String sql = "SELECT *FROM myuser WHERE username=" + name + " AND password=" + password;
            System.out.println(sql);
            PreparedStatement pst = conn.prepareStatement(sql);
            ResultSet rst = pst.executeQuery();        //  返回一个查询结果集
            if (rst.next()) {                                            //  当rst.next()返回true时,说明查询成功
                System.out.println("查询成功");
            } else {
                System.out.println("用户名或密码不正确");
            }           
        } catch (SQLException e) {
            e.printStackTrace();
        } finally {
            close(conn);
        }
        return false;
    }
}
此时传入错误的参数也能成功

代码一:使用占位符“?”来代替SQL语句中需要传入的字符串参数

public static void selectLogin2(String name,String password) {
        Connection conn = getConnection();
        try {
                //       使用占位符“?”来代替
            String sql = "SELECT *FROM myuser WHERE username=? AND password=?" ; 
            PreparedStatement pst = conn.prepareStatement(sql);
            pst.setString(1, name);                //      给占位符赋值
            pst.setString(2, password);         //      给占位符赋值
            ResultSet rst = pst.executeQuery();
            if (rst.next()) {
                System.out.println("登陆成功");
            } else {
                System.out.println("用户名或密码不正确");
            }
            
        } catch (SQLException e) {
            e.printStackTrace();
        } finally {
            close(conn);
        }
    }
		当使用占位符之后,只有输入了正确的参数,才能查询成功
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值