1 package com.atsyc.api.preparedstatement;
2
3 /*
4 * 使用预编译statement完成用户登录
5 *
6 * TODO:
7 * 防止注入攻击,演示preparedstatement完成用户登录
8 */
9
10 import java.sql.*;
11 import java.util.Scanner;
12
13 public class PSUserLoginPart {
14 public static void main(String[] args) throws ClassNotFoundException, SQLException {
15 //1.获取用户输入信息
16 Scanner scanner = new Scanner(System.in);
17 System.out.println("请输入账号:");
18 String account = scanner.nextLine();
19 System.out.println("请输入密码:");
20 String password = scanner.nextLine();
21
22 //2.ps的数据库流程
23 //(1)注册驱动
24 Class.forName("com.mysql.cj.jdbc.Driver");
25 //(2)获取连接
26 Connection connection = DriverManager.getConnection("jdbc:mysql://127.0.0.1:3306/atsyc","root","Yican030615");
27 /*
28 * statement
29 * 1.创建statement
30 * 2.拼接SQL语句
31 * 3.发送SQL语句,并且获取返回结果
32 *
33 * preparedstatement
34 * 1.编写SQL语句结果 不包含动态值部分的语句,动态值部分使用占位符 ? 替代(只能替代动态值)
35 * 2.创建preparedStatement,并且传入动态值
36 * 3.动态值 占位符 赋值 ? 单独赋值即可
37 * 4.发送SQL语句即可,并获取返回结果
38 */
39 //(3)编写SQL语句结果
40 String sql = "SELECT * FROM t_user WHERE account = ? and password = ? ; ";
41 //(4)创建预编译statement并设置SQL语句结果
42 PreparedStatement preparedStatement = connection.prepareStatement(sql);
43 //(5)单独的占位符进行赋值
44 /*
45 * 参数1:index 占位符的位置 从左向右数 从1开始 账号 ? 1
46 * 参数2:object 占位符的值 可以设置任何类型的数据,避免了我们拼接和类型更加丰富
47 */
48 preparedStatement.setObject(1,account);
49 preparedStatement.setObject(2,password);
50 //(6)发送SQL语句,获取返回结果
51 /*
52 * statement.excuteUpdate / executeQuery(String sql);
53 * preparedStatement.excuteUpdate / executeQuery(); TODO:因为他已经知道语句,知道语句动态值
54 */
55 ResultSet resultSet = preparedStatement.executeQuery();
56 //(7)结果集解析
57 if(resultSet.next()){
58 System.out.println("登陆成功!");
59 }else{
60 System.out.println("登陆失败!");
61 }
62
63 }
64 }