SQL攻击

早期项目中普遍存在 SQL 攻击,在需要输入查询条件的地方输入了 sql 片段 导致了整体执行的 SQL 语句发
生了变化,进而影响了查询的功能;
为了解决 SQL 攻击问题,提出了 preparedStatement 对象;
使用 preparedStatement 预处理模板对象
statement preparedStatement 的区别和使用
preparedStatement 预处理模板对象
回顾 jdbc 流程: statement 对象
1. 导入 mysql-java 连接 jar 包,并加载 jar 包;
2. 加载 MySQL 的驱动类; Driver
3. 通过 DriverManager 创建 java-mysql 之间的连接对象 Connection 对象; url 地址、数据库用
户名、数据库密码
4. 通过 Connection 对象,创建查询编辑器 Statement 对象;
5. 编写 SQL 语句,使用 statement 对象执行当前 SQL 语句; ( DML 执行返回受影响行数 int ;
DQL 执行返回结果集对象 ResultSet)
6. 对结果集对象进行处理 while(resuletSet.next()){ resultSet.getString( 列数 ) }
7. 关闭资源,从下往上,先创建后关闭,后创建的先关闭;
使用 preparedStatement 预处理模板对象
1. 导入 mysql-java 连接 jar 包,并加载 jar 包;
2. 加载 MySQL 的驱动类; Driver
3. 通过 DriverManager 创建 java-mysql 之间的连接对象 Connection 对象; url 地址、数据库用
户名、数据库密码
4. preparedStatement 对象 , 预编译对象 需要使用 sql 模板语句 将 sql 语句中的不确定内
, 使用 ? 进行替换
// 其中 ? --> 表示一个字符串 , 在进行 sql 补全的时 , 会将 ? 换成一个整体的被 "" 括起来
的字符串
String sql = "select count(*) from user where u_username = ? and
u_password = ?" ;
// 使用 sql 模板创建一个 sql 预编译对象
preparedStatement = connection.prepareStatement(sql);
5. 将预编译对象中的 不完整内容进行补全 ; zs 123
preparedStatement.setString(1,user);
preparedStatement.setString(2,password);
6. 执行完整 sql 语句 此时完整的 SQL 语句 , 已经 prepared Statement 保存了 , 所以不需要再另外
添加 sql 语句参数
resultSet = preparedStatement.executeQuery();
7. 对结果集对象进行处理 while(resuletSet.next()){ resultSet.getString( 列数 ) }
8. 关闭资源,从下往上,先创建后关闭,后创建的先关闭;
statement preparedStatement 的区别和使用
1. 当使用 preparedStatement 的时候,程序会先进行 SQL 语句的预编译,检测模板 sql 是否已经补全完
整;过程复杂;
2.statement 对象,不需要预编译,直接执行,速度会快;
3.SQL 优化,提升 sql 的查询速度,针对不带条件的 sql 语句,可以使用 statement 进行串;针对有条件
查询,使用 preparedStatement
4. 针对增、删、改, 删除可以直接使用 statement , 增、改使用 preparedStatement
编写 JDBCUtil 工具类
为了减少代码的重复度,提高程序的可重用性;

你可能感兴趣的:(sql)