JDBC操作流程

news2024/7/7 17:05:48

目录

简介

具体操作

1. 引入驱动包

1)下载驱动包

2)引入驱动包到项目中

2. 编写代码

1)创建数据源

2)建立连接

3)构造 SQL 语句

4)执行 SQL 语句

5)释放资源

总结


简介

JDBC 就是使用 Java 代码来操作数据库。市面上有很多种数据库,其中每种数据库都有着自己的一套 API,Java 为了方便,统一所有数据库都来实现 JDBC 这套API,使得所有类型的数据库在Java 中都可以按照 JDBC 这套 API 提供的方式来操作。

JDBC 是一套 API,而不同的数据库又有自己的一套 API,因此使用 JDBC 操作数据库的时候,就需要进行 API 之间的转化,数据库厂商就提供了专门的代码来进行转化——数据库驱动包( 作用类似于翻译官 )

具体操作

此处使用 MySQL 作为示例:

1. 引入驱动包

1)下载驱动包

首先,我们需要下载 MySQL 的驱动包。可以从多种渠道,例如官方网站,Github( 如果是一个开源项目 ),其中最方便的就是在 Maven 中央仓库中进行下载:https://mvnrepository.com/

在搜素框中搜索需要的数据库,然后选择所需的版本,注意大版本需要和数据库服务器版本保持一致,小版本无所谓( 小数点后的版本号 )。然后点击类似下图中的位置进行下载:

2)引入驱动包到项目中

下载完成之后,需要引入到我们现有的项目中( 下述是以一个最普通的项目来作为示例 ):

创建一个专门存放依赖包的目录,一般命名为 lib,将 jar 包放到该目录下,如果点击下图中的选项,使该目录下的 jar 包能够被正常识别:

2. 编写代码

1)创建数据源

数据源指明了我们的数据库服务器地址,具体代码如下:

DataSource dataSource = new MysqlDataSource();
((MysqlDataSource)dataSource).setUrl("jdbc:mysql://127.0.0.1:3306/testTable?characterEncoding=utf8&useSSL=false");
((MysqlDataSource)dataSource).setUser("root");
((MysqlDataSource)dataSource).setPassword("root");

DataSource 是 JDBC 提供的一个 interface,MysqlDataSource 是 MySQL 驱动包提供的类,该类实现了 DataSource 这个 interface。上述调用的 setUrl、setUser、setPassword 方法都是MysqlDataSource 这个子类的方法,因此调用之前需要进行向下转型。

上述转型的写法是推荐写法,虽然下述写法是更方便的写法,但是转型的目的是希望不要让MysqlDataSource 这个类扩散到其他代码,其他代码使用 datasource 对象时,仍然是一个JDBC 提供的 DataSource 类的对象而不是一个 MySQL 驱动包提供的 MysqlDataSource 类的对象,降低 MySQL 驱动包和项目代码的耦合程度,后续方便更换数据库。

MysqlDataSource dataSource = new MysqlDataSource();
dataSource.setUrl("jdbc:mysql://127.0.0.1:3306/testTable?characterEncoding=utf8&useSSL=false");
dataSource.setUser("root");
dataSource.setPassword("root");

上述的 setURL 中的参数是一个固定模板,其中每个部分的具体含义如下:

  • jdbc:mysql:表明当前这个 URL 的具体用途,是给 JDBC 的 MySQL 进行使用的;
  • 127.0.0.1:当前数据源指向的数据库服务器的IP地址;
  • 3306:当前数据源指向的数据库服务器的上的数据库应用程序所占据的端口号;
  • testTable:数据库名字;
  • characterEncoding=utf8:统一字符集为utf8,避免使用中文等其他语言时出现乱码;
  • useSSL=false:设置数据库服务器和客户端之间的通信是否进行加密。
2)建立连接

上述只是创建了一个数据源,真正连上数据库还需要创建一个和数据库服务器的连接:

Connection connection = dataSource.getConnection();

注意上述的Connection类需要导入的是JDBC下的类:

3)构造 SQL 语句

假设现在有一个表中有两列:id int,name varchar(20)

String sql = "insert into student values(1, '张三')";
PreparedStatement statement = connection.prepareStatement(sql);

我们在代码中创建的SQL语句本身,是 String 类型的,但是 JDBC 并不认识字符串类型的 SQL,因此 JDBC 提供了 Statement(语句)对象,可以把 String 转换成 Statement 再发给服务器执行。但是,一般会使用 PreparedStatement(预处理的语句)对象来代替 Statement。

这二者的区别是:

  • Statement 是把 SQL 直接发给数据库服务器,数据库服务器来负责解析 SQL;
  • PreparedStatement 会先在客户端这边初步解析一下 SQL( 验证语法格式是否符合要求啥的 ),此时服务器就不用做这些检查了,从而降低服务器的负担。

除了上述这种写死的语句,也可以动态构造 SQL 语句:

注意下述这种写法:

String sql = "insert into student values(" + id + ", '" + name + "')";
PreparedStatement statement = connection.prepareStatement(sql);

虽然这种写法也可以,但是存在问题:可读性低,代码混乱和存在SQL注入风险。

因此更推荐下述写法:

String sql = "insert into student values(?, ?)";
PreparedStatement statement = connection.prepareStatement(sql);
statement.setInt(1, id);
statement.setString(2, name);

具体步骤:

  1. 使用" ? "来作为参数的占位符
  2. 使用特定的 setXXX 方法,来设置占位符所需要的变量。注意此处的的占位符顺序是从 1 开始的。执行过程中,setXXX 方法会对参数进行严格校验,避免了 SQL 注入问题。
4)执行 SQL 语句

执行 SQL 语句时,有两个方法可以选择:

executeQuery:用于执行写操作,用于执行查询语句。其中返回值是 ResultSet,是一个临时表格。当我们拿到结果集的时候,就需要遍历这个临时表格。

ResultSet resultSet = statement.executeQuery();
while (resultSet.next()) {
    int id = resultSet.getInt("id");
    String name = resultSet.getString("name");
}

使用 resultSet.next() 方法效果如下:

1)存在一个光标,初始位置指向临时表的第一行记录的前面;

2)每次执行 next 方法,光标都会往下走,如果存在记录返回 true,否则返回 false。如果存在记录则可以拿到该行记录中的每一列,具体是使用该列的数据类型对应的 getXXX 方法,传入列名来获取。

executeUpdate:用于执行写操作,用于执行增加、删除、修改语句。其中返回值就是影响的行数。

int n = statement.executeUpdate();
5)释放资源

创建的语句对象和连接对象等,都会持有一些计算机的 硬件 / 软件 上的资源,这些资源不用了就需要及时释放。注意关闭顺序:先创建的后关闭。

resultset.close();
statement.close();
connection.close();

总结

上述就是使用 JDBC 的全部流程,整体过程相对比较繁琐,因此大佬们针对 JDBC 操作进行进一步封装,得到了一些针对数据库操作的框架,统称为 ORM,例如:Mybatis、Mybatis-plus。但是这些框架的背后原理还是使用 JDBC。

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

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

相关文章

2024年工程项目管理者的软件指南:11款必试进度管理工具

本文将分享11个值得关注的工程项目进度管理软件:Worktile、Fieldwire、Procore、Buildxact、InEight、Contractor Foreman、Housecall Pro、ClickUp、RedTeam Go、Visual Planning、B2W Schedule。 在竞争激烈的建筑行业,工程项目的进度管理是项目成功的…

rocketmq实现多数据源配置

rocketmq实现多数据源配置 背景:一 添加ExtRocketMQTemplateConfiguration配置类二 添加非标mq的配置参数三 非标准RocketMQTemplate 背景: 在实际项目中我们可能会遇到在springboot项目中使用多个mq数据源,那我们该如何配置呢? …

[DataWhale大模型应用开发]学习笔记1-尝试搭建向量数据库

1.词向量 1.定义 词向量(Word Vector)是将单词表示为向量形式的技术,是自然语言处理(NLP)中的一种常用方法。通过将单词转化为向量,计算机能够更好地理解和处理语言。简单来说,词向量就是将单…

golang结合neo4j实现权限功能设计

neo4j 是非关系型数据库之图形数据库,这里不再赘述。 传统关系数据库基于rbac实现权限, user ---- role ------permission,加上中间表共5张表。 如果再添上部门的概念:用户属于部门,部门拥有 角色,则又多了一层: user-…

vulnhub靶场ai-web 2.0

1 信息收集 1.1 主机发现 arp-scan -l 主机地址为192.168.1.4 1.2 服务端口扫描 nmap -sS -sV -A -T5 -p- 192.168.1.4 开放22,80端口 2 访问服务 2.1 80端口访问 http://192.168.1.4:80/ 先尝试admin等其他常见用户名登录无果 然后点击signup发现这是一个注…

Codeforces Round 346 (Div. 2) E. New Reform 题解 并查集

New Reform 题目描述 Berland has n n n cities connected by m m m bidirectional roads. No road connects a city to itself, and each pair of cities is connected by no more than one road. It is not guaranteed that you can get from any city to any other one,…

如何养成爱自己的习惯:吸引世间美好,改变命运

在这个快节奏、高压力的时代,我们常常被各种事务所困扰,内心难以得到真正的宁静。然而,古老的智慧告诉我们,“静”是宇宙万物的根源,是生命恢复的根本。本文将探讨如何养成“静”的习惯,从而吸引世间美好&a…

Apache POI、EasyPoi、EasyExcel

&#xff08;一&#xff09;Apache PoI 使用 &#xff08;二&#xff09;EasyPoi使用 &#xff08;三&#xff09;EasyExcel使用 官方文档&#xff1a; 写Excel | Easy Excel 官网 写 使用注解在字段上进行标识 使用最简单的方法二即可 /*** 最简单的写* <p>* 1. 创建…

入门PHP就来我这(纯干货)04

~~~~ 有胆量你就来跟着路老师卷起来&#xff01; -- 纯干货&#xff0c;技术知识分享 ~~~~ 路老师给大家分享PHP语言的知识了&#xff0c;旨在想让大家入门PHP&#xff0c;并深入了解PHP语言。 我们接着《想入门PHP就来我这&#xff08;纯干货&#xff09;03》继续往下学习&am…

忘记家里的wifi密码用iPhone苹果手机怎么找回?

忘记家里的wifi密码用iPhone苹果手机怎么找回&#xff1f; 1、打开iPhone苹果手机上的设置&#xff1b; 2、在iPhone苹果手机设置里找到并进入无线局域网&#xff1b; 3、选择要找回密码的wifi&#xff0c;且已连接&#xff0c;并点击后面的更多进入&#xff1b; 4、进入无线局…

Excel分组求和

目录 1 参考文章2 UNIQUE函数分组3 SUMIF函数分组求和 1 参考文章 1.整体思路&#xff1a;https://blog.csdn.net/Alice_loong/article/details/135580130 2.UNIQUE函数&#xff1a;https://mp.weixin.qq.com/s?__bizMzI3OTcwNDE3OQ&mid2247487044&idx1&sna28108…

浅谈Web性能测试(原创)

一、性能测试不是什么高技术的活&#xff1a; 说到性能测试&#xff0c;很多工作时间较短的新同事或者应届生就很害怕。 为什么害怕&#xff0c;因为感觉无从下手&#xff0c;不知道该做什么、怎么做、做到什么程度&#xff1f; 一听性能测试首先想到的是各种专业的性能测试…

Echarts-柱状图

1.案例1 1.1代码 option = {textStyle: {color: #fff // 标题文字颜色为白色},tooltip: {trigger: axis,axisPointer: {type: shadow,},},legend: {textStyle: {color: white}},grid: {top: 15%,left: 4%,right: 4%,bottom: 7%,containLabel: true},xAxis:{type: category,da…

分文件编译(简单学生系统)

定义学生基本信息 ①输出所有学生信息 ②删除某个学生后&#xff0c;输出所有学生信息 ③修改某个学生信息后&#xff0c;输出所有学生信息 ④查找某个学生的信息 main.c #include"k11*.h" int main(int argc, const char *argv[]) {struct student p[4]{{"…

ShareX:不仅仅是截图工具

名人说&#xff1a;莫道谗言如浪深&#xff0c;莫言迁客似沙沉。 ——刘禹锡《浪淘沙》 创作者&#xff1a;Code_流苏(CSDN)&#xff08;一个喜欢古诗词和编程的Coder&#x1f60a;&#xff09; 目录 一、软件介绍1、ShareX2、核心功能 二、下载安装1、下载2、安装 三、使用方法…

CentOS7.9下yum升级Apache HTTP Server2.4.6到2.4.60

CentOS7.9系统默认的Apache版本 在CentOS7.9上&#xff0c;如果使用yum安装Apache HTTP Server是最多到2.4.6版本的&#xff0c;这是因为el7下官方仓库的最高版本就是2.4.6&#xff0c;证据如下&#xff1a; $ yum info httpd ...... Installed Packages Name : httpd…

虚拟纪念展馆建设的重大意义:重新定义纪念活动的未来

一、什么是虚拟纪念展馆&#xff1f; 虚拟纪念展馆是一种利用3D、VR等技术在线展示历史事件、人物或文化遗产的数字化空间。这些展馆通过虚拟现实、增强现实和3D建模等技术手段&#xff0c;创建出身临其境的体验&#xff0c;使参观者可以在互联网上以互动方式探索和学习。 二、…

Golang | Leetcode Golang题解之第205题同构字符串

题目&#xff1a; 题解&#xff1a; func isIsomorphic(s, t string) bool {s2t : map[byte]byte{}t2s : map[byte]byte{}for i : range s {x, y : s[i], t[i]if s2t[x] > 0 && s2t[x] ! y || t2s[y] > 0 && t2s[y] ! x {return false}s2t[x] yt2s[y] …

nginx 只有图片等静态资源时 监听80端口 会404 NOT FOUND

解决方法 删除 /var/nginx/sites-enabled 原因&#xff1a;当nginx没有设置首页路径index时&#xff0c;sites-enabled目录中配置的优先级会高于nginx.conf 导致404 NOT FOUND sites-enabled文件中的default会将80端口索引至默认值&#xff1a;/var/www/html目录下&#xff…

Redis基础教程(八):redis集合(Set)

&#x1f49d;&#x1f49d;&#x1f49d;首先&#xff0c;欢迎各位来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里不仅可以有所收获&#xff0c;同时也能感受到一份轻松欢乐的氛围&#xff0c;祝你生活愉快&#xff01; &#x1f49d;&#x1f49…