Java之JDBC安装、使用详解(2021最新!)

article/2025/10/24 4:06:00

JDBC安装以及使用详解

  • JDBC概念
  • JDBC下载安装
    • 下载JDBC
    • 安装JDBC
  • 详细步骤
      • 常用数据库URL地址的写法:
    • Connection对象
    • 三种执行对象:用于将 SQL 语句发送到数据库中
      • createStatement
      • PreparedStatement
      • CallableStatement
    • 执行SQL语句
    • 获取结果(ResultSet)
      • 获取行
      • 获取值
    • 事务:Connection提供了对于事务相关操作的支持
    • 释放资源
  • 实践测试

JDBC概念

数据库实现了数据的持久化,但我们最终要在程序里处理数但我们最终要在程序里处理数据啊,那java代码中怎么去访问数据库读写数据呢?

这就要用到sun公司设定的一套数据库标准了,这套标准就是JDBC(Java Database Connectivity)。但它只是规范,不做具体实现。于是数据库厂商又根据JDBC标准,实现自家的驱动Driver。如:mysql驱动com.mysql.cj.jdbc.Driver,Oracle的驱动oracle.jdbc.OracleDriver。有了这套解决方案,java就可以对数据库进行操作了。

Java中提倡面向接口开发,而最经典的接口设计莫过于JDBC数据库接口。

Connection链接、Statement语句、PreparedStatement预处理语句、CallableStatement存储过程、ResultSet结果集。

调用方式有三种:

  • Statement语句
  • PreparedStatement预处理语句
  • CallableStatement存储过程

推荐使用第二种PreparedStatement,防止SQL注入,其也是预编译性能高。
在这里插入图片描述

JDBC下载安装

mysql官网地址:https://www.mysql.com
jdbc下载地址:https://dev.mysql.com/downloads/connector/j/

下载JDBC

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

安装JDBC

解压JDBC压缩包,放在项目的lib(自己创建)文件夹下
在这里插入图片描述
解压后文件中的jar包添加到依赖中
在这里插入图片描述

详细步骤

import java.sql.*;public class TestJDBC {public static void main(String[] args)throws ClassNotFoundException, SQLException {//通过java访问mysql数据库//这个对象获取数据库链接//注册驱动,输入链接地址,用户名,密码String driver = "com.mysql.cj.jdbc.Driver";//访问本机的mysql数据库,格式 jdbc:数据库://本地端口3306/数据库名?跨时区参数String url = "jdbc:mysql://localhost:3306/mysql-db?serverTimezone=Asia/Shanghai";String username = "root";String password = "root";Class.forName(driver);//获取到数据库链接Connection connection = DriverManager.getConnection(url, username, password);//创建一个Statement语句对象Statement stat = connection.createStatement();//执行SQL语句String sql = "select * from student";//把查询的结果(表记录)存放到ResultSet对象中,结果集ResultSet resultSet = stat.executeQuery(sql);}
}

mysql 8.0(oracle)把驱动包路径改了 驱动包(driver)地址:
8.0 之前。com.mysql.jdbc.Driver
8.0 之后。com.mysql.cj.jdbc.Driver
核心代码也改了,在数据库后面增加参数
时区参数:"?serverTimezone=Asia/Shanghai"

常用数据库URL地址的写法:

  • Oracle:jdbc:oracle:thin:@localhost:1521:mysql-db
  • SqlServer:jdbc:microsoft:sqlserver://localhost:1433;
    DatabaseName=mysql-db
  • MySql:jdbc:mysql://localhost:3306/mysql-db

Connection对象

可以通过对象DriverManager或者DataSource中的getConnection()方法拿到Connection对象,获取到数据库链接。

创建方式:

Connection connection = DriverManager.getConnection(url,user,pass); 
Connection connection = DataSource.getConnection(); 

JDBC1.0使用DriverManager类来产生一个对数据源的连接,相对于DriverManager,
JDBC2.0提供的DataSource接口是一个更好的连接数据源的方法。无需硬性编码驱动,对连接池的支持

三种执行对象:用于将 SQL 语句发送到数据库中

createStatement

  • 作用:用于执行不带参数的简单 SQL 语句
  • 特点:每次执行 SQL 语句,数据库都要执行 SQL 语句的编译,仅执行一次查询并返回结果的情形建议使用这个,此时效率高于 PreparedStatement

静态执行对象创建createStatement

Statement createStatement()
创建一个 Statement 对象来将 SQL 语句发送到数据库。
-
Statement createStatement(int resultSetType, int resultSetConcurrency)
创建一个 Statement 对象,该对象将生成具有给定类型和并发性的 ResultSet 对象。
-
Statement createStatement(int resultSetType, int resultSetConcurrency, int
resultSetHoldability)

创建一个 Statement 对象,该对象将生成具有给定类型、并发性和可保存性的 ResultSet 对象。


PreparedStatement

  • 作用:用于执行带 或 不带参数的预编译 SQL 语句
  • 特点:是预编译的, 在执行可变参数的一条 SQL 语句时,比 Statement 的效率高,安全性好,有效防止 SQL 注入等问题,对于多次重复执行的语句,效率会更高

动态执行对象创建prepareStatement

PreparedStatement prepareStatement(String sql)
创建一个 PreparedStatement 对象来将参数化的 SQL 语句发送到数据库。
-
PreparedStatement prepareStatement(String sql, int autoGeneratedKeys)
创建一个默认 PreparedStatement 对象,该对象能获取自动生成的键。
-
PreparedStatement prepareStatement(String sql, int[] columnIndexes)
创建一个能返回由给定数组指定的自动生成键的默认 PreparedStatement 对象。
-
PreparedStatement prepareStatement(String sql, String[] columnNames)
创建一个能返回由给定数组指定的自动生成键的默认 PreparedStatement 对象。
-
PreparedStatement prepareStatement(String sql, int resultSetType, int
resultSetConcurrency)

创建一个 PreparedStatement 对象,该对象将生成具有给定类型和并发性的 ResultSet 对象。
-
PreparedStatement prepareStatement(String sql, int resultSetType, int
resultSetConcurrency, int resultSetHoldability)

创建一个 PreparedStatement 对象,该对象将生成具有给定类型、并发性和可保存性的 ResultSet 对象。


CallableStatement

  • 作用:用于执行对数据库存储过程 的调用

执行SQL语句

Statement对象常用方法:

方法内容
executeQuery(String sql)用于向数据发送查询语句。
executeUpdate(String sql)用于向数据库发送insert、update或delete语句
execute(String sql)用于向数据库发送任意sql语句
addBatch(String sql)把多条sql语句放到一个批处理中。
executeBatch()向数据库发送一批sql语句执行。

获取结果(ResultSet)

Jdbc中的ResultSet封装了Sql语句的执行结果集。Resultset封装执行结果时,采用的类似于表格的方式,ResultSet 对象维护了一个指向表格数据行的指针。初始的时候,索引值是从1开始(数据库要求)指针指向第一个数据。调用ResultSet.next() 方法,使指针指向下一个数据,可以判断下个数据是否为空,或者可以调用getObject(int index)、getString(int index)等方法来获取指向的数据。

获取行

ResultSet提供了对结果集进行指针的方法:

方法内容
next()移动到下一行
Previous()移动到前一行
absolute(int row)移动到指定行
beforeFirst()移动resultSet的最前面。
afterLast()移动到resultSet的最后面。

获取值

ResultSet封装的数据通过get方法取出:

方法内容
getObject(int index)通过下标获取任意类型的数据
getObject(string columnName)通过列名获取任意类型的数据
getString(int index)通过下标获取指定类型的数据
getString(String columnName)通过列名获取指定类型的数据

事务:Connection提供了对于事务相关操作的支持

支持事务的数据库一般都有自动提交,提交、回滚、保存点、事务隔离级别这几个基本属性。

boolean getAutoCommit()
获取此 Connection 对象的当前自动提交模式。

void commit()
使所有上一次提交/回滚后进行的更改成为持久更改,并释放此 Connection 对象当前持有的所有数据库锁。

void rollback()
取消在当前事务中进行的所有更改,并释放此 Connection 对象当前持有的所有数据库锁。

void rollback(Savepoint savepoint)
取消所有设置给定 Savepoint 对象之后进行的更改。

void setAutoCommit(boolean autoCommit)
将此连接的自动提交模式设置为给定状态。

void setTransactionIsolation(int level)
试图将此 Connection 对象的事务隔离级别更改为给定的级别。

int getTransactionIsolation()
获取此 Connection 对象的当前事务隔离级别。

Savepoint setSavepoint()
在当前事务中创建一个未命名的保存点 (savepoint),并返回表示它的新 Savepoint 对象。

Savepoint setSavepoint(String name)
在当前事务中创建一个具有给定名称的保存点,并返回表示它的新 Savepoint 对象。

void releaseSavepoint(Savepoint savepoint)
从当前事务中移除指定的 Savepoint 和后续 Savepoint 对象。

释放资源

Jdbc程序运行完后,切记要释放程序在运行过程中,创建的那些与数据库进行交互的对象,这些对象通常是ResultSet, Statement和Connection对象。后创建的对象先关闭,先关闭Statement对象再关闭Connection对象。


实践测试

通过SpringBoot项目中的测试类进行测试,数据源datasource已经在application.properties文件中配置,更多配置信息可参考博文https://blog.csdn.net/weixin_53601359/article/details/114416191

//通过元数据让查询映射更加灵活
@Testvoid testSelectNotices() throws SQLException {//1.建立连接Connection connection = dataSource.getConnection();String sql = "SELECT id ,title,TYPE,content,STATUS,createdTime,modifiedUser,modifiedTime FROM sys_notice where id>=?;";//通过PrepareStatement创建Statement,可以动态传入sql中的"?",增加安全性灵活性。PreparedStatement preparedStatement = connection.prepareStatement(sql);//通过setInt方法为sql中第一个"?"赋值为2。//第一个参数为sql中的第几个"?"。第二个参数为对应的"?"赋值,类型和方法对应,例如:String类型参数用setString()方法。preparedStatement.setInt(1, 2);//执行sql,返回值为boolean,判断是否接受到数据(并不能判断执行是否成功,只能判断是否是查询语句),boolean flag = preparedStatement.execute();//创建结果集对象,用来接受数据库传过来的数据和元数据(元数据 = 表字段)ResultSet resultSet = null;if (flag) {//通过preparedStatement.getResultSet()获取结果集(二维表结构)。resultSet = preparedStatement.getResultSet();//建立List集合存储数据,把每一条行数据存储在一个Map中List<Map<String, Object>> list = new ArrayList<>();///通过resultSet对象获取数据库中的元数据(表字段)ResultSetMetaData metaData = resultSet.getMetaData();//通过next()判断是否表中还有下一行数据(指针技术)while (resultSet.next()) {//一行数据对应一个Map对象(行映射)Map<String, Object> map = new HashMap<>();//将取出来的数据存储到Map中(key为元数据"字段",value为每一行对应字段的数据)//getColumnCount()获取表字段的总数for (int i = 1; i < metaData.getColumnCount(); i++) {map.put(metaData.getColumnLabel(i), resultSet.getObject(i));}//将每一行数据的Map对象存储到List集合中list.add(map);}//释放资源,后开启的先关闭resultSet.close();preparedStatement.close();connection.close();//通过foreach遍历List中的数据for (Map<String, Object> lists : list) {for (String key : lists.keySet()) {System.out.print(lists.get(key));}System.out.println();}}}

看到这里,就连单表查询都需要这么多代码,是不是感觉通过JDBC对数据库操作过于繁琐。所以诞生了Mybatis框架,Mybatis是一个优秀的持久层框架,底层基于JDBC实现与数据库的交互。并在JDBC操作的基础上做了封装和优化,它借助灵活的SQL定制,参数及结果集的映射方式,更好的适应了当前互联网技术的发展。在这里插入图片描述
了解Mybatis可参考博文:https://blog.csdn.net/weixin_53601359



http://chatgpt.dhexx.cn/article/560oR86K.shtml

相关文章

什么是视频数据结构化?

什么是视频数据结构化? 视频结构化是一种将视频内容中的重要信息进行结构化提取的技术&#xff0c;利用它对视频内容按照语义关系&#xff0c;采用时空分割、特征提取、对象识别、深度学习等处理手段&#xff0c;组织成可供计算机和人理解的文本信息或可视化图形信息。在实际应…

非结构化数据怎么存?

IDC 预测&#xff0c;2018年到2025年间&#xff0c;全球产生的数据量将会从33 ZB增长到175 ZB&#xff0c;其中超过80%为非结构化数据&#xff0c;并且每年将以指数级趋势递增。 数字化汪洋之上&#xff0c;海雾弥漫&#xff0c;遮天蔽日&#xff0c;组织如何冲破重重阻碍&…

数据结构之图的基本介绍

图的基本介绍 线性表局限于一个直接前驱和一个直接后继的关系&#xff0c;树也只能有一个直接前驱也就是父节点。当我们需要表示多对多的关系时&#xff0c;就需要用到图。 图的基本概念 图&#xff08;Graph&#xff09;是一种数据结构&#xff0c;由顶点&#xff08;verte…

2024年王道数据结构【考研全套笔记】

22年、23年数据结构大纲一致&#xff0c;24年大纲——>目前和23年大纲保持一致 该博客怎么食用&#xff1f; 大部分考408的友友&#xff0c;只是买了书&#xff0c;书上配置的免费视频是滞后2年的&#xff0c;非常不友好&#xff0c;建议在某鱼上or大学慕课正规购买&#x…

数据结构入门学习之数据结构学些什么?

在刚开始学习数据结构&#xff0c;我推荐一定要搞懂三个问题&#xff0c;这将对我们学习数据结构的帮助很大&#xff0c;能让我们对数据结构有一个清晰的认识&#xff0c;问题如下 1.学习数据结构是干嘛用的&#xff1f; 2.什么是数据结构&#xff1f; 3.数据结构要学习什么…

专升本数据结构复习

数据结构知识点总汇 主要参考书目&#xff1a; 程海英老师的《数据结构&#xff08;C语言版&#xff09;》教材严蔚敏&#xff0c;李冬梅&#xff0c;吴伟民&#xff0e;《数据结构&#xff08;C语言版&#xff09;》 推荐视频&#xff1a;西北大学 数据结构-耿国华老师 说…

数据结构基础

一、基本概念 1、数据 数据&#xff08;Data&#xff09;是描述客观事物属性的数、字符及所有能被输入到计算机中并被计算机程序识别和处理的符号的集合。 解释&#xff1a;数据不仅包括整型、字符型等数值类型&#xff0c;还包括字符及声音、图像、视频等非数值类型。 数据…

锚链接跳转

想让页面跳转到指定的地方&#xff0c;这个时候我们可以用到锚链接&#xff0c;锚链接主要有两个部分组成&#xff0c;点击的地方和跳转的地方&#xff0c;点击的地方我们用 <a> 标签&#xff0c;其 href 属性和即将跳转的标签的 id 保持一致就可以了&#xff0c;举个栗子…

Html中锚文本链接怎么写?锚文本链接有属性用法

锚文本链接的概念&#xff1a; 锚文本又称锚文本链接&#xff0c;是链接的一种方法。和超链接相似&#xff0c;超链接的代码是锚文本&#xff0c;把关键词做一个链接&#xff0c;指向其他网页&#xff0c;这种方法的链接就叫作锚文本。锚文本实际上是建立了文本关键词与URL链接…

Markdown(5):锚链接

一、外部链接 格式&#xff1a; 名称 示例: 百度 二、文内链接 格式 名称 示例: 前往测试锚点 这里的markdown图片没有意义&#xff0c;是为了隔开跳转锚点和锚点之间的位置&#xff0c;使点击锚点时明显的呈现跳转效果。 我是测试锚点 我是测试内容

创建锚点链接

如果网页内容较多&#xff0c;页面过长&#xff0c;浏览网页时就需要不断地拖动滚动条&#xff0c;来查看所需要的内容&#xff0c;这样效率较低且不方便。为了提高信息的检索速度&#xff0c;HTML语言提供了一种特殊的链接——锚点链接&#xff0c;通过创建锚点链接&#xff0…

Vue锚链接(两种方法) scrollIntoView

第一种&#xff1a;常见 锚链接&#xff0c;id和 href 结合起来 <div id"one" style"height: 300px;">第一</div> <div id"two" style"height: 300px;">第二</div><a href#one>回到第一</a> <…

Html的锚点链接

HTML中的链接&#xff0c;正确的说法应该称作"锚点"&#xff0c;它命名锚点链接(也叫书签链接)常常用于那些内容庞大繁琐的网页&#xff0c;通过点击命名锚点&#xff0c;不仅让我们能指向文档&#xff0c;还能指向页面里的特定段落&#xff0c;更能当作"精准链…

页面中的锚链接

1、锚链接 方法一 // 设置锚点链接 <a href"#miao">锚点链接</a> // 锚点 <a namemiao>锚点</a>注&#xff1a;name的属性值和锚链接的href中名一样 方法二 // 设置锚点链接 <a href"#miao">锚点链接</a> // 锚…

HTML链接(锚)

锚 使用<a>标记 有两种使用 <a> 标签的方式&#xff1a; 通过使用 href 属性 - 创建指向另一个文档的链接通过使用 name 属性 - 创建文档内的书签 这样说有点抽象&#xff0c;还是在几种实际应用中理解创建链接和创建书签的含义吧&#xff01; 实现网页之间跳…

HTML超链接、锚链接

超链接和锚链接的区别&#xff0c;就是超链接需要跳砖页面&#xff1b;锚链接不需要&#xff0c;在同一页面中跳转到某个位置。 不管是超链接&#xff0c;还是锚链接&#xff0c;都是用a元素。 超链接&#xff1a;超链接的使用就是在href中加入网址&#xff0c;如果是图片超链…

超链接 锚链接 功能性链接 块元素 行内元素

目录 超链接标签 页面间的锚链接 不同页面中的锚链接 功能性链接 行内元素和块元素 超链接标签 超链接的基本应用: 超链接包含两部分内容:1.是链接地址,可以是某个网址或文件的路径,对应为<a>标签的href属性 2. 是链接文本或图像,单击该文本或图像,将跳转到href属…

HDFS原理简图汇总

HDFS原理简图汇总 1.HDFS结构简图 2.namenode和datanode心跳机制 3.namenode元数据更新的checkpoint机制 4.hdfs写数据机制 5.hdfs读数据机制 一图胜千言&#xff0c;把文字转为图形确实可以更进一步对知识做提炼&#xff0c;如有错漏&#xff0c;欢迎大家留言指正。

Hadoop HDFS原理笔记

1&#xff1a;Hadoop家族 2&#xff1a;Hadoop的两大核心 3&#xff1a;HDFS介绍 4&#xff1a;HDFS结构 5&#xff1a;HDFS架构图 6&#xff1a;HDFS的数据存储单元&#xff08;Block&#xff09; 7&#xff1a;HDFS设计思想 8&#xff1a;NameNode&#xff08;NN&#xff0…

HDFS高级-架构原理

文章目录 1 HDFS架构剖析1.1 集群角色介绍1.2 HDFS重要特性 2 HDFS Web Interfaces2.1 模块功能解读OverviewdatanodesDatanode Volume FailuresSnapshotSatartup progressUtilitiesBrowse the file systemLogs、Log LevelConfigruation 3 HDFS读写流程3.1 HDFS写数据流程&…