PreparedStatement

SQL注入问题

SQL注入:用户输入的内容作为了SQL语句语法的一部分,改变了原有SQL真正的意义。

假设有登录案例SQL语句如下:

SELECT * FROM 用户表 WHERE NAME = 用户输入的用户名 AND PASSWORD = 用户输的密码;

SELECT * FROM 用户表 WHERE NAME = ‘XXX’ AND PASSWORD =’ XXX’  OR ’a’=’a’;

此时,上述查询语句时永远可以查询出结果的。那么用户就直接登录成功了,显然我们不希望看到这样的结果,这便是SQL注入问题。

API详解:预处理对象

preparedStatement:预编译对象,是Statement对象的子类。
–> 防止mysql注入问题
–> 效率会提高

特点:

  • 性能高
  • 会把sql语句先编译
  • 能过滤掉用户输入的关键字。

PreparedStatement预处理对象
–> 处理的每条sql语句中所有的实际参数,都必须使用占位符?替换。
例:
String sql = “select * from user where username = ? and password = ?”;

PreparedStatement使用,需要通过以下3步骤完成:

PreparedStatement预处理对象代码:

// 获得预处理对象,需要提供已经使用占位符处理后的SQL语句
PreparedStatement psmt = conn.prepareStatement(sql)

设置实际参数

void setXxx(int index, Xxx xx) 将指定参数设置指定类型的值
    参数1:index 实际参数序列号,从1开始。
    参数2:xxx 实际参数值,xxx表示具体的类型。

例如:
setString(2, “1234”) 把SQL语句中第2个位置的占位符?替换成实际参数 “1234”

执行SQL语句:

int executeUpdate(); --执行insert update delete语句.
ResultSet executeQuery(); --执行select语句.
boolean execute(); --执行select返回true 执行其他的语句返回false.

代码示例

插入

@Test
public void demo01(){
//添加:向分类表中添加数据
Connection conn = null;
PreparedStatement psmt = null;
ResultSet rs = null;

try {
    //1 获得连接
    conn = JdbcUtils.getConnection();
    //2 处理sql语句
    String sql = "insert into category(cname) values(? )";
    //3获得预处理对象
    psmt = conn.prepareStatement(sql);
    //4设置实际参数
    psmt.setString(1,"预处理");
    //5执行
    int r = psmt.executeUpdate();

    System.out.println(r);

} catch (Exception e) {
    throw new RuntimeException(e);
} finally{
    //6释放资源
    JdbcUtils.closeResource(conn, psmt, rs);
}

}

更新

@Test
public void demo02(){
//修改
Connection conn = null;
PreparedStatement psmt = null;
ResultSet rs = null;

try {
    conn = JdbcUtils.getConnection();

    //1 sql语句
    String sql = "update category set cname = ? where cid = ?";
    //2 获得预处理对象
    psmt = conn.prepareStatement(sql);
    //3设置实际参数
    psmt.setString(1, "测试数据");
    psmt.setInt(2, 4);
    //4执行
    int r = psmt.executeUpdate();
    System.out.println(r);


} catch (Exception e) {
    throw new RuntimeException(e);
} finally{
    JdbcUtils.closeResource(conn, psmt, rs);
}   

}

查询

@Test
public void demo05(){
//通过id查询
Connection conn = null;
PreparedStatement psmt = null;
ResultSet rs = null;

try {
    conn = JdbcUtils.getConnection();

    String sql = "select * from category where cid = ?";
    psmt = conn.prepareStatement(sql);
    psmt.setInt(1, 2);
    rs = psmt.executeQuery();
    if(rs.next()){
        System.out.println("查询到");
    } else {
        System.out.println("查询不到");
    }


} catch (Exception e) {
    throw new RuntimeException(e);
} finally{
    JdbcUtils.closeResource(conn, psmt, rs);
}

}

删除

public class Demo_delete {
public static void main(String[] args) throws ClassNotFoundException, SQLException {
//注册驱动
Class.forName(“com.mysql.jdbc.Driver”);
//获得连接
String url = “jdbc:demo00_pre://127.0.0.1:3306/day04”;
Connection conn = DriverManager.getConnection(url,”root”,”root”);
//获得sql操作方法
Statement statement = conn.createStatement();
int i = statement.executeUpdate(“DELETE FROM category WHERE cid = 1”);
System.out.println(i);
statement.close();
conn.close();
}
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值