Java+Swing: 连接数据库并完成登录验证 整理10

news2024/11/25 4:40:07

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 {
    @Override
    public 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();

        // 空指针,返回false
        if (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

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1301585.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

GridBagLayout GridBagConstraints 笔记231130

实例化使用模板 GridBagLayout gbl new GridBagLayout(); // gbl.columnWidths new int[]{200,200,200}; // 用数组设置列 // gbl.rowHeights new int[]{100,100,100,100,100}; // 用数组设置行GridBagConstraints gbc new GridBagConstraints();/*** gridBagConstrain…

AMD 发布新芯片MI300,支持训练和运行大型语言模型

AMD 宣布推出 MI300 芯片,其 Ryzen 8040移动处理器将于2024年用于笔记本电脑。 AMD官方网站:AMD ׀ together we advance_AI AMD——美国半导体公司专门为计算机、通信和消费电子行业设计和制造各种创新的微处理器(CPU、GPU、主板芯片组、电…

剧本杀小程序系统开发,助力剧本杀市场创新发展

近年来,剧本杀发展速度非常快,短短几年内,就发展到了百亿元的市场规模! 在互联网的发展下,剧本杀迎来了新的发展模式--线上剧本杀。线上剧本杀能够让玩家体验到智能化、趣味化的游戏乐趣,不受时间、地点限…

7+共病+PPI分析+转录调控,纯生信靠这个思路也能拿7+

今天给同学们分享一篇生信文章“Exploring the Pathogenesis of Psoriasis Complicated With Atherosclerosis via Microarray Data Analysis”,这篇文章发表在Front Immunol期刊上,影响因子为7.3。 结果解读: 差异表达基因的鉴定 该研究的…

侯捷C++ (二--STL标准库)2

适配器 adapter 也可以叫做改造器,改造已经存在的东西 有:仿函数适配器、迭代器适配器、容器适配器 实现适配,可以使用继承、复合的两种方式实现。 共性:STL使用复合来实现适配 容器适配器 包括stack、queue,内含一…

MacOS 14.1 配置kerberos认证

MacOS 14.1 配置kerberos认证 MacOS 14.1 配置kerberos认证krb5.conf票据显示程序问题参考地址 MacOS 14.1 配置kerberos认证 原操作系统为 10.14.*,因安装别的软件失败,不想去找旧版本了,所以把OS直接升级到最新版的14.1啦,升级…

[MySQL] SQL优化之性能分析

🌈键盘敲烂,年薪30万🌈 目录 一、索引优化 1、索引是什么: 2、索引的数据结构: 3、索引种类: 4、sql分析(回表查询) 二、定位慢查询语句 1、慢查询日志 2、profile详情 3、…

嵌入式开发按怎样的路线学习较好?

嵌入式开发按怎样的路线学习较好? 在开始前我有一些资料,是我根据自己从业十年经验,熬夜搞了几个通宵,精心整理了一份「嵌入式从专业入门到高级教程工具包」,点个关注,全部无偿共享给大家!&…

一文读懂:GPU最强“辅助“HBM到底是什么?

各位ICT的小伙伴们大家好呀。 我是老猫。 今天我们聊聊GPU背后的女人,不对,是背后的大赢家-HBM。 那么,HBM究竟是什么呢?为何在AI时代如此火热?下面我们就一一道来。 ▉ HBM到底为何方神圣? HBM全称为H…

C++ Qt开发:如何使用信号与槽

在Qt中,信号与槽(Signal and Slot)是一种用于对象之间通信的机制。是Qt框架引以为傲的一项机制,它带来了许多优势,使得Qt成为一个强大且灵活的开发框架之一。信号与槽的关联通过QObject::connect函数完成。这样的机制使…

【LeetCode刷题-链表】-- 143.重排链表

143.重排链表 /*** Definition for singly-linked list.* public class ListNode {* int val;* ListNode next;* ListNode() {}* ListNode(int val) { this.val val; }* ListNode(int val, ListNode next) { this.val val; this.next next; }* }*/ clas…

【JavaWeb笔记】单选框,结合Servlet

各个部分的作用 jsp部分 form action"...":表单标签,供用户提交数据。内部的submit点击之后相当于是点action的URL input type"radio":输入类型为单选框。把name设置为一样的,这样效果上就是单选&#xff…

【一周安全资讯1209】《网络安全事件报告管理办法》公开征求意见;IDC发布《大模型在网络安全领域的应用市场洞察报告》

要闻速览 1、国家互联网办公室《网络安全事件报告管理办法》公开征求意见 2、国家标准《信息安全技术 政务计算机终端核心配置规范》公开征求意见 3、IDC发布《大模型在网络安全领域的应用市场洞察报告》 4、赛迪顾问发布《2023中国私有云市场研究报告》 5、美国知名基因测试公…

C#泛型(详解)

前言 介绍C# 入门经典第8版书中的第12章《泛型》 一、泛型的含义 为引出泛型的概念,我们先来看看我们前面提到的 集合类https://blog.csdn.net/qq_71897293/article/details/134684612?spm1001.2014.3001.5501 这些集合是没有具体类型化的,所以…

电脑待机怎么设置?让你的电脑更加节能

在日常使用电脑的过程中,合理设置待机模式是一项省电且环保的好习惯。然而,许多用户对于如何设置电脑待机感到困扰。那么电脑待机怎么设置呢?本文将深入探讨三种常用的电脑待机设置方法,通过详细的步骤,帮助用户更好地…

想进阶JAVA高级程序员吗?多线程必学

❤️作者主页:小虚竹 ❤️作者简介:大家好,我是小虚竹。2022年度博客之星评选TOP 10🏆,Java领域优质创作者🏆,CSDN博客专家🏆,华为云享专家🏆,掘金年度人气作…

openGauss学习笔记-151 openGauss 数据库运维-备份与恢复-物理备份与恢复之gs_basebackup

文章目录 openGauss学习笔记-151 openGauss 数据库运维-备份与恢复-物理备份与恢复之gs_basebackup151.1 背景信息151.2 前提条件151.3 语法151.4 示例151.5 从备份文件恢复数据 openGauss学习笔记-151 openGauss 数据库运维-备份与恢复-物理备份与恢复之gs_basebackup 151.1 …

使用xshell连接虚拟机(服务器)

作者:余小小 Xshell Xshell [1] 是一个强大的安全终端模拟软件,它支持SSH1, SSH2, 以及Microsoft Windows 平台的TELNET 协议。Xshell 通过互联网到远程主机的安全连接以及它创新性的设计和特色帮助用户在复杂的网络环境中享受他们的工作。 Xshell可以…

【XR806开发板试用】编译FreeRTOS系统

编译FreeRTOS系统,测试串口输出。 一、下载源码 1.1、获取源码 下载源码: rootubuntu:/home# wget https://bbs.aw-ol.com/assets/uploads/files/1693988430633-xr806_sdk.tar.gz 解压文件 rootubuntu:/home# tar xvf 1693988430633-xr806_sdk.tar.gz 1.2、获取…

亚马逊鲲鹏系统自动化操作更节约时间

亚马逊鲲鹏系统的自动化操作为卖家们带来了极大的时间节约和高效运营的利好。这一先进系统在账号注册、养号和下单等方面拥有强大的自动化功能,为卖家提供了简单便捷的操作体验。 首先,亚马逊鲲鹏系统在账号注册方面展现了其强大的自动化能力。用户只需事…