SQL语句优化 statement --> preparedStatement
SQL语句的拼接受限,对于①多条语句和②复杂类型无法实现操作,且易受③注入攻击
statement
只适合静态SQL语句,动态SQL语句的实现易受注入攻击
preparedStatement
提前知道语句结构可以避免受到注入攻击
package com.atguigu.api.preparedStatement;
import java.sql.*;
import java.util.Scanner;
/**
* TODO 使用预编译的statement完成用户登录
* 1.防止注入攻击
* 2.演示preparedStatement的使用流程
*/
public class PSUserLoginPart {
public static void main(String[] args) throws ClassNotFoundException, SQLException {
//1.收集用户信息
Scanner scanner = new Scanner(System.in);
System.out.println("请输入账号:");
String account = scanner.nextLine();
System.out.println("请输入密码:");
String password = scanner.nextLine();
//PS的数据库流程
//2.注册驱动
Class.forName("com.mysql.cj.jdbc.Driver");
//3.获取连接
Connection connection = DriverManager.getConnection("jdbc:mysql://127.0.0.1:3306/atguigu?user=root&password=123456");
/**
* statement
* 1.创建statement
* 2.拼接SQL语句
* 3.发送SQL语句,并获取返回结果
*
* preparedStatement
* 1.编写SQL语句结构 不包含动态值的语句,动态值部分使用占位符 ? 替代 注意:? 只能替代动态值
* 2.创建preparedStatement,并传入动态值
* 3.动态值站位符进行赋值 -- ? 单独赋值即可
* 4.发送SQL语句,并获取返回结果
*/
//4.1.编写SQL语句结构
String sql = "select * from t_user where account = ? and password = ?;";
//4.2.创建预编译的statement并且设置SQL语句结果
PreparedStatement preparedStatement = connection.prepareStatement(sql);
//4.3.单独占位符进行赋值
/**
* 参数1:index 占位符的位置 从左向右数 从1开始
* 参数2:object 占位符的值,可以设置任何类型的数据,避免拼接,使类型更丰富
*/
preparedStatement.setObject(1,account);
preparedStatement.setObject(2,password);
//4.4.发送SQL语句,并获取返回结果
// statement.executeQuery(sql) | statement.executeUpdate(sql)
// preparedStatement.executeQuery() | preparedStatement.executeUpdate()
// preparedStatement 不需要传入参数,因为已经知道了SQL语句的结构和动态值
ResultSet resultSet = preparedStatement.executeQuery();
//5.结果集解析
if(resultSet.next()){
System.out.println("登录成功");
}else{
System.out.println("登录失败");
}
//6.释放资源
resultSet.close();
preparedStatement.close();
}
}
标签:语句,JDBC3,sql,System,preparedStatement,statement,SQL
From: https://www.cnblogs.com/Ashen-/p/17044096.html