<MySQL> 什么是JDBC?如何使用JDBC进行编程?

目录

一、JDBC是什么?

二、JDBC常用接口和类

2.1 DataSource

2.2 Connection

2.3 Statement

2.4 ResultSet

三、JDBC的使用

3.1 获得数据库驱动包

3.2 添加到项目依赖

3.3 描述数据库服务器

3.4 建立数据库连接

3.6 执行SQL语句和接收返回数据

3.7 释放资源


一、JDBC是什么?

        世界上编程语言和数据库软件繁多,数据库软件为了适应不同的编程语言,提供了不同的数据库驱动包。MySQL提供了Java语言的驱动包mysql-connector-java。

        JDBC(Java Database Connectivity)就是Java数据库连接,是用于执行SQL语句的Java API,也是Java中的数据库连接规范。JDBC为Java开发人员操作数据库提供了一套标准的API,可以为多种关系型数据库软件提供统一的访问方式,其中就包括MySQL。

JDBC的优点:

JDBC编程中,对数据库的操作均使用JDK自带的API统一处理,通常与特定数据库的驱动类是完全解耦的。这使得Java语言访问数据库操作完全面向接口编程。

使用JDBC后,Java 程序能够与各种数据库系统进行交互,而不用限定在特定数据库厂商的API。
程序有良好的跨平台能力强和可移植性高。

二、JDBC常用接口和类

有以下常用接口和类:

接口名/类名说明
DataSource数据库源,用于指定数据库地址和其他数据库相关信息。
Connection连接,用于和数据库建立连接。
Statement语句,用于将SQL语句发送到数据库。
ResultSet结果集,用于记录符合SQL语句条件的结果。

2.1 DataSource

        数据源(DataSource),用于指定数据库地址和其他数据库相关信息,这些语句写法通常是有固定格式的。

        在指定数据库源之前,需要先明确数据库软件是什么?比如使用的是 MySQL ,那么在使用 DataSource 接口创建对象时,就应该使用关于 MySQL 的实现类 MysqlDataSource

实现类 MysqlDataSource有以下几个常用方法:

方法释义(都为字符串格式)
setUrl设置服务器地址。格式为:jdbc:mysql://服务器地址:端口:/(数据库名?参数名=参数值......)(括号中根据实际需要取舍)
setUser输入数据库服务器的账户名。
setPassword指定账户的密码。

2.2 Connection

        连接(Connection),主要用于和数据库建立连接,使用的方法是 getConnection() 。

可以通过两种方式实现数据库连接(connection):

连接(connection)方式说明
DriverManager驱动管理类。通过静态方法获取,需要使用“反射”机制,不做介绍(或者以后补充,啊哈)
DataSource数据源接口。详见上文。

使用 DriverManager 连接和使用 DataSource 连接的区别:

连接(connection)方式区别
DriverManager通过该类获取的 connection 连接是无法重复利用的,每次使用完后调用 close() 方法释放资源时,都是关闭物理连接。
DataSource该类提供连接池支持。连接池在初始化时将创建一定数量的数据库连接,这些连接是可以重复利用的,没每次使用完数据连接,调用 close() 方法释放资源时,都是将 connection 连接对象回收。

2.3 Statement

        语句(Statement),主要用于将SQL语句发送到数据库中,执行SQL。

JDBC API中主要提供了三种Statement对象:

Statement语句。用于执行不带参数的简单SQL语句。
PreparedStatement预处理语句。无论是否带参数,SQL语句都会先预编译,再传输给数据库系统,执行速度快于 Statement 对象。在实际开发中最常用。
CallableStatement可调用语句。用于执行数据库存储过程的调用。

PreparedStatement 对象的特点:

(1)参数化SQL查询。

(2)SQL语句预编译。
(3)性能高于 Statement 。
(4)可以阻止常见的SQL语句注入攻击。
(5)使用占位符指代参数,占位符下标从1开始。
(6)占位符不能使用多值,即一个占位符只能指代一个参数。

执行SQL的常用方法:

方法名说明
executeQuery()执行方法后,返回单个结果集(ResultSet对象),通常用于select语句。
executeUpdate()

执行方法后,返回一个整数值,指代受该SQL语句影响的数据行行数,通常用于update、insert、delete语句。

2.4 ResultSet

        结果集(ResultSet),用于记录符合SQL语句条件的结果,通过一系列getXXX的方法,可以对结果集中的数据进行访问。


三、JDBC的使用

3.1 获得数据库驱动包

网址:

https://mvnrepository.com/

查找:

版本:根据自己的MySQL版本自行选择对应的包

下载:

3.2 添加到项目依赖

在项目中新建目录:

将包拷贝到目录下,并add:

之后可以正式开始JDBC编程。

3.3 描述数据库服务器

//导入的包;
import javax.sql.DataSource;
import com.mysql.jdbc.jdbc2.optional.MysqlDataSource;

//创建数据源;
DataSource datasource = new MysqlDataSource();

//输入数据库服务器地址;
((MysqlDataSource)datasource).setUrl("jdbc:mysql://服务器地址:端口/");

//输入账户名;
((MysqlDataSource)datasource).setUser("账户名");

//输入密码;
((MysqlDataSource)datasource).setPassword("密码");

创建数据源:

可以使用以下方法创建说明
DataSource datasource = new MysqlDataSource();DataSource是一个接口,使用DataSource的实现类MysqlDataSource创建实例。
MysqlDataSource datasource = new MysqlDataSource();直接使用MysqlDataSource创建实例。

输入数据库服务器地址:

向下转型:

DataSource接口没有setUrl、setUser、setPassword方法,向下转型为MysqlDataSource才能使用,即((MysqlDataSource)datasource)。

参数为字符串:setUrl、setUser、setPassword三个方法,参数都为字符串。
服务器地址格式说明

jdbc:mysql://服务器地址:端口/

指定服务器地址和端口,如果服务器和客户端都在本地,可以使用127.0.0.1作为服务器地址,使用默认的3306作为端口;
在已有数据库database的情况下,也可以直接连接到数据库:
格式:

jdbc:mysql://服务器地址:端口/数据库名?字符集=参数...其他参数=参数.......

3.4 建立数据库连接

//导入的包;
import java.sql.Connection;
import java.sql.SQLException;

//建立连接;
Connection connection = datasource.getConnection();

建立连接:

datasource.getConnection() 方法会抛出异常,使用 throws 抛出或使用 cry/catch 捕获异常。

3.5 创建SQL语句对象

//导入的包;
import java.sql.PreparedStatement;

//创建SQL语句对象;
//例:创建数据库;
PreparedStatement statement = connection.prepareStatement
        ("create database if not exists 数据库名 character set 字符集名;");

//例:创建数据表;
PreparedStatement statement = connection.prepareStatement
        ("create table if not exists 表名(列名 数据类型 约束,......);");

//例:参数化SQL语句,插入数据行;
PreparedStatement statement = connection.prepareStatement
        ("insert into 表名 values(?,?)");
statement.setInt(下标,值);
statement.setString(下标,值);
使用 connection.prepareStatement() 方法将字符串转化为SQL语句对象。
使用了 PreparedStatement 类,SQL语句可以参数化,如上文例子,将insert语句中需要插入的值通过占位符“?”代替,再由 PreparedStatement 类提供的一系列 setXXX 方法,对占位符的数值进行设置
setXXX 方法参数中的下标,从1开始,1就代表第一个占位符“?”号

3.6 执行SQL语句和接收返回数据

增、删、改操作:

//进行增、删、改操作;

//执行SQL语句并接收int型返回值;
int n = statement.executeUpdate();
增、删、改操作使用 executeUpdate() 方法:返回值为 int 类型,返回的是执行该语句后,受到影响的数据行行数。

查询操作:

//导入的包;
import java.sql.ResultSet;

//进行查询操作;

//执行SQl语句,并接受ResultSet结果集;
ResultSet resultSet = statement.executeQuery();

//遍历结果集resultSet,得到查询的数据;
while (resultSet.next()){
    System.out.println(resultSet.getXXX(列下标/列名));
}
查询操作使用 executeQuery() 方法:返回值为 ResultSet 类型,是一个结果集,这个结果集是MySQl中的临时表。
想要得到结果集的数据,需要使用 resultSet.next() 方法来获得判断是否存在下一数据,并移动指针。
ResultSet 类提供了一系列的 getXXX 方法来获得结果集中的数据,参数可以是数据表中列的下标,也可以是列名等。

3.7 释放资源

//释放资源;

//关闭结果集;
resultSet.close();

//关闭命令;
statement.close();
        
//关闭连接;
connection.close();
对于对象内部持有一些计算机重要的软硬件资源的对象,应当在使用完毕后及时释放。
释放资源应当后创建的先释放,先创建的后释放。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

08-黑马点评项目发布笔记和查看笔记功能的实现

发布笔记 数据模型 tb_blog探店笔记表,包含笔记的标题、文字、图片等 tb_blog探店笔记表对应的实体类 增加用户图标和和用户姓名以及是否被点赞过了的字段,这些字段不属于Blog表只是为了实现在展示笔记的时候同时展示用户的信息 Data EqualsAndHashCode(callSuper false) …

移动端路径传参以数字的形式,写死的情况

页面1 async getListTransferAndApprova() { //把mark值拼接到路径的后面,定义一个变量,使得切换穿的mark都不一样let mark ;if (this.tabsCurrent 0) {mark 2;} else if (this.tabsCurrent 1) {mark 3;}else if (this.tabsCurrent 2) {mark 4;}…

CSS特效014:模仿钟摆效果

CSS常用示例100专栏目录 本专栏记录的是经常使用的CSS示例与技巧,主要包含CSS布局,CSS特效,CSS花边信息三部分内容。其中CSS布局主要是列出一些常用的CSS布局信息点,CSS特效主要是一些动画示例,CSS花边是描述了一些CSS…

毕业设计1784 ASP.NET停车场管理系统

摘要 本文设计了一个停车场管理系统,该系统分为超级管理员和管理员两种用户。系统实现了车位管理、停车卡管理、停车管理、统计报表、系统管理等功能。管理员可以添加、查看、编辑或删除车位信息、停车卡信息、停车记录等,同时可以按日、月、年统计进场…

springboot实现在线人数统计

在线人数统计 笔者做了一个网站,需要统计在线人数。 在线有两种: 一、如果是后台系统如果登录算在线,退出的时候或者cookie、token失效的时候就算下线 二、如果是网站前台,访问的时候就算在线 今天我们来讲一下第2种情况&…

创建谷歌账号 绕过手机验证(2023.11亲测有效)

如何成功注册谷歌账号:一个详细实用指南 写在最前面谷歌注册全流程环境配置切换至全英文环境 开通foxmail.com邮箱在英文环境下注册验证邮箱注册过程中的注意事项完成!总结 写在最前面 在这个数字化迅速发展的时代,谷歌账号几乎成为了我们日…

STM32外部中断(EXTI)与RTOS多任务处理的协同设计

当在STM32上使用外部中断(EXTI)与RTOS(Real-Time Operating System,实时操作系统)进行多任务处理时,需要设计合适的协同机制,以确保可靠的中断处理和任务调度。在下面的概述中,我将介…

python django 小程序博客源码

开发工具: PyCharm,mysql5.7,微信开发者工具 技术说明: python django html 小程序 功能介绍: 用户端: 登录注册(含授权登录) 首页显示搜索文章,文章分类&#xf…

【每日一题】—— C. Yarik and Array(Codeforces Round 909 (Div. 3))(贪心)

🌏博客主页:PH_modest的博客主页 🚩当前专栏:每日一题 💌其他专栏: 🔴 每日反刍 🟡 C跬步积累 🟢 C语言跬步积累 🌈座右铭:广积粮,缓称…

【C++】类与对象(上)

目录 1. 面向过程和面向对象初步认识 2. 类的引入 3. 类的定义 4. 类的访问限定符及封装 4.1 访问限定符 4.2 封装 5. 类的作用域 6. 类的实例化 7. 类对象模型 7.1 如何计算类对象的大小 7.2 类对象的存储方式猜测 7.3 结构体内存对齐规则 8. this指针 8.1 this指…

Day34力扣打卡

打卡记录 合并石头的最低成本(区间DP) 链接 与多边形的三角形问题相同,将大问题化小问题,再用中间节点不断地寻找最值。 class Solution:def mergeStones(self, stones: List[int], k: int) -> int:n len(stones)if (n - 1…

wangEditor富文本编辑器使用

一、官网 开源 Web 富文本编辑器&#xff0c;开箱即用&#xff0c;配置简单 二、下载安装 npm install --save wangeditor/editor-for-vue 三、在vue中使用 3.1、抽离组件editor.vue 在工程的components目录下新建组件editor <template><div><Toolbar:edi…

【C++入门到精通】右值引用 | 完美转发 C++11 [ C++入门 ]

阅读导航 引言一、左值引用和右值引用1. 什么是左值&#xff1f;什么是左值引用&#xff1f;2. 什么是右值&#xff1f;什么是右值引用&#xff1f;3. move( )函数 二、左值引用与右值引用比较三、右值引用使用场景和意义四、完美转发std::forward 函数完美转发实际中的使用场景…

SVG的viewBox、width和height释义, 示例及代码

svg的是没有边界的&#xff0c;svg画布只是用于展示svg世界中某一个范围的内容&#xff0c;而对于超过了svg画布范围的内容&#xff0c;则会被遮挡。默认svg画布默认显示世界坐标下原点坐标的width*height面积的矩形视野。 ​ 我们可以通过viewBox来修改默认的显示配置&#…

图新地球地图导入操作步骤

1、下载图源&#xff0c;如下&#xff1a; 2、将其全部复制或部分复制&#xff0c;然后回到桌面&#xff0c;打开文件所在位置&#xff0c;如下&#xff1a; 3、将复制的数据粘贴到文件夹下&#xff0c;具体如下&#xff1a; 4、复制到路径如下&#xff1a; 5、复制结果如下&am…

Spring Boot - filter 的顺序

定义过滤器的执行顺序 1、第一个过滤器 import javax.servlet.Filter; import javax.servlet.FilterChain; import javax.servlet.FilterConfig; import javax.servlet.ServletException; import javax.servlet.ServletRequest; import javax.servlet.ServletResponse; impor…

linux如何使用shell远程连接

简介&#xff1a;本文的一切条件基于redhat的linux操作系统。 1、创建虚拟机&#xff1a; 如有需要&#xff0c;请转至【linux基础】在VMware上安装RHEL9详细教程_融社的博客-CSDN博客 &#xff08;如若侵权&#xff0c;该篇立删&#xff09; 2、使用命令查看网段信息 打…

LeetCode【4】寻找两个正序数组中位数

题目&#xff1a; 思路&#xff1a; https://blog.csdn.net/a1111116/article/details/115033098 代码&#xff1a; public double findMedianSortedArrays(int[] nums1, int[] nums2) {int[] ints Arrays.copyOf(nums1, nums1.length nums2.length);System.arraycopy(nums2…

Linux网络——HTTP

一.应用层 我们程序员写的一个个解决我们实际问题, 满足我们日常需求的网络程序, 都是在应用层. 我们上一次写的网络版本计算器就是一个应用层的网络程序。 我们约定了数据的读取&#xff0c;一端发送时构造的数据, 在另一端能够正确的进行解析, 就是ok的. 这种约定, 就是应…

java 访问sqlserver 和 此驱动程序不支持jre1.8错误

sqlserver数据如下&#xff1b; TestSQL.java&#xff1b; import java.sql.*;public class TestSQL {public static void main(String[] args) throws ClassNotFoundException, SQLException {String driverName "com.microsoft.sqlserver.jdbc.SQLServerDriver";…