/** * 定义一个数据库连接对象,这里的引用必须是 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 + "】行。");
PreparedStatement
最新推荐文章于 2025-06-30 18:15:59 发布