【Java 进阶篇】JDBC 登录案例详解

news2024/11/16 15:49:01

在这里插入图片描述

在本文中,我们将通过一个简单的 JDBC 登录案例来详细介绍如何使用 Java 数据库连接(JDBC)来连接数据库、进行用户身份验证等操作。这个案例将适用于数据库初学者,我们将从头开始构建一个简单的登录系统。

什么是 JDBC?

JDBC 是 Java 数据库连接的缩写。它是 Java 标准库的一部分,用于与数据库进行通信。通过 JDBC,Java 应用程序可以连接到各种不同的关系型数据库,如 MySQL、Oracle、SQL Server 等,并执行数据库操作,如查询、插入、更新和删除数据。

准备工作

在开始之前,确保您已经完成以下准备工作:

  1. 安装并配置 Java 开发环境。
  2. 下载并安装一个数据库管理系统,如 MySQL。确保您记住数据库服务器的主机名、端口、用户名和密码。

创建数据库

首先,我们需要创建一个数据库来存储用户信息。在 MySQL 中,您可以使用以下 SQL 命令创建一个名为 “userdb” 的数据库:

CREATE DATABASE userdb;

接下来,我们创建一个名为 “users” 的表来存储用户信息。该表将包含以下列:

  • id:用户的唯一标识符(主键)
  • username:用户名
  • password:密码

以下是创建 “users” 表的 SQL 命令:

USE userdb;

CREATE TABLE users (
  id INT AUTO_INCREMENT PRIMARY KEY,
  username VARCHAR(255) NOT NULL,
  password VARCHAR(255) NOT NULL
);

编写 Java 程序

现在,我们将创建一个 Java 程序,通过 JDBC 连接到数据库并进行用户身份验证。

导入必要的库

首先,导入 Java 中用于 JDBC 的库:

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;

连接到数据库

在 Java 中,要连接到数据库,我们需要提供数据库的 URL、用户名和密码。这些信息将用于建立与数据库的连接。以下是一个示例连接到 MySQL 数据库的代码:

public class JDBCLoginExample {
    // 数据库 URL,注意将 <hostname>、<port>、<database>、<username> 和 <password> 替换为实际值
    private static final String DB_URL = "jdbc:mysql://<hostname>:<port>/<database>";
    private static final String USER = "<username>";
    private static final String PASSWORD = "<password>";

    public static void main(String[] args) {
        try {
            // 注册 JDBC 驱动程序
            Class.forName("com.mysql.cj.jdbc.Driver");

            // 建立数据库连接
            Connection connection = DriverManager.getConnection(DB_URL, USER, PASSWORD);

            // TODO: 在这里执行后续操作

            // 关闭数据库连接
            connection.close();
        } catch (SQLException | ClassNotFoundException e) {
            e.printStackTrace();
        }
    }
}

在上述代码中,我们使用 Class.forName() 方法加载 MySQL JDBC 驱动程序,并通过 DriverManager.getConnection() 方法建立与数据库的连接。请确保替换 <hostname><port><database><username><password> 为您的实际数据库信息。

用户身份验证

接下来,我们将编写代码来验证用户的身份。用户将提供用户名和密码,并我们将检查数据库中是否存在匹配的记录。

// 用户输入的用户名和密码
String inputUsername = "user1";
String inputPassword = "password123";

// SQL 查询语句
String query = "SELECT * FROM users WHERE username = ? AND password = ?";
try {
    // 创建 PreparedStatement 对象
    PreparedStatement preparedStatement = connection.prepareStatement(query);
    
    // 设置查询参数
    preparedStatement.setString(1, inputUsername);
    preparedStatement.setString(2, inputPassword);
    
    // 执行查询
    ResultSet resultSet = preparedStatement.executeQuery();
    
    // 检查是否存在匹配的用户
    if (resultSet.next()) {
        System.out.println("登录成功!");
    } else {
        System.out.println("用户名或密码不正确。");
    }
    
    // 关闭资源
    resultSet.close();
    preparedStatement.close();
} catch (SQLException e) {
    e.printStackTrace();
}

完整的 Java 程序

以下是一个完整的 Java 程序,包括连接到数据库、用户身份验证以及关闭数据库连接的部分:

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;

public class JDBCLoginExample {
    // 数据库 URL,注意将 <hostname>、<port>、<database>、<username> 和 <password> 替换为实际值
    private static final String DB_URL = "jdbc:mysql://<hostname>:<port>/<database>";
    private static final String USER = "<username>";
    private static final String PASSWORD = "<password>";

    public static void main(String[] args) {
        try {
            // 注册 JDBC 驱动程序
            Class.forName("com.mysql.cj.jdbc.Driver");

            // 建立数据库连接
            Connection connection = DriverManager.getConnection(DB_URL, USER, PASSWORD);

            // 用户输入的用户名和密码
            String inputUsername = "user1";
            String inputPassword = "password123";

            // SQL 查询语句
            String query = "SELECT * FROM users WHERE username = ? AND password = ?";
            try {
                // 创建 PreparedStatement 对象
                PreparedStatement preparedStatement = connection.prepareStatement(query);

                // 设置查询参数
                preparedStatement.setString(1, inputUsername);
                preparedStatement.setString(2, inputPassword);

                // 执行查询
                ResultSet resultSet = preparedStatement.executeQuery();

                // 检查是否存在匹配的用户
                if (resultSet.next()) {
                    System.out.println("登录成功!");
                } else {
                    System.out.println("用户名或密码不正确。");
                }

                // 关闭资源
                resultSet.close();
                preparedStatement.close();
            } catch (SQLException e) {
                e.printStackTrace();
            }

            // 关闭数据库连接
            connection.close();
        } catch (SQLException | ClassNotFoundException e) {
            e.printStackTrace();
        }
    }
}

请确保替换 <hostname><port><database><username><password> 为您的实际数据库信息。此程序将用户输入的用户名和密码与数据库中的记录进行比较,并根据结果输出相应的消息。

这个示例演示了如何使用 JDBC 连接到数据库、创建 PreparedStatement 对象、执行查询操作以及关闭资源。您可以根据实际需求扩展此程序,例如添加用户注册功能、错误处理等。希望这个示例对您理解 JDBC 和数据库连接有所帮助。

作者信息

作者 : 繁依Fanyi
CSDN: https://techfanyi.blog.csdn.net
掘金:https://juejin.cn/user/4154386571867191

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

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

相关文章

剑指offer——JZ18 删除链表的节点 解题思路与具体代码【C++】

一、题目描述与要求 删除链表的节点_牛客题霸_牛客网 (nowcoder.com) 题目描述 给定单向链表的头指针和一个要删除的节点的值&#xff0c;定义一个函数删除该节点。返回删除后的链表的头节点。 1.此题对比原题有改动 2.题目保证链表中节点的值互不相同 3.该题只会输出返回…

视频讲解|基于DistFlow潮流的配电网故障重构代码

目录 1 主要内容 2 视频链接 1 主要内容 该视频为基于DistFlow潮流的配电网故障重构代码讲解内容&#xff0c;对应的资源下载链接为基于DistFlow潮流的配电网故障重构(输入任意线路)&#xff0c;对该程序进行了详尽的讲解&#xff0c;基本做到句句分析和讲解&#xff08;讲解…

反序列化漏洞

原理 反序列化是对象变成可以传输的字符串。 PHP反序列化的时候&#xff0c;基本都是围绕着serialize()&#xff0c;unserialize()这两个函数 serialize() 和 unserialize() 在 PHP内部没有漏洞的&#xff0c;产生反序列化漏洞是因为应用程序在处理对象、魔术函数以及序列化…

《C和指针》笔记33:指针数组

除了创建整型数组一样&#xff0c;也可以声明指针数组。 int *api[10];为了弄清这个复杂的声明&#xff0c;我们假定它是一个表达式&#xff0c;并对它进行求值。下标引用的优先级高于间接访问&#xff0c;所以在这个表达式中&#xff0c;首先执行下标引用。因此&#xff0c;a…

[软件工具]opencv-svm快速训练助手教程解决opencv C++ SVM模型训练与分类实现任务支持C# python调用

opencv中已经提供了svm算法可以对图像实现多分类&#xff0c;使用svm算法对图像分类的任务多用于场景简单且对时间有要求的场景&#xff0c;因为opencv的svm训练一般只需要很短时间就可以完成训练任务。但是目前网上没有一个工具很好解决训练问题&#xff0c;大部分需要自己编程…

分布式锁:四种方案解决商品超卖的方案

一 分布式锁 1.1 分布式锁的作用 在多线程高并发场景下&#xff0c;为了保证资源的线程安全问题&#xff0c;jdk为我们提供了synchronized关键字和ReentrantLock可重入锁&#xff0c;但是它们只能保证一个工程内的线程安全。在分布式集群、微服务、云原生横行的当下&#xff…

仿牛客论坛项目 笔记

文章目录 环境配置bean是什么最终成品功能数据库与缓存一致性整个web系统后端的结构spring mvc相关controller常见的代码写法mybatis相关常识测试、调试相关计网相关component相关注解spring全家桶族谱spring衍生框架 run之后发生了什么什么是spring&#xff0c;spring和bean的…

剑指offer——JZ22 链表中倒数最后k个结点 解题思路与具体代码【C++】

一、题目描述与要求 链表中倒数最后k个结点_牛客题霸_牛客网 (nowcoder.com) 题目描述 输入一个长度为 n 的链表&#xff0c;设链表中的元素的值为 ai &#xff0c;返回该链表中倒数第k个节点。 如果该链表长度小于k&#xff0c;请返回一个长度为 0 的链表。 数据范围&…

计算机网络(第8版)第一章概述笔记

6 性能指标 带宽&#xff1a; 在单位时间内从网络中的某一点到另一点所能通过的“最高数据率”。 7 分层结构、协议、接口、服务 1、实体&#xff1a;第n层的活动元素称为n层实体。同一层的实体叫对等实体。 2、协议&#xff1a;为进行网络中的对等实体数据交换而建立的规则、…

js判断数据类型、toString和valueOf区别,类型转换、不同类型间的运算、判断相等

目录 判断数据类型 运算符 typeof&#xff1a;判断 基本数据类型 typeof nullObject 类型标签均为000 实例 instanceof 构造函数&#xff1a;判断原型链&#xff0c;和isPrototypeOf 方法 构造函数.prototype.isPrototypeOf(实例) &#xff1a;判断原型链 (数据).const…

[React源码解析] React的设计理念和源码架构 (一)

任务分割异步执行让出执法权 文章目录 1.React的设计理念1.1 Fiber1.2 Scheduler1.3 Lane1.4 代数效应 2.React的源码架构2.1 大概图示2.2 jsx2.3 Fiber双缓存2.4 scheduler2.5 Lane模型2.6 reconciler2.7 renderer2.8 concurrent 3.React源码调试 1.React的设计理念 Fiber: 即…

究竟是什么样的讲解数组算法的博客让我写了三小时???

版本说明 当前版本号[20231004]。 版本修改说明20231004初版 目录 文章目录 版本说明目录二. 基础数据结构2.1 数组1) 概述2) 动态数组1&#xff09;插入addlast 方法测试: addlast 方法 add 方法测试&#xff1a;add方法 addlast 方法与 add 方法合并版get 方法测试&#x…

MyCat实现分库分表技术

目录 一、分库分表 1.1介绍 1.1.1问题分析 1.1.2拆分策略 1.1.3垂直拆分 1.1.3.1垂直分库 1.1.3.2垂直分表 1.1.4水平拆分 1.1.4.1水平分库 1.1.4.2水平分表 1.1.5实现技术 二、MyCat概述 2.1介绍 2.2下载 2.3安装 2.4目录介绍 2.5概念介绍 三、MyCat入门 3.…

某道翻译逆向

文章目录 前文crypto模块分析完整代码结尾 前文 本文章中所有内容仅供学习交流&#xff0c;严禁用于商业用途和非法用途&#xff0c;否则由此产生的一切后果均与作者无关&#xff0c;若有侵权&#xff0c;请联系我立即删除&#xff01; crypto模块 Crypto是加密的简称&#…

10月4日作业

server #include "widget.h" #include "ui_widget.h"Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget) {ui->setupUi(this);//实例化一个服务器server new QTcpServer(this);connect(server, &QTcpServer::newConnection, …

CANoe.Diva生成测试用例

Diva目录 一、CANoe.Diva打开CDD文件二、导入CDD文件三、ECU Information四、时间参数设置五、选择是否测试功能寻址六、勾选需要测试服务项七、生成测试用例 一、CANoe.Diva打开CDD文件 CANoe.Diva可以通过导入cdd或odx文件&#xff0c;自动生成全面的测试用例。再在CANoe中导…

Android学习之路(20) 进程间通信

IPC IPC为 (Inter-Process Communication) 缩写&#xff0c;称为进程间通信或跨进程通信&#xff0c;指两个进程间进行数据交换的过程。安卓中主要采用 Binder 进行进程间通信&#xff0c;当然也支持其他 IPC 方式&#xff0c;如&#xff1a;管道&#xff0c;Socket&#xff0…

9.3 链表从指定节点插入新节点

一、从指定节点后方插入 插入逻辑如图&#xff1a; 插入前&#xff1a;A指向B&#xff0c;B指向C 插入后&#xff1a;B为插入点&#xff0c;当要插入D时就要让B指向D&#xff0c;D再指向C&#xff08;插入前B的指向&#xff09; #include <stdio.h>struct Test {int d…

C/C++字符函数和字符串函数详解————内存函数详解与模拟

个人主页&#xff1a;点我进入主页 专栏分类&#xff1a;C语言初阶 C语言程序设计————KTV C语言小游戏 C语言进阶 C语言刷题 欢迎大家点赞&#xff0c;评论&#xff0c;收藏。 一起努力&#xff0c;一起奔赴大厂。 目录 1.前言 2 .memcpy函数 3.memmove函…

mysql双主+双从集群连接模式

架构图&#xff1a; 详细内容参考&#xff1a; 结果展示&#xff1a; 178.119.30.14(主) 178.119.30.15(主) 178.119.30.16(从) 178.119.30.17(从)