• 【JDBC笔记】Statement操作数据库实现用户登录


    本文使用的数据库,里面存放了一些用户名与密码

    目录

    使用Statement操作数据表

    建立 User 文件

    建立properties文件

    Statement操作数据库

    使用Statement操作数据库的弊端


    使用Statement操作数据表

    建立 User 文件

    1. public class User {
    2. private String user;
    3. private String password;
    4. public User() {
    5. }
    6. public User(String user, String password) {
    7. super();
    8. this.user = user;
    9. this.password = password;
    10. }
    11. @Override
    12. public String toString() {
    13. return "User [user=" + user + ", password=" + password + "]";
    14. }
    15. public String getUser() {
    16. return user;
    17. }
    18. public void setUser(String user) {
    19. this.user = user;
    20. }
    21. public String getPassword() {
    22. return password;
    23. }
    24. public void setPassword(String password) {
    25. this.password = password;
    26. }
    27. }

    建立properties文件

    Statement操作数据库

    1. import java.io.InputStream;
    2. import java.lang.reflect.Field;
    3. import java.sql.Connection;
    4. import java.sql.DriverManager;
    5. import java.sql.ResultSet;
    6. import java.sql.ResultSetMetaData;
    7. import java.sql.SQLException;
    8. import java.sql.Statement;
    9. import java.util.Properties;
    10. import java.util.Scanner;
    11. import org.junit.Test;
    12. public class StatementTest {
    13. // 使用Statement的弊端:需要拼写sql语句,并且存在SQL注入的问题
    14. @Test
    15. public void testLogin() {
    16. Scanner scan = new Scanner(System.in);
    17. System.out.print("用户名:");
    18. String userName = scan.nextLine();
    19. System.out.print("密 码:");
    20. String password = scan.nextLine();
    21. String sql = "SELECT user,password FROM user_table WHERE USER = '" + userName + "' AND PASSWORD = '" + password+ "'";
    22. User user = get(sql, User.class);
    23. if (user != null) {
    24. System.out.println("登陆成功!");
    25. } else {
    26. System.out.println("用户名或密码错误!");
    27. }
    28. }
    29. // 使用Statement实现对数据表的查询操作
    30. public <T> T get(String sql, Class<T> clazz) {
    31. T t = null;
    32. Connection conn = null;
    33. Statement st = null;
    34. ResultSet rs = null;
    35. try {
    36. // 1.加载配置文件
    37. InputStream is = StatementTest.class.getClassLoader().getResourceAsStream("jdbc.properties");
    38. Properties pros = new Properties();
    39. pros.load(is);
    40. // 2.读取配置信息
    41. String user = pros.getProperty("user");
    42. String password = pros.getProperty("password");
    43. String url = pros.getProperty("url");
    44. String driverClass = pros.getProperty("driverClass");
    45. // 3.加载驱动
    46. Class.forName(driverClass);
    47. // 4.获取连接
    48. conn = DriverManager.getConnection(url, user, password);
    49. st = conn.createStatement();
    50. rs = st.executeQuery(sql);
    51. // 获取结果集的元数据
    52. ResultSetMetaData rsmd = rs.getMetaData();
    53. // 获取结果集的列数
    54. int columnCount = rsmd.getColumnCount();
    55. if (rs.next()) {
    56. t = clazz.newInstance();
    57. for (int i = 0; i < columnCount; i++) {
    58. // //1. 获取列的名称
    59. // String columnName = rsmd.getColumnName(i+1);
    60. // 1. 获取列的别名
    61. String columnName = rsmd.getColumnLabel(i + 1);
    62. // 2. 根据列名获取对应数据表中的数据
    63. Object columnVal = rs.getObject(columnName);
    64. // 3. 将数据表中得到的数据,封装进对象
    65. Field field = clazz.getDeclaredField(columnName);
    66. field.setAccessible(true);
    67. field.set(t, columnVal);
    68. }
    69. return t;
    70. }
    71. } catch (Exception e) {
    72. e.printStackTrace();
    73. } finally {
    74. // 关闭资源
    75. if (rs != null) {
    76. try {
    77. rs.close();
    78. } catch (SQLException e) {
    79. e.printStackTrace();
    80. }
    81. }
    82. if (st != null) {
    83. try {
    84. st.close();
    85. } catch (SQLException e) {
    86. e.printStackTrace();
    87. }
    88. }
    89. if (conn != null) {
    90. try {
    91. conn.close();
    92. } catch (SQLException e) {
    93. e.printStackTrace();
    94. }
    95. }
    96. }
    97. return null;
    98. }
    99. }

    使用 Statement 我们可以实现登录的操作,但是使用 Statement 也存在一些弊端

    使用Statement操作数据库的弊端

    1. 需要拼写 SQL 语句

    2. 存在 SQL 注入的问题

    什么是 SQL 注入?比如我们可以把本文的 SQL 语句修改一下

    SELECT user,password FROM user_table WHERE USER = '1' or ' AND PASSWORD = '='1' or '1' = '1';

    '1' = '1' 是恒成立的,所以我们输入任意用户名和密码都可以登录成功,这样就存了在安全隐患

    如何解决呢?

    我们可以使用 PreparedStatement 来实现数据库操作来避免这个问题

  • 相关阅读:
    易语言 如何调用麦谈帮API接口?
    leetcode 511 日期操作
    元服务那些事儿 | 舞刀解决隐私声明,斩断上架牵绊
    【读书笔记】【Effective STL】算法
    mybatis-plus报错:Invalid bound statement (not found)
    python基于django仓库进销存管理系统 计算机毕业设计
    【Web UI自动化测试】Web UI自动化测试之日志收集篇(全网最全)
    功能测试做了几年,跳槽还能涨薪吗?
    【PCBA方案】快速测温体温计方案
    The directory ‘*‘ or its parent directory is not owned by the current user
  • 原文地址:https://blog.csdn.net/lijibai_/article/details/125462109