PreparedStatement

本文详细阐述了在Java中使用PreparedStatement代替Statement的重要性。通过对比,解释了PreparedStatement如何有效防止SQL注入攻击并提升性能,尤其是在处理大量相似SQL语句时。

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

/**
 * 定义一个数据库连接对象,这里的引用必须是 java.sql 包中的。
 * 因为只有这个包中才代表了 Java 提供的 JDBC 接口,这只是一套规范,具体实现则由数据库驱动来提供。
 */
Connection conn = null;

/**
 * 如果使用Statement,那么就必须在SQL语句中,实际地去嵌入值,比如之前的insert语句中values必须使用硬编码
 *
 * 但是这种方式有一个弊端:
 *
 * 第一,是容易发生SQL注入。
 * SQL注入,简单来说,就是,你的网页的用户在使用,比如论坛的留言板,电商网站的评论页面,
 *  提交内容的时候,可以使用'1 or 1',诸如此类的非法的字符,然后你的后台,
 *  如果在插入评论数据到表中的时候,如果使用Statement,就会原封不动的将用户填写的内容拼接在SQL中,
 *  此时可能会发生对数据库的意外的损坏,甚至数据泄露,这种情况就叫做SQL注入
 *
 * 第二种弊端,就是性能的低下。
 *  比如insert into test_user(name,age) values('张三',25)
 *  insert into test_user(name,age) values('李四',26)
 *  其实两条SQL语句的结构大同小异,但是如果使用这种方式,在MySQL中执行SQL语句的时候,
 *  却需要对每一条SQL语句都实现编译,编译的耗时在整个SQL语句的执行耗时中占据了大部分的比例
 *  所以,Statement会导致执行大量类似SQL语句的时候的,性能低下
 *
 * 如果使用PreparedStatement,那么就可以解决上述的两个问题
 * 1、SQL注入,使用PreparedStatement时,是可以在SQL语句中,对值所在的位置使用 ? 这种占位符的
 *  使用占位符之后,实际的值,可以通过另外一份放在数组中的参数来代表。
 *  此时PreparedStatement会对值做特殊的处理,往往特殊处理后,就会导致不法分子的恶意注入的SQL代码失效
 * 2、提升性能,使用PreparedStatement之后,其实结构类似的SQL语句,都变成一样的了,因为值的地方
 * 都会变成 ? ,那么一条SQL语句,在MySQL中只会编译一次,后面的SQL语句过来,就直接拿编译后的执行计划
 * 加上不同的参数直接执行,可以大大提升性能
 */
PreparedStatement pstmt = null;

// 第一个,SQL语句中,值所在的地方,都用问号代表
String sql = "insert into test_user(name,age) values(?,?)";

// 对 SQL 语句进行预编译
pstmt = conn.prepareStatement(sql);

// 第二个,必须调用 PreparedStatement 的 setXXXXX() 系列方法,对指定的占位符设置实际的值
pstmt.setString(1, "王者不可阻挡");
pstmt.setInt(2, 26);

// 第三个,执行SQL语句时,直接使用 executeUpdate() 即可,不用传入任何参数
int rtn = pstmt.executeUpdate();

System.out.println("SQL语句影响了【" + rtn + "】行。");
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Han_Lin_

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值