首页
学习
活动
专区
圈层
工具
发布
社区首页 >专栏 >通过PreparedStatement预防SQL注入

通过PreparedStatement预防SQL注入

作者头像
GeekLiHua
发布2025-01-21 15:04:51
发布2025-01-21 15:04:51
3010
举报
文章被收录于专栏:JavaJava

通过PreparedStatement预防SQL注入

简介:本文只讲PreparedStatement预防SQL注入的写法,大家学会就好。

推荐学习路线JDBC数据库的连接->Connection(数据库连接对象)->Driud数据库连接池的使用->ResultSet->通过PreparedStatement预防SQL注入->JDBC增删改查案例讲解 大家跟着敲完基本就可以JDBC基础毕业了。

数据库表格

学习代码

代码语言:javascript
复制
import java.sql.*;


public class JDBCDemo {

    public static void main(String[] args) throws Exception {
        //1. 注册驱动
        Class.forName("com.mysql.cj.jdbc.Driver");
        //2. 获取连接
        // String url = "jdbc:mysql://127.0.0.1:3306/books"; // 如果是mysql5这样写
        String url = "jdbc:mysql://localhost:3306/db?serverTimezone=GMT%2B8&useOldAliasMetadataBehavior=true"; // 如果是mysql8这样写
        String username = "root";
        String password = "12345";

        Connection conn = DriverManager.getConnection(url, username, password);

        // 接收用户输入 用户名和密码
        String name = "admin";
        String pwd = "12345";
        String sql = "select * from users where username = ? and userpwd = ?";
        // 获取pstmt对象
        PreparedStatement pstmt = conn.prepareStatement(sql);

        // 设置?的值
        pstmt.setString(1, name);
        pstmt.setString(2, pwd);
        System.out.println(pstmt); // 查看最后拼接的sql语句是啥

        // 执行sql
        ResultSet rs = pstmt.executeQuery();
        // 判断登录是否成功
        if(rs.next()){
            System.out.println("登录成功~");
        }else{
            System.out.println("登录失败~");
        }

        //7. 释放资源
        rs.close();
        pstmt.close();
        conn.close();
    }
}

运行结果

语法解析

PreparedStatement概述

PreparedStatement作用:

  • 预编译SQL语句并执行:预防SQL注入问题

获取 PreparedStatement 对象

代码语言:javascript
复制
// SQL语句中的参数值,使用?占位符替代
String sql = "select * from user where username = ? and password = ?";
// 通过Connection对象获取,并传入对应的sql语句
PreparedStatement pstmt = conn.prepareStatement(sql);

设置参数值

上面的sql语句中参数使用 ? 进行占位,在之前之前肯定要设置这些 ? 的值。

PreparedStatement对象:setXxx(参数1,参数2):给 ? 赋值

  • Xxx:数据类型 ; 如 setInt (参数1,参数2)
  • 参数:
代码语言:txt
复制
-  参数1: ?的位置编号,从1 开始
代码语言:txt
复制
-  参数2: ?的值

执行SQL语句

executeUpdate(); 执行DDL语句和DML语句 executeQuery(); 执行DQL语句 注意:

  • 调用这两个方法时不需要传递SQL语句,因为获取SQL语句执行对象时已经对SQL语句进行预编译了。
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2023-09-14,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 通过PreparedStatement预防SQL注入
    • 数据库表格
    • 学习代码
    • 语法解析
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档