数据库——占位符的使用

使用占位符的好处

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);
        }
    }
		当使用占位符之后,只有输入了正确的参数,才能查询成功
  • 3
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
数据库中,占位符通常用于预处理语句,以避免SQL注入攻击。占位符使用方式和定义方式可能略有不同,具体取决于您使用数据库和编程语言。 在使用预处理语句的情况下,您需要在SQL语句中使用占位符来代替要插入的变量或参数。这些占位符通常表示为问号(?)或冒号(:)等字符。 例如,如果您要向数据库中插入一条记录,其中包含名称和年龄字段,您可以使用占位符来代替变量值,如下所示: ``` INSERT INTO my_table (name, age) VALUES (?, ?) ``` 在这个例子中,问号(?)就是占位符,您可以在执行预处理语句时提供实际的值来替换这些占位符。 在Java中,您可以使用PreparedStatement对象来执行预处理语句,示例代码如下: ``` String name = "John"; int age = 30; String sql = "INSERT INTO my_table (name, age) VALUES (?, ?)"; PreparedStatement statement = connection.prepareStatement(sql); statement.setString(1, name); statement.setInt(2, age); statement.executeUpdate(); ``` 在这个例子中,prepareStatement()方法用于创建PreparedStatement对象,然后您可以使用setString()和setInt()等方法将实际值设置到占位符中。最后,您可以使用executeUpdate()方法执行SQL语句并将记录插入到数据库中。 需要注意的是,占位符使用方式可能会因不同的编程语言和数据库而有所不同,具体取决于您的应用程序的实际需求。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值