JDBC全称Java DataBase Connectivity。我们主要使用的是JDBC API。
JDBC API是一个Java API可以访问任何类型的数据库的数据,尤其是存储在关系数据库中的数据。
JDBC的工作原理与Java在各种平台一样,如Windows,Mac OS和各种版本的UNIX系统。从根本上说,JDBC是一种规范,它提供的接口,一套完整的,可移植的访问底层数据库的程序。
JDBC代表java与数据库的连接,是Java编程语言和广泛的数据库之间独立与数据库的标准javaAPI。
JDBC库中所包含的API通常与数据库使用于:
- 连接到数据库
- 创建SQL或MySQL语句
- 在数据库中执行SQL或MySQL查询
- 查看和修改数据库中的数据记录
JDBC架构
JDBC API:提供了应用程序对JDBC的连接管理。
JDBC Driver:提供了与数据库驱动的连接。
JDBC API 通过驱动程序管理器来同通过不同的数据库驱动管理不同的数据库。
JDBC驱动管理器(JDBC Driver Manager)可以确保正确的驱动程序来访问每个数据源,且可以支持连接到多个异构数据库的多个并发的驱动程序
异构数据库:异构数据库系统是相关的多个数据库系统的集合,可以实现数据的共享和透明访问,几个数据库系统在加入异构数据库系统之前本身就已经存在,拥有自己的数据阵管理系统、外构数据库的各个组成部分具有自身的自治性,实现数据共享的同时,每个数据库系统仍有自己的应用特性、完整性控制和安全性控制。
使用JDBC的前提条件是:
- JDK安装
- 安装数据库以及对应的数据库驱动程序
常用类和接口
- DriverManager:
管理数据库驱动程序的列表(DriverManager管理Driver对象)。确定内容是否符合从Java应用程序使用的通信子协议正确的数据库驱动程序的连接请求。识别JDBC在一定子协议的第一个驱动器将被用来建立数据库连接。
- Driver:
此接口处理与数据库服务器的通信。很少直接直接使用Driver对象,一般使用DriverManager返回的Driver对象。
- Connection :
此接口用与接触数据库的所有方法。连接对象通信的上下文,即,与数据库中的所有的通信是通过此唯一的连接对象。
- Statement :
使用这个接口创建对象的SQL语句并提交到数据库。
- ResultSet:
保存使用Statement对象传递的SQL语句查询到的结果。它是一个迭代器,可以像使用Iterator对象一样使用ResultSet。
- SQLException:
这个类用于处理发生在数据库操作过程中的异常。
创建JDBC应用程序
创建一个JDBC应用程序,有以下五个步骤。
1. 加载数据库驱动程序
以MySQL为例,我们先要在MySQL的官网(Oracle官网)下载驱动程序,然后将驱动程序添加到CLASSPATH中,添加方法如下:
然后将驱动包在程序中实例化即可。
// 加载驱动
Class.forName("com.mysql.jdbc.Driver");
2. 创建与数据库的连接
在使用数据库之前要先和数据库进行连接。我们使用DriverManager类提供的方法来获取数据库的Connection对象。
// 获取Connection对象通常有两种方式:一种是通过DriverManager的静态方法获取,一种是通过DataSource(数据源)对象获取,这里演示前者
String url = "jdbc:mysql://localhost:3306/scott?user=root&password=xucc&useSSL=true";
connection = DriverManager.getConnection(url);
getConnection的参数是一个url协议,DriverManager通过它与指定数据库进行连接,的格式如下
mysql://主机名:端口号/数据库名?user=用户名&password=密码”
3. 执行一个查询
执行SQL语句需要借助Statement或PreparedStatement的对象,并将要执行的一个SQL语句作为参数传入数据库执行。这里以查询语句为例。
// 1. 创建SQL语句
String sqlCommand = "select * from emp";
// 2. 使用statement对象将SQL语句发送到数据库中
Statement statement = connection.createStatement();
statement.executeQuery(sqlCommand);
传入查询语句我们使用Statement的executeQuery()方法,如果执行的是update,insert,delete等修改语句,就要使用executeUpdate方法。
4. 得到查询结果
使用executeQuery()方法执行数据库查询语句会返回一个查询结果,可以使用Result类的get()方法进行获取。使用如下:
// 查询结果
resultSet = statement.executeQuery(sqlCommand);
// 结果处理
while (resultSet.next()) {
// get方法接收字段名或字段的下标,下标从1开始
String ename = resultSet.getString("ename");
int empno = resultSet.getInt("empno");
double sal = resultSet.getInt("sal");
String job = resultSet.getString("job");
String str = String.format(
"ename = %s, empno = %d, sal = %f, job = %s",
ename, empno, sal, job
);
System.out.println(str);
}
5. 资源关闭
在使用JDBC操作完数据库后,应该明确地关闭所有的数据库资源以减少资源的浪费,一般来说,JDBC操作主要使用了Connection,Statement和ResultSet三个类,所以对它们的对象进行关闭。
// 资源关闭在finally块中进行
finally {
// 从里至外关闭
if(resultSet != null) {
try {
resultSet.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
if(statement != null) {
try {
statement.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
if(connection != null) {
try {
connection.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
一个完整的JDBC查询操作如下:
import java.sql.*;
public class Test {
public static void jdbcStep() {
// 数据库连接
Connection connection = null;
Statement statement = null;
ResultSet resultSet = null;
try {
// 加载驱动
Class.forName("com.mysql.jdbc.Driver");
// 连接数据库,这里我使用的是scott数据库
String url = "jdbc:mysql://localhost:3306/scott?user=root&password=root&useSSL=true";
connection = DriverManager.getConnection(url);
// 创建SQL命令
// 1. 创建语句
String sqlCommand = "select * from emp";
// 2. 使用statement对象将SQL语句发送到数据库中
statement = connection.createStatement();
// 查询结果
resultSet = statement.executeQuery(sqlCommand);
// 结果处理
while (resultSet.next()) {
// 接收字段名或列下标,从1开始
String ename = resultSet.getString("ename");
int empno = resultSet.getInt("empno");
double sal = resultSet.getInt("sal");
String job = resultSet.getString("job");
String str = String.format(
"ename = %s, empno = %d, sal = %f, job = %s",
ename, empno, sal, job
);
System.out.println(str);
}
} catch (Exception e) {
e.printStackTrace();
} finally {
// 从里至外关闭
if(resultSet != null) {
try {
resultSet.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
if(statement != null) {
try {
statement.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
if(connection != null) {
try {
connection.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
}
public static void main(String[] args) {
jdbcStep();
}
}