1. 封装连接数据库的工具类
package com.utils;import java.sql.*;/*** @Author:xiexu* @Date:2023/12/11 10:13*/
// 连接数据库的工具类
public class DBUtil {private static final String URL = "jdbc:mysql://localhost:3306/student_score?useUnicode=true&characterEncoding=utf-8&serverTimezone=UTC";private static final String DRIVER = "com.mysql.cj.jdbc.Driver";private static final String USERNAME = "root";private static final String PASSWORD = "123456";static { // 加载一下驱动try {Class.forName(DRIVER); // 执行com.mysql.cj.jdbc.Driver 里面的静态代码块} catch (ClassNotFoundException e) {e.printStackTrace();}}// 获取数据库连接public static Connection getConnection() throws SQLException {try {Connection connection = DriverManager.getConnection(URL, USERNAME, PASSWORD);return connection;} catch (SQLException e) {e.printStackTrace();}return null;}// 关闭连接public static void closeConnection(Connection connection) {if (connection != null) {try {connection.close();} catch (SQLException e) {e.printStackTrace();}}}public static void closePS(PreparedStatement preparedStatement) {if (preparedStatement != null) {try {preparedStatement.close();} catch (SQLException e) {e.printStackTrace();}}}public static void closeRS(ResultSet resultSet) {if (resultSet != null) {try {resultSet.close();} catch (SQLException e) {e.printStackTrace();}}}
}
详细解释:
(1)
static { // 加载一下驱动try {Class.forName(DRIVER); // 执行com.mysql.cj.jdbc.Driver 里面的静态代码块} catch (ClassNotFoundException e) {e.printStackTrace();}}
这是一个静态的代码块,当类加载的时候,在静态代码块中,通过Class.forName() 来动态加载JDBC的驱动类,便于后续的数据库连接操作
(2)
public static Connection getConnection() throws SQLException {try {Connection connection = DriverManager.getConnection(URL, USERNAME, PASSWORD);return connection;} catch (SQLException e) {e.printStackTrace();}return null;}
建立数据库连接, 通过DriverManager.getConnection()方法获取参数,来建立连接
(3)
// 关闭连接public static void closeConnection(Connection connection) {if (connection != null) {try {connection.close();} catch (SQLException e) {e.printStackTrace();}}}// 关闭相应的资源public static void closePS(PreparedStatement preparedStatement) {if (preparedStatement != null) {try {preparedStatement.close();} catch (SQLException e) {e.printStackTrace();}}}public static void closeRS(ResultSet resultSet) {if (resultSet != null) {try {resultSet.close();} catch (SQLException e) {e.printStackTrace();}}}
通过 closeConnection() 方法关闭数据库的连接, 通过closePS()和closeRS() 关闭相关的资源
2. 实体类
因为是从数据库中查找数据进行校验,所以需要定义一个实体类,对应数据库中的字段
@Data
public class Admin {private Integer id;private String userName;private String pwd;
}
这里面get和set方法使用@Data注解就搞定了
3. service层
从数据库中查找数据进行校验,并返回boolean类型
3.1 定义一个接口
package com.service;import com.entity.Admin;import java.sql.SQLException;/*** @Author:xiexu* @Date:2023/12/11 10:33*/
public interface AdminService {boolean validateAdmin(Admin admin) throws SQLException;
}
3.2 实现类(实现接口的方法)
package com.service.Impl;import com.entity.Admin;
import com.service.AdminService;
import com.utils.DBUtil;import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;/*** @Author:xiexu* @Date:2023/12/11 10:40*/
public class AdminServiceImpl implements AdminService {@Overridepublic boolean validateAdmin(Admin admin) throws SQLException {String userName = admin.getUserName();String pwdParam = admin.getPwd();String sql = "select pwd from admin where user_name = ?";Connection connection = DBUtil.getConnection();// 空指针,返回falseif (connection ==null) {return false;}PreparedStatement preparedStatement = connection.prepareStatement(sql);preparedStatement.setString(1, userName); // 将userName参数设置到查询语句中的第一个占位符处。ResultSet resultSet = preparedStatement.executeQuery(); // 执行查询, 返回resultSet对象while (resultSet.next()) {String pwd = resultSet.getString(1);if (pwdParam.equals(pwd)) { // 比较return true;}}DBUtil.closeRS(resultSet);DBUtil.closePS(preparedStatement);DBUtil.closeConnection(connection);return false;}
}
4. 登录校验
登录界面的详细代码请参考:http://t.csdnimg.cn/4Ia1L 和 http://t.csdnimg.cn/9Erk3