JDBC程序具体实现步骤演示

2023-11-17

再熟悉JDBC的编程步骤后,接下来通过一个案例并依照上一小节所讲解的步骤来演示JDBC的使用。此案例会从tb_user表中读取数据,并将结果打印在控制台。

需要说明的是,Java中的JDBC是用来连接数据库从而执行相关数据相关操作的,因此在使用JDBC时,一定要确保安装有数据库。常用的关系型数据库有MySQL和Oracle,本书就以连接MySQL数据库为例,使用JDBC执行相关操作。

案例的具体实现步骤如下:

(1) 搭建数据库环境

在MySQL数据库中创建一个名称为jdbc的数据库,然后在该数据库中创建一个名称为tb_user的表,创建数据库和表的SQL语句如下:

CREATE DATABASE jdbc;
USE jdbc;
CREATE TABLE tb_user(
        id INT PRIMARY KEY AUTO_INCREMENT,
        NAME VARCHAR(40),
        sex VARCHAR(2),    
        email VARCHAR(60),
        birthday DATE        
);

上述创建tb_user表时添加了id、NAME、sex、email和birthday共5个字段,其中NAME字段名称为大写形式,这是因为name字段在MySQL数据库中属于关键字,所以为了方便区分,这里将name字段名称全部用大写表示。
数据库和表创建成功后,再向tb_user表中插入3条数据,插入的SQL语句如下所示:

INSERT INTO tb_user(NAME,sex,email,birthday) 
VALUES ('Jack','男','jack@126.com','1980-01-04'),
('Tom','男','tom@126.com','1981-02-14'),
('Lucy','女','lucy@126.com','1979-12-28');

为了查看数据是否添加成功,使用SELECT语句查询tb_user表中的数据,执行结果如图所示。
在这里插入图片描述
注意:

数据库和表创建成功后,如果使用的是命令行窗口向tb_user表中插入带有中文的数据,命令行窗口可能会报错,同时从MySQL数据库查询带有中文数据还可能会显示乱码,这是因为MySQL数据库默认使用的是UTF-8编码格式,而命令行窗口默认使用的是GBK编码格式,所以执行带有中文数据的插入语句会出现解析错误。为了在命令行窗口也能正常向MySQL数据库插入中文数据,以及查询中文数据,可以在执行插入语句和查询语句前,先在命令行窗口执行以下两条命令:

set character_set_client=gbk;
set character_set_results=gbk;

执行完上述两条命令后,再次在命令行窗口执行插入和查询操作就不再出现乱码问题了。

(1) 创建项目环境,导入数据库驱动

在Eclipse中新建一个名称为chapter09的Java项目,使用鼠标右键单击项目名称,然后选择【New】→【Folder】,在弹出窗口中将该文件夹命名为lib并单击【Finish】按钮,此时项目根目录中就会出现一个名称为lib的文件夹。将下载好的MySQL数据库驱动文件Jar包(mysql-connector-java-5.1.46-bin.jar)复制到项目的lib目录中,并使用鼠标右击该JAR包,在弹出框中选择【Build Path】→【Add to Build Path】,此时Eclipse会将该JAR包发布到类路径下。加入驱动后的项目结构如图所示。
在这里插入图片描述
其中,MySQL驱动文件可以在其官网地址:http://dev.mysql.com/downloads/connector/j/页面中下载,单击页面Platform Independent (Architecture Independent), ZIP Archive后的“Download”按钮,并在新打开的窗口中的单击 “No thanks, just start my download”超链接后即可下载驱动压缩包(本书编写时的最新驱动版本文件是mysql-connector-java-5.1.46.zip),解压后即可得到相应JAR包。

(1) 编写JDBC程序

在项目chapter09的src目录下,新建一个名称为com.itheima.jdbc的包,并在该包中创建类Example01。在该类读取数据库中的tb_user表,并将结果输出到控制台,如文件1所示。

文件1 Example01.java

 import java.sql.*;
     public class Example01 {
         public static void main(String[] args) throws SQLException  {
             Connection conn =null;
             Statement stmt =null;
             ResultSet rs =null;
             try {
                 // 1. 加载数据库驱动
                 Class.forName("com.mysql.jdbc.Driver");
                 // 2.通过DriverManager获取数据库连接
                 String url = "jdbc:mysql://localhost:3306/jdbc";
                 String username = "root";
                 String password = "root";
                 conn = DriverManager.getConnection(url,username, password);
                 // 3.通过Connection对象获取Statement对象
                 stmt = conn.createStatement();
                 // 4.使用Statement执行SQL语句
                 String sql = "select * from tb_user";
                 rs = stmt.executeQuery(sql);
                 // 5. 操作ResultSet结果集
                 System.out.println("id    |    name      |    sex  "
                                     + "   |    email        |    birthday ");
                 while (rs.next()) {
                     int id = rs.getInt("id");    // 通过列名获取指定字段的值
                     String name = rs.getString("name");
                     String sex = rs.getString("sex");
                     String email = rs.getString("email");
                     Date birthday = rs.getDate("birthday");
                     System.out.println(id + "    |    " + name + "    |    "
                                + sex + "    |    " + email + "    |    " + birthday);
                 }
             } catch (Exception e) {
                 e.printStackTrace();
             } finally {
                 // 6.关闭连接,释放资源
                 if(rs !=null){ rs.close(); }
                 if(stmt !=null){ stmt.close(); }
                 if(conn !=null){ conn.close(); }
             }
         }
     }

运行结果如图所示。
在这里插入图片描述
图3 运行结果

文件1中,首先注册了MySQL数据库驱动,通过DriverManager获取一个Connection对象,然后使用Connection对象创建一个Statement对象,Statement对象通过executeQuery(String sql)方法执行了SQL语句,并返回结果集ResultSet,接下来,通过遍历ResultSet得到查询结果并输出,最后关闭连接,释放数据库资源。

从图中可以看到,tb_user表中的数据已被打印在了控制台。至此第一个JDBC程序实现成功。

注意:

在进行数据库连接时,连接MySQL数据库的username和password都要与创建MySQL数据库时设置的登录账户一致,否则登录失败。本章以及后续案例都默认MySQL数据库登录的username和password都为“root”。

Java基础入门:

java零基础自学首Java入门教程(含Java项目和Java真题)

Javaweb核心基础

JavaWeb基础教程,Java web从入门到企业实战完整版

JDBC视频全套视频教程

快速入门jdbc原理+jdbc实战,一套掌握

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

JDBC程序具体实现步骤演示 的相关文章

  • Java 枚举与创建位掩码和检查权限的混淆

    我想将此 c 权限模块移植到 java 但是当我无法将数值保存在数据库中然后将其转换为枚举表示形式时 我很困惑如何执行此操作 在 C 中 我创建一个如下所示的枚举 public enum ArticlePermission CanRead
  • 为什么 JTables 使 TableModel 在呈现时不可序列化?

    所以最近我正在开发一个工具 供我们配置某些应用程序 它不需要是什么真正令人敬畏的东西 只是一个具有一些 SQL 脚本生成功能并创建几个 XML 文件的基本工具 在此期间 我使用自己的 AbstractTableModel 实现创建了一系列
  • 使用 LinkedList 实现下一个和上一个按钮

    这可能是一个愚蠢的问题 但我很难思考清楚 我编写了一个使用 LinkedList 来移动加载的 MIDI 乐器的方法 我想制作一个下一个和一个上一个按钮 以便每次单击该按钮时都会遍历 LinkedList 如果我硬编码itr next or
  • 如何使用assertEquals 和 Epsilon 在 JUnit 中断言两个双精度数?

    不推荐使用双打的assertEquals 我发现应该使用带有Epsilon的形式 这是因为双打不可能100 严格 但无论如何我需要比较两个双打 预期结果和实际结果 但我不知道该怎么做 目前我的测试如下 Test public void te
  • org.apache.hadoop.security.AccessControlException:客户端无法通过以下方式进行身份验证:[TOKEN,KERBEROS] 问题

    我正在使用 java 客户端通过 Kerberos 身份验证安全访问 HDFS 我尝试打字klist在服务器上 它显示已经存在的有效票证 我收到的异常是客户端无法通过以下方式进行身份验证 TOKEN KERBEROS 帮助将不胜感激 这是一
  • 过滤两次 Lambda Java

    我有一个清单如下 1 2 3 4 5 6 7 和 预期结果必须是 1 2 3 4 5 6 7 我知道怎么做才能到7点 我的结果 1 2 3 4 5 6 我也想知道如何输入 7 我添加了i gt i objList size 1到我的过滤器
  • Pig Udf 显示结果

    我是 Pig 的新手 我用 Java 编写了一个 udf 并且包含了一个 System out println 其中的声明 我必须知道在 Pig 中运行时该语句在哪里打印 假设你的UDF 扩展了 EvalFunc 您可以使用从返回的 Log
  • 来自 dll 的 Java 调用函数

    我有这个 python 脚本导入zkemkeeperdll 并连接到考勤设备 ZKTeco 这是我正在使用的脚本 from win32com client import Dispatch zk Dispatch zkemkeeper ZKE
  • 帮助将图像从 Servlet 获取到 JSP 页面 [重复]

    这个问题在这里已经有答案了 我目前必须生成一个显示字符串文本的图像 我需要在 Servlet 上制作此图像 然后以某种方式将图像传递到 JSP 页面 以便它可以显示它 我试图避免保存图像 而是以某种方式将图像流式传输到 JSP 自从我开始寻
  • Hibernate 的 PersistentSet 不使用 hashCode/equals 的自定义实现

    所以我有一本实体书 public class Book private String id private String name private String description private Image coverImage pr
  • 通过触发器应用表的列权限

    现在 我有一个名为 Members 的表 其中包含内容 分为联系人数据 银行数据 现在 管理员应该能够创建 更新 删除用户 这些用户保存在另一个表中 该表只能访问管理员 用户应该获得自己的 mysql 用户帐户 管理员还应该能够设置权限 例
  • volatile、final 和synchronized 安全发布的区别

    给定一个带有变量 x 的 A 类 变量 x 在类构造函数中设置 A x 77 我们想将 x 发布到其他线程 考虑以下 3 种变量 x 线程安全 发布的情况 1 x is final 2 x is volatile 3 x 设定为同步块 sy
  • 获取文件的总大小(以字节为单位)[重复]

    这个问题在这里已经有答案了 可能的重复 java 高效获取文件大小 https stackoverflow com questions 116574 java get file size efficiently 我有一个名为 filenam
  • 为什么 Java 8 不允许非公共默认方法?

    让我们举个例子 public interface Testerface default public String example return Hello public class Tester implements Testerface
  • 关键字“table”附近的语法不正确,无法提取结果集

    我使用 SQL Server 创建了一个项目 其中包含以下文件 UserDAO java public class UserDAO private static SessionFactory sessionFactory static se
  • MySQL 转储未知选项“-no-beep”

    在旧服务器上我使用了mysql转储命令来备份 MySQL 数据库 在新服务器上 MySQL 版本为 5 6 相同的命令给出了错误 unknown option no beep 无论它插入什么 我也在互联网上搜索过 但找不到任何帮助 在 my
  • 我如何在java中读取二进制数据文件

    因此 我正在为学校做一个项目 我需要读取二进制数据文件并使用它来生成角色的统计数据 例如力量和智慧 它的设置是让前 8 位组成一个统计数据 我想知道执行此操作的实际语法是什么 是不是就像读文本文件一样 这样 File file new Fi
  • Opencv Java 灰度

    我编写了以下程序 尝试从彩色转换为灰度 Mat newImage Imgcodecs imread q1 jpg Mat image new Mat new Size newImage cols newImage rows CvType C
  • 包 javax.el 不存在

    我正在使用 jre6 eclipse 并导入 javax el 错误 包 javax el 不存在 javac 导入 javax el 过来 这不应该是java的一部分吗 谁能告诉我为什么会这样 谢谢 米 EL 统一表达语言 是 Java
  • 使用 CXF-RS 组件时,为什么我们使用 而不是普通的

    作为后续这个问题 https stackoverflow com questions 20598199 对于如何正确使用CXF RS组件我还是有点困惑 我很困惑为什么我们需要

随机推荐

  • js textarea焦点事件,CodeMirror焦点事件

    1 效果图 2 功能说明 当我把光标放在 指标对象 的控件框的时候 双击 字段名称 则字段数据写入指标对象控件框 当我把光标放在 指标维度 的控件框的时候 双击 字段名称 则字段数据写入指标维度控件框 当我把光标放在 指标sql 的控件框的
  • ElementUI表格错位问题

    最近一个项目需要用到表格 为了图省事直接用的ElementUI组件 使用默认的参数在表格所在的容器大小变化时会发生错位问题 如下图所示 网上的一些方法基本都试过了 没啥作用 可能是方式不对 最后查询ElementUI文档 在el table
  • 开关稳压电源设计

    文末下载完整资料 摘要 本设计应用隔离型回扫式DC DC电源变换技术完成开关稳压电源的设计及制作 系统主要由整流滤波电路 DC DC变换电路 单片机显示与控制电路三部分组成 开关电源的集成控制由脉宽调制控制芯片UC3843及相关电路完成 利
  • linux编程第一部分总结

    C 多线程安全原则 对象析构很复杂 我们采用shared ptr和weak ptr来做 enable shared from this lt gt 是用来做回调的 因为多线程中可能对象的生命周期比传出去的this指针短 同时为了不延长对象的
  • 碎片笔记

    前言 与传统的AI攻防 后门攻击 对抗样本 投毒攻击等 不同 如今的大模型攻防涉及以下多个方面的内容 目录 一 大模型的可信问题 1 1 虚假内容生成 1 2 隐私泄露 二 大模型的安全问题 2 1 模型窃取攻击 2 2 数据窃取攻击 2
  • python-ue4-metahuman-nerf:我创造了一个数字人!!

    原文 https zhuanlan zhihu com p 561152870 目录 收起 1 准备工作 制作 MetaHuman 角色 1 1 创建 MetaHuman 角色 1 2 Quixel Bridge 下载 MetaHuman
  • android 恢复出厂设置流程分析,Android恢复出厂设置流程分析

    最近看恢复出厂的一个问题 以前也查过这方面的流程 所以这里整理一些AP framework层的流程 在setting gt 备份与重置 gt 恢复出厂设置 gt 重置手机 gt 清除全部内容 gt 手机关机 gt 开机 gt 进行恢复出厂的
  • unity 五种旋转方式localEulerAngles、eulerAngles、rotation、localRotation和Rotate的区别

    1 1 transform localEulerAngles 使用localEulerAngles进行旋转的时候 我们要使用transform localEulerAngles new Vector3 x y z 其中 new Vector
  • 矩阵 行列式的计算

    行列式要求 要计算行列式 那么这个矩阵一定是一个方阵 行列式性质 行列式转置后值不变 互换行列式中两行 值变为相反数 行列式中两行成比例 行列式为0 行列式中一行所有元素乘以一个数后加到另一行 行列式值不变 行列式的计算有很多方法 矩阵的行
  • GPT专业应用:自动撰写宣传稿

    图片由Lexica 生成 输入 Staff working on product promotion 宣传稿是指按照有关政策文件或相关精神 以宣传某种主张 某项工作 某件事情等为目的 为获得理解 支持而撰写的应用文 基本格式包含四个要素 分
  • React 初学 - 使用 If/Else 条件进行渲染以及使用 && 获得更简洁的条件- 个人笔记50

    MyComponent 的 state 中包含一个布尔值 用于跟踪是否要在 UI 中显示某个元素 按钮切换此值的状态 目前 它每次都呈现相同的 UI 用if else语句重写render 方法 如果display为true则返回当前标记 否
  • CARLA平台+Q-learning的尝试(gym-carla)

    接触强化学习大概有半年了 也了解了一些算法 一些简单的算法在gym框架也实现了 那么结合仿真平台Carla该怎么用呢 由于比较熟悉gym框架 就偷个懒先从这个开始写代码 项目地址 https github com cjy1992 gym c
  • 3、上台阶问题

    问题描述 有n级楼梯 有2种爬法 1次1级 2级 n级楼梯有多少种爬法 解决思路 n 1 1种爬法 n 2 2种爬法 n 3 第一次爬1级 有2种爬法 第一次爬2级 有1种爬法 共3种爬法 第n次爬楼梯 f n f n 1 f n 1 代码
  • 成功解决ubuntu-22.04的sudo apt-get update一直卡在【0% [Waiting for headers]】

    成功解决ubuntu 22 04的sudo apt get update一直卡在 0 Waiting for headers 问题描述 解决方案 问题描述 在下载安装包的时候一直卡在0 Waiting for headers 报错信息如下
  • 【动态内存管理】

    目录 前言 一 动态内存开辟函数 一 malloc 二 free 三 calloc 四 realloc 二 常见错误 一 对NULL指针解引用 二 对动态开辟空间的越界访问 三 对动态开辟内存多次free 四 未在初始位置进行free 五
  • 软件技术国产化

    软件技术国产化 如果大家做的项目是涉及国企 政府 校园的 应该都有听过 技术国产化 其实不单单是软件开发这一块 其它行业也会有这一说法 自从中美之间发生贸易战 美国对中国一些企业进行制裁 甚至封杀 像我们软件开发这行 会限制一些开发工具 技
  • 【面试题】java常考面试题

    java中sleep方法和wait方法的区别 sleep是线程中的方法 但是wait是Object中的方法 sleep方法不会释放锁 但是wait会释放锁 sleep方法不依赖于同步器synchronized 但是wait需要依赖synch
  • 进程-进程标识符

    什么是进程标识符 系统给每个进程定义了一个唯一标识该进程的非负正数 称作进程标识符 进程标识符可以简单的表示为主进程表中的一个索引 当某一进程终止后 其标识符可以重新用作另一进程的标识符 不过 在任何时刻 一个标识符所代表的进程是唯一的 系
  • 在VMware Workstation Pro中安装Windows 11正式版(包括添加TPM 2.0支持,而不是忽略)

    目录 0 首先检查Windows 11需要的环境 1 创建一个虚拟机 1 1 选择使用下载好的Windows11镜像 1 2 选择操作系统为Windows 10 x64 1 3 给虚拟机系统起个名字并指定存放路径 1 4 把创建的虚拟硬盘大
  • JDBC程序具体实现步骤演示

    再熟悉JDBC的编程步骤后 接下来通过一个案例并依照上一小节所讲解的步骤来演示JDBC的使用 此案例会从tb user表中读取数据 并将结果打印在控制台 需要说明的是 Java中的JDBC是用来连接数据库从而执行相关数据相关操作的 因此在使