当前位置:网站首页>MySQL的JDBC编程
MySQL的JDBC编程
2022-07-23 21:57:00 【Zzt.opkk】
MySQL的JDBC编程
1. 数据库编程的条件
- 编程语言: Java,C,C++,Python…
- 数据库: Oracle,MySQL,SQLServer…
- 数据库驱动包: 不同的数据库,对应不同的编程语言提供不同的数据库驱动包,
- 如:MySQL提供了Java的驱动包mysql-connector-java,需要基于Java操作MySQL即需要该驱动包。同样的,
要基于Java操作Oracle数据库则需要Oracle的数据库驱动包ojdbc .
- 如:MySQL提供了Java的驱动包mysql-connector-java,需要基于Java操作MySQL即需要该驱动包。同样的,
2. JDBC编程
JDBC,即Java Database Connectivity,java数据库连接 ,是一种用于执行SQL语句的Java API(计算机中一个相当广泛使用的术语Application Programming Interface提供了一些函数/方法/类,可以让程序员直接调用来完成一些功能),称为"数据库SDK"(software development kit, SDK概念要更广泛,除了可以提供API之外,还会提供一些可执行程序(工具)辅助开发/调试…),就可以借助这些API比较方便的访问数据库服务器.
对于MySQL/Oracle/SQLServer是客户端/服务器结构的程序,那么操作数据库是通过官方提供的命令行客户端/图形化界面/代码中的哪一个呢?现在主流的操作数据库方式是通过代码操控.
在早期不同的的数据库提供的API都不太一样,对于程序员十分不友好,于是Java提供一套"标准"的接口体系,让这些数据库厂商.提供的API都往Java这套接口体系中进行适配,所以程序员只需要掌握Java这一条API就可以适应所有常见的主流数据库了.Java的这套操作数据库的API,就称为JDBC.
3. JDBC工作原理
JDBC 为多种关系数据库提供了统一访问方式,作为特定厂商数据库访问API的一种高级抽象,它主要包含一些通用的接口类
JDBC访问数据库层次结构:
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-M7jd2PDR-1658300956096)(C:\Users\a\AppData\Roaming\Typora\typora-user-images\image-20220717150318903.png)]](/img/12/b8cc8ad7c22e105573805b0ef76811.png)
JDBC优势:
- Java语言访问数据库操作完全面向抽象接口编程
- 开发数据库应用不用限定在特定数据库厂商的API
- 程序的可移植性大大增强
4. JDBC的使用
4.1 操作数据库 - 插入
要操作数据库,首先要连上数据库,要想连上数据库,就得描述数据库的位置.在JDBC中,使用DataSource这个类来描述MySQL服务器位置,
//DataSource是一个interface,不能直接实例化.而MysqlDataSource则是实现了DataSource,这个类是来自于驱动包. //这个操作就是 - 向上转型 DataSource dataSource = new MysqlDataSource(); //连接服务器 - 向下转型 ((MysqlDataSource)dataSource).setUrl("jdbc:mysql://127.0.0.1:3306/java104?characterEncoding=utf8&useSSL=false");这里就会有人有疑问了,为什么不用直接用MysqlDataSource来实例化对象呢?这样不是十分方便吗?
MysqlDataSource dataSource = new MysqlDataSource(); dataSource.setUrl();虽然两种写法没啥区别.但是实际开发中可能还是更多的看到第一种写法.
- 第一种写法里,得到的数据源是 DataSource类型.后续写其他代码,方法/类,如果使用到数据源,持有的类型也是 DataSource类型,DataSource是通用的类型,可以代指任何数据库.未来一旦需要更换数据库,代码改动是非常小的,只需要把实例化这一小块代码改了即可,其他代码都不用变.
- 第二种写法,得到的数据源是MysqlDataSource类型.后续的其他代码,方法/类,如果用到数据源,持有的类型也就是MysqlDataSource,而MysqlDataSource只是针对MySQL的类型.未来一旦更换数据库,可能就需要把散落在代码各个地方的MysqIDataSource类型进行修改.
第一种写法大大提高代码的可维护性,可拓展性.
//MySQL数据连接的URL参数格式如下: jdbc:mysql://服务器地址:端口/数据库名?参数名=参数值![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-KDaYDy3a-1658300956098)(C:\Users\a\AppData\Roaming\Typora\typora-user-images\image-20220717155040996.png)]](/img/a8/0dc90f1b81460f2367c587db304c48.png)
输入用户名和密码:
((MysqlDataSource)dataSource).setUser("root");
((MysqlDataSource)dataSource).setPassword("123456");
所以通过IP地址,端口号,数据库名,用户名和密码就描述数据库的位置.
- 和数据库服务器创建连接
在网络通信中,有两种风格,一种是’有连接’,相当于"打电话";另一种是’无连接’,相当于"发微信".
数据采用的是"有连接"的方式,主要是能够在通信前,先看看通信的链路是否通畅,有个坏处,就是连接需要管理,对于不用的连接需要及时释放(比如打电话时,忘记挂电话,导致无法断开连接,话费蹭蹭蹭的留~~).
// 导入import java.sql.Connection包下的Connection类
Connection connection = dataSource.getConnection();
System.out.println(connection);
//如果输出对象为 [email protected] 的说明连接成功
//还要注意要抛出异常 导入import java.sql.SQLException;
- 操作数据库
使用SQL语句,利用JDBC来操作数据库,本质还是用SQL来操作数据库
// 创建数据库
create table student(id int primary key, name varchar(20));
String sql = "insert into student values(1, '张三');";
通过PreparedStatement对象来告诉SQL所执行的语句,这个对象的SQL是来自于这个字符串.
PreparedStatement statement = connection.prepareStatement(sql);
还可以通过下面这种方式来填写:
Scanner in = new Scanner(System.in);
System.out.println("请输入学号:");
int id = in.nextInt();
System.out.println("请输入姓名:");
String name = in.next();
String sql = "insert into student values(?, ?);";//? 为占位符
PreparedStatement statement = connection.prepareStatement(sql);
statement.setInt(1, id); // 默认从1开始
statement.setString(2, name);
- 执行SQL语句
int n = statement.executeUpdate();
System.out.println(n);
这里insert,update,delete是通过 executeUpdate 来执行, 返回值为整数, 代表这个操作影响到几行,select 是通过 executeQuery 来执行.
- 断开连接
statement.close();
connection.close();
注: 后创建的先释放
4.2 操作
4.2.1 修改记录
public static void main(String[] args) throws SQLException {
//1. 找到数据源
DataSource dataSource = new MysqlDataSource();
((MysqlDataSource)dataSource).setUrl("jdbc:mysql://127.0.0.1:3306/java_learn?characterEncoding=utf8&useSSL=false");
((MysqlDataSource)dataSource).setUser("root");
((MysqlDataSource)dataSource).setPassword("123456");
//2. 建立连接
Connection connection = dataSource.getConnection();
//3. 输入修改信息
Scanner in = new Scanner(System.in);
System.out.println("请输入修改同学学号:");
int id = in.nextInt();
System.out.println("该同学修改后姓名:");
String name = in.next();
//3. 构建SQL语句
String sql = "update student set name = ? where id = ?";
PreparedStatement statement = connection.prepareStatement(sql);
statement.setInt(1,id);
statement.setString(2, name);
//4. 执行SQL
int n = statement.executeUpdate();
System.out.println(n);
//5. 关闭资源
statement.close();
connection.close();
}
4.2.2 删除记录
public static void main(String[] args) throws SQLException {
//1. 找到数据源
DataSource dataSource = new MysqlDataSource();
((MysqlDataSource)dataSource).setUrl("jdbc:mysql://127.0.0.1:3306/java_learn?characterEncoding=utf8&useSSL=false");
((MysqlDataSource)dataSource).setUser("root");
((MysqlDataSource)dataSource).setPassword("123456");
//2. 创建连接
Connection connection = dataSource.getConnection();
//3. 输入对删除记录信息
Scanner in = new Scanner(System.in);
System.out.println("请输入删除学生学号:");
int id = in.nextInt();
//4. 构建SQL
String sql = "delete from student where id = ?";
PreparedStatement statement = connection.prepareStatement(sql);
statement.setInt(1, id);
//5. 执行SQL
int n = statement.executeUpdate();
System.out.println(n);
//6. 关闭资源
statement.close();
connection.close();
}
4.2.3 查找记录
public static void main(String[] args) throws SQLException {
//1. 创建数据源
DataSource dataSource = new MysqlDataSource();
((MysqlDataSource)dataSource).setUrl("jdbc:mysql://127.0.0.1:3306/java_learn?characterEncoding=utf8&useSSL=false");
((MysqlDataSource)dataSource).setUser("root");
((MysqlDataSource)dataSource).setPassword("123456");
//2. 和数据库建立连接
Connection connection = dataSource.getConnection();
//3. 不需要输入
//4. 构建SQL
String sql = "select * from student";
PreparedStatement statement = connection.prepareStatement(sql);
//5. 执行SQL
//executeQuery的返回值是ResultSet对象, 可以把它当作一个 临时表
ResultSet resultSet = statement.executeQuery();
//6. 遍历结果集
//把 resultSet 当作迭代器
while (resultSet.next()) {
// 通过getXXX 方法, 来获取
// 取id, id类型为int, 使用getInt
int id = resultSet.getInt("id");
//取name, 类型为String 使用getString
String name = resultSet.getString("name");
System.out.println(id + ":" + name);
}
//7. 关闭资源
statement.close();
connection.close();
}
4.2.4 插入记录
public static void main(String[] args) throws SQLException {
//1. 获取数据库位置
DataSource dataSource = new MysqlDataSource();
((MysqlDataSource)dataSource).setUrl("jdbc:mysql://127.0.0.1:3306/java_learn?characterEncoding=utf8&useSSL=false");
((MysqlDataSource)dataSource).setUser("root");
((MysqlDataSource)dataSource).setPassword("123456");
//2. 连接数据库
Connection connection = dataSource.getConnection();
System.out.println(connection);
//3. 使用SQL语句,利用JDBC来操作数据库,本质还是通过SQL来操作
/*String sql = "insert into student values(3, '张三');";*/
Scanner in = new Scanner(System.in);
System.out.println("请输入学号:");
int id = in.nextInt();
System.out.println("请输入姓名:");
String name = in.next();
String sql = "insert into student values(?, ?);";
PreparedStatement statement = connection.prepareStatement(sql);
statement.setInt(1, id);
statement.setString(2, name);
//4. 执行SQL语句
// insert,update,delete是通过 executeUpdate 来执行
// select 是通过 executeQuery 来执行
// 返回值为整数, 代表这个操作影响到几行
int n = statement.executeUpdate();
System.out.println(n);
//5. 断开连接
statement.close();
connection.close();
}
4.3 数据库的连接
Connection接口实现类由数据库提供,获取Connection对象通常有两种方式 :
- 通过DriverManager(驱动管理类)的静态方法获取
// 加载JDBC驱动程序
Class.forName("com.mysql.jdbc.Driver");
// 创建数据库连接
Connection connection = DriverManager.getConnection(url);
- 通过DataSource(数据源)对象获取。实际应用中会使用DataSource对象
DataSource dataSource = new MysqlDataSource();
((MysqlDataSource)dataSource).setUrl("url");
((MysqlDataSource)dataSource).setUser("root");
((MysqlDataSource)dataSource).setPassword("123456");
Connection connection = dataSource.getConnection();
差别:
- DriverManager类来获取的Connection连接,是无法重复利用的,每次使用完以后释放资源时,通过connection.close()都是关闭物理连接。
- DataSource提供连接池的支持。连接池在初始化时将创建一定数量的数据库连接,这些连接是可以复用的,每次使用完数据库连接,释放资源调用connection.close()都是将Conncetion连接对象回收。
4.4 Statement对象
Statement对象主要是将SQL语句发送到数据库中。JDBC API中主要提供了三种Statement对象

实际开发中最常用的是PreparedStatement对象,以下对其的总结 :

返回值:
- executeQuery() 方法执行后返回单个结果集的,通常用于select语句
- executeUpdate()方法返回值是一个整数,指示受影响的行数,通常用于update、insert、delete语句
4.5 ResultSet对象
ResultSet对象它被称为结果集,它代表符合SQL语句条件的所有行,并且它通过一套getXXX方法提供
了对这些行中数据的访问 .
=“C:\Users\a\AppData\Roaming\Typora\typora-user-images\image-20220717203426690.png” alt=“image-20220717203426690” style=“zoom:50%;” />
返回值:
- executeQuery() 方法执行后返回单个结果集的,通常用于select语句
- executeUpdate()方法返回值是一个整数,指示受影响的行数,通常用于update、insert、delete语句
4.5 ResultSet对象
ResultSet对象它被称为结果集,它代表符合SQL语句条件的所有行,并且它通过一套getXXX方法提供
了对这些行中数据的访问 .
ResultSet里的数据一行一行排列,每行有多个字段,并且有一个记录指针,指针所指的数据行叫做当前数据行,我们只能来操作当前的数据行。我们如果想要取得某一条记录,就要使用ResultSet的next()方法 ,如果我们想要得到ResultSet里的所有记录,就应该使用while循环
边栏推荐
- Leetcode high frequency question 53. maximum subarray sum, continuous subarray with maximum sum, return its maximum sum
- Cluster chat server: creation of project directory
- Detailed explanation of cesium events (mouse events, camera events, keyboard events, scene trigger events)
- Comparison of open source distributed link tracking
- 开源分布式链路追踪对比
- 二分函数细节
- 【HiFlow】腾讯云新一代自动化助手,我用它完成了企业疫情提示(无代码)
- & 9 nodemon automatic restart tool
- Uncertainty of distributed energy - wind speed test (realized by matlab code)
- YOLO7 口罩识别实战
猜你喜欢

Taoying collects goods in batches. How to save the babies that have not been uploaded and then import them later

experimental design

Openlayers instance accessible map accessible map

prime_ series_ level-1

Introduction to database system fifth edition after class exercises - Chapter 1 Introduction

query中的customer exit客户出口变量

Kuberntes cloud native combat VI uses rook to build CEPH cluster

Practice data Lake iceberg lesson 37 kakfa write the enfour, not enfour test of iceberg's icberg table

DBSCAN点云聚类

大学数据库创建与查询实战——数据库表设计
随机推荐
Sudoku written for once and for all
What are the product life cycle, common project functions, and information flow
大淘营批量采集商品,如何将未上传的宝贝保存下来等后面再导入采集上传
Basic principle of synchronized lock
05_ UE4 advanced_ Material UV scaling
U++学习笔记 基础人物轴绑定及映射绑定
U++学习笔记 TSubclassOf()
Redis常用命令对应到Redisson对象操作
Cookies and sessions
如何徹底强制殺死後臺無關進程?
SQL注入攻击
[create birthday card application]
初探POC编写
Pulsar open source message queue_ Understand pulsar --- pulsar work notes 001
面试快速复习(三):概率论与数理统计
Real time monitoring of MySQL database changes_ Synchronize data_ Learn about canal_--- Canal work notes 001
机器学习习题——对率回归
Taobao assistant is disabled. What is the reason for using the big Taoying import data package to upload the baby prompt "the main image is required and cannot be empty"? How to solve it?
JS - event proxy and application scenarios
How does MySQL prepare SQL (solve the problem that in query SQL preprocessing can only query one record)