Java通过 JDBC 连接数据库操作
- 1. 程序是怎么操作数据库的?
- 2. 什么是JDBC
- JDBC 工作原理
- 3. JDBC 使用
- 3.1 创建项目并添加 MySQL 驱动
- 3.2 使用代码操作数据库
- 3.2.1 获得数据源
- 3.2.2 获得连接
- 3.2.3 获得执行器
- 3.3.4 查询或操作数据库
- 3.3.5 关闭数据库连接
- 首先,我们想要操作一个数据库服务器,需要有一个数据库客户端,以 MySQL 数据库为引例,最直接的数据库客户端它自己驱动窗口的 ① 命令行工具。
- 一般我们还可以配置出一些 ② 带界面的GUI客户端。
- 那么如果通过 ③ 编程语言作为客户端 连接到远程的服务器这个想法,解决了什么问题呢?
1. 程序是怎么操作数据库的?
使⽤程序之所以能操作数据库,主要是因为数据库厂商提供了操作的 API,也就是数据库驱动,也可以理解为面向接口编程,驱使数据库⾏动起来,就是数据库驱动,不光是程序,像我们之所以能通过命令行操作 MySQL,也是因为 MySQL 的数据库驱动,对于操作界⾯来说,数据库驱动就是下面这样一个窗口:
输⼊的命令就是 MySQL 数据驱动的⼀部分。我们可以直接通过这个窗口对数据库进行操作,它内部配置着最合适的驱动。那么为什么还要提出编程语言作为客户端这样的操作方式呢?
2. 什么是JDBC
在了解 JDBC 概念之前,我们先来想⼏个问题:
- 不同数据库⼚商的数据库驱动⼀样吗?
- 不同数据库⼚商的 API 调⽤⼀样吗?
- 使⽤ Java 程序只操作 MySQL 吗?还是有可能操作 Oracle、Sql Server、DB2 等数据库?
以上的答案都是否定的,也就是说不同厂商提供了不同的数据库驱动,提供了不同的 API 接口,我们试想一个场景,一家公司在起初进行数据存储的时候,使用的是免费开源的MySQL作为数据库进行存储的,在后来的发展中,业务越来越庞大,此时想要更换一个数据库,换成用Oracle来继续存储,那么由于这两种数据库他们的驱动是不兼容的,不能够共用一套代码程序来操作,那么此时更换就十分的麻烦了。
而 JDBC 就是解决这个问题的,它为 Java 开发人员操作数据库提供了⼀个标准的 API,可以为多种关系数据库提供统一访问。
简单来说,使⽤了 JDBC 之后,不管是什么数据库与什么数据库驱动,我们只需要使用一套标准代码就可以实现对不同数据库进行统一操作(添加、修改、删除、查询),也就解决了我们上⾯说的那些问题了。
JDBC 工作原理
JDBC 为多种关系数据库提供了统一访问方式,作为特定厂商数据库访问 API 的⼀种⾼级抽象, 它主要包含⼀些通⽤的接⼝类。
JDBC 访问数据库层次结构:
架包:
JDBC 优势:
- Java 语⾔访问数据库操作完全⾯向抽象接口编程。
- 开发数据库应用不用限定在特定数据库⼚商的 API。
- 程序的可移植性大大增强。
3. JDBC 使用
3.1 创建项目并添加 MySQL 驱动
创建⼀个 Java 项⽬,并添加 MySQL 驱动(mysql-connector-java-5.1.47.jar),需要注意不同数据 库版本要对应相应的驱动包。
操作步骤:点击项⽬属性 -> Modules -> Dependencies -> 点击“+”号 -> 1.Jars or directories -> 选择驱动包 -> 点击 OK 确认。
然后就有啦
3.2 使用代码操作数据库
操作数据库 MySQL 提供了两种操作 API:
- DriverManager
- DataSource(推荐使⽤,OOP 编码的思想和代码模式)
接下来咱们使⽤ DataSource 来实现操作数据库。 使⽤代码操作数据库分为以下 5 个步骤:
- 获取数据源(准备工作,相当于使用mysql客户端并输入了密码)
- 获取连接(输入了正确的密码,并且进入到了MySQL操作的界面)
- 获取执⾏器(连接到服务器并切换到数据库)
- 组装SQL并调用执行的API(相当于在mysql客户端输入了aql命令,并执行了回车操作)
- 关闭资源(关闭mysql客户端)
3.2.1 获得数据源
数据源是 MysqlDataSource,获取⽅式如下,需要输⼊数据库连接的 MySQL 服务器地址、⽤户名和密 码:
// 1.创建数据源
MysqlDataSource dataSource = new MysqlDataSource();
// 1.1 设置连接的 MySQL 服务器
dataSource.setURL("jdbc:mysql://127.0.0.1:3306/java?characterEncoding=utf8&useSSL=false");
// 1.2 设置⽤户名
dataSource.setUser("root");
// 1.3 设置密码
dataSource.setPassword("root");
3.2.2 获得连接
连接对象是 Connection,注意此步骤操作容易出错,⼀定是 com.mysql.jdbc 包下的 Connection 对象:
// 2.得到连接 Connection
Connection connection = (Connection) dataSource.getConnection();
3.2.3 获得执行器
执⾏器是⽤来执⾏ SQL 命令的,执⾏器有三种:
- Statement
- PreparedStatement
- CallableStatement
实际开发中最常⽤的是 PreparedStatement 对象。
实现:
// 3.获得执⾏器
PreparedStatement statement = connection.prepareStatement("select * from student where username=?");
// 3.1 占位符赋值
statement.setString(1, "王五");
3.3.4 查询或操作数据库
查询数据库使⽤ PreparedStatement.executeQuery ⽅法,返回⼀个 ResultSet 对象,具体实现代码 如下:
// 4.获得结果集
ResultSet resultSet = statement.executeQuery();
// 4.1 获得结果并打印
while (resultSet.next()) {
String sn = resultSet.getString("sn");
String username = resultSet.getString("username");
String mail = resultSet.getString("mail");
System.out.println(String.format("SN:%s,UserName:%s,Mail:%s", sn,
username, mail));
}
ResultSet 对象它被称为结果集,它代表符合 SQL 语句条件的所有⾏,并且它通过⼀套 getXXX ⽅法提供了对这些行中数据的访问。
ResultSet ⾥的数据⼀⾏⼀⾏排列,每⾏有多个字段,并且有⼀个记录指针,指针所指的数据⾏ 叫做当前数据⾏,我们只能来操作当前的数据⾏。我们如果想要取得某⼀条记录,就要使⽤ ResultSet 的 next() ⽅法 ,如果我们想要得到 ResultSet ⾥的所有记录,就应该使⽤ while 循环。
3.3.5 关闭数据库连接
关闭数据库连接是为了不浪费 MySQL 服务器端的资源,最终实现代码:
import com.mysql.jdbc.Connection;
import com.mysql.jdbc.jdbc2.optional.MysqlDataSource;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
public class App {
public static void main(String[] args) throws SQLException,SQLException {
// 1.创建数据源
MysqlDataSource dataSource = new MysqlDataSource();
// 1.1 设置连接的 MySQL 服务器
dataSource.setURL("jdbc:mysql://127.0.0.1:3306/java characterEncoding=utf8&useSSL=false");
// 1.2 设置⽤户名
dataSource.setUser("root");
// 1.3 设置密码
dataSource.setPassword("root");
// 2.创建连接
Connection connection = (Connection) dataSource.getConnection();
// 3.获得执⾏器
PreparedStatement statement = connection.prepareStatement("select
* from student where username=?");
// 3.1 占位符赋值
statement.setString(1, "王五");
// 4.获得结果集
ResultSet resultSet = statement.executeQuery();
// 4.1 获得结果并打印
while (resultSet.next()) {
String sn = resultSet.getString("sn");
String username = resultSet.getString("username");
String mail = resultSet.getString("mail");
System.out.println(String.format("SN:%s,UserName:%s,Mail:
%s", sn, username, mail));
}
// 5. 关闭资源
resultSet.close();
connection.close();
}
}