JDBC操作流程

目录

简介

具体操作

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.mzph.cn/web/38283.shtml

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

相关文章

某网页gpt的JS逆向

原网页网址 (base64) 在线解码 aHR0cHM6Ly9jbGF1ZGUzLmZyZWUyZ3B0Lnh5ei8 逆向效果图 调用代码(复制即用) 把倒数第三行换成下面的base64解码 aHR0cHM6Ly9jbGF1ZGUzLmZyZWUyZ3B0Lnh5ei9hcGkvZ2VuZXJhdGU import hashlib import time import reques…

C语言+ MSSQL技术开发的 PACS系统源码:CT后处理技术之仿真内镜CTVE

C语言 MSSQL技术开发的 PACS系统源码:CT后处理技术之仿真内镜CTVE 仿真内窥镜VE VE是利用医学影像作为原始数据,融合图像处理、计算机图形学、科学计算可视化、虚拟现实技术,模拟传统光学内镜的一种技术。 又叫做腔内重建技术,是…

试用笔记之-汇通来电显示软件

首先汇通来电显示软件下载 http://www.htsoft.com.cn/download/httelephone.rar

平衡树专题Splay

写在前面: 部分来自孙宝(Steven24)的博客,表示感谢。 认识 什么是Splay 就是BST的一种,整体效率是很高的,均摊的次数是O(logn)级别的。 基本操作就是把节点旋转到BST的root,从而改善BST的平…

免交互简单操作

免交互 交互:我们发出指令控制程序的运行,程序在接收到指令后按照指令的效果作出对应的反应 免交互:间接的,通过第三方的方式把指令传给程序,不用直接下达指令 Here Document免交互 这是命令行格式,也可…

不用找了!这个软件自带各行业话术,客服效率飞跃

有一款客服工具软件,不但能吸附聊天窗口,实现图文视频话术的一键发送,还内置了多行业的优质客服话术模板,允许用户直接下载使用,快速构建起适合自身企业的专业客服知识库。 前言 在今天的快节奏商业环境中&#xff0c…

Linux shell脚本编程

一、sehll简介: 用户通过shell向计算机发送指令的 计算机通过shell给用户返回指令的执行结果 1.1、通过shell编程可以达到的效果 提高工作的效率 可以实现自动化 1.2、sehll脚本编写的流程 1、用vi/vim创建一个.sh的文件 2、在文件中进行开发 3、个文件赋予可执行权…

【如何使用RSA签名验签】python语言

文章目录 签名方法异步同步通知数据验签生活号响应数据验签同步响应数据验签 🌈你好呀!我是 山顶风景独好 🎈欢迎踏入我的博客世界,能与您在此邂逅,真是缘分使然!😊 🌸愿您在此停留的…

作业7.2

用结构体数组以及函数完成: 录入你要增加的几个学生,之后输出所有的学生信息 删除你要删除的第几个学生,并打印所有的学生信息 修改你要修改的第几个学生,并打印所有的学生信息 查找你要查找的第几个学生,并打印该的学生信息 1 /*…

idea常用问题记录

文章目录 1.ant构建报错编译错误1.1 解决办法 1.ant构建报错编译错误 Compile failed;xxx 1.1 解决办法

Python系统教程02

巩固 input()输出函数 回顾 1 、 input()函数: 在 input()函数输入时,输入的内容一定为字符串类型。 2 、条件分支语句: 每一个 if 语句可以看成一个个体,elif 和 else 都是一个 if 个体的一部分,每一个 if 个体 运…

51单片机外部中断(按键识别)

欢迎入群共同学习交流 时间记录:2024/7/2 一、电路原理图 51单片机包含INT0、INT1两个外部中断接口 二、知识点介绍 1.中断寄存器位介绍 (1)TCON定时控制寄存器,位0(IT0)中断INT0请求信号选择位&#x…

WordPress主题开发进群付费主题v1.1.2 多种引流方式

全新前端UI界面,多种前端交互特效让页面不再单调,进群页面群成员数,群成员头像名称,每次刷新页面随机更新不重复,最下面评论和点赞也是如此随机刷新不重复 进群页面简介,群聊名称,群内展示&…

注意!年龄越大,社交圈子越窄?其实这是老人的理性选择!数学家告诉你:何时该跳槽,何时该坚守!你必须知道的三个智慧:让你的人生更加精彩!

我们到底应该在什么情况下探索新事物,什么情况下专注于已有的东西呢?本质上来说,这个问题就是在询问,你究竟应该耗费精力去探索新的信息,还是专注从既有的信息中获取收获? 有人采访了临终的老人&#xff0c…

中国三大平原矢量示意图分享

我们在《中国地势三级阶梯示意图分享》、《中国四大高原矢量示意图分享》和《中国主要山脉矢量示意图分享》等文中,为你分享过中国地势相关的矢量示意图。 现在再为你分享一下我国东北平原、华北平原和长江中下游平原的矢量示意图,这三大平原均位于我国…

Python实现万花筒效果:创造炫目的动态图案

文章目录 引言准备工作前置条件 代码实现与解析导入必要的库初始化Pygame定义绘制万花筒图案的函数主循环 完整代码 引言 万花筒效果通过反射和旋转图案创造出美丽的对称图案。在这篇博客中,我们将使用Python来实现一个动态的万花筒效果。通过利用Pygame库&#xf…

大数据可视化实验(八):大数据可视化综合实训

目录 一、实验目的... 1 二、实验环境... 1 三、实验内容... 1 1)Python纵向柱状图实训... 1 2)Python水平柱状图实训... 3 3)Python多数据并列柱状图实训.. 3 4)Python折线图实训... 4 5)Python直方图实训...…

边缘网关带来的效益探讨-天拓四方

边缘网关作为连接物理世界与数字世界的桥梁,在智能制造、智慧城市等各个领域中发挥着关键作用。通过收集、处理来自各种传感器和设备的数据,边缘网关为实时决策、优化生产流程以及提高运营效率提供了强有力的支持。下面我们将探讨边缘网关带来的效益。 …

链路全贯通,价值引领数据能力升级|爱分析报告

数据能力已经成为企业的核心竞争力。政策驱动数据产业发展加速,如2023年国家数据局成立;2024年,《“数据要素”三年行动计划(2024-2026年)》正式发布;并且 2024年起正式将数据资源视为资产纳入财务报表&…

C++——list类用法指南

一、list的介绍 1、list是可以在常数范围内在任意位置进行插入和删除的序列式容器,并且该容器可以前后双向迭代 2、list的底层是双向链表结构,双向链表中每个元素存储在互不相关的独立节点中,在节点中通过指针指向其前一个元素和后一个元素 …