JDBC( Java Database Connectivity)是一种用于执行SQL语句的Java API,能够为多种关系型数据库提供访问接口。
JDBC库通常包括与数据库相关的以下几个功能:
- 连接数据库
- 创建sql语句
- 在数据库中执行sql语句
- 查看和修改生成的记录
1.JDBC的体系结构
通常JDBC体系结构由两层组成。
- JDBC API:提供Java应用程序到JDBC管理器的连接
- JDBC驱动程序 API:支持JDBC管理器到驱动程序的连接
JDBC管理器使用相应数据库的驱动程序来实现与数据库的连接。
2.JDBC核心组件
-
DriverManager: 此类管理数据库驱动程序列表。使用通信子协议将来自java应用程序的连接请求与适当的数据库驱动程序匹配。
-
Driver:此接口处理与数据库服务器的通信,我们很少会直接与Driver对象进行交互。而是使用DriverManager对象来管理这种类型的对象。
-
Connection:该界面具有用于联系数据库的所有方法。连接对象表示通信上下文,即,与数据库的所有通信仅通过连接对象。
-
Statement:使用从此接口创建的对象将SQL语句提交到数据库。除了执行存储过程之外,一些派生接口还接受参数。
-
ResultSet:在使用Statement对象执行SQL查询后,这些对象保存从数据库检索的数据。它作为一个迭代器,允许我们移动其数据。
-
SQLException:此类处理数据库应用程序中发生的任何错误
3.使用步骤
- 导入包:需要包含包含数据库编程所需的JDBC类的包。大多数情况下,使用import java.sql.*就足够了。
- 注册JDBC驱动程序:要求您初始化驱动程序,以便您可以打开与数据库的通信通道。
- 打开连接:需要使用DriverManager.getConnection()方法创建一个Connection对象,该对象表示与数据库的物理连接。
- 执行查询:需要使用类型为Statement的对象来构建和提交SQL语句到数据库。
- 从结果集中提取数据:需要使用相应的ResultSet.getXXX()方法从结果集中检索数据。
- 释放资源:需要明确地关闭所有数据库资源,而不依赖于JVM的垃圾收集。
4.JDBC连接步骤
JDBC连接对应上文使用步骤中前三步。
- 导入JDBC包:将Java语言的*import*语句添加到Java代码中导入所需的类。
- 注册JDBC驱动程序:此步骤将使JVM将所需的驱动程序实现加载到内存中,以便它可以满足您的JDBC请求。
- 数据库URL配置:这是为了创建一个格式正确的地址,指向要连接到的数据库。
- 创建连接对象:最后,调用DriverManager对象的getConnection()方法来建立实际的数据库连接。
4.1 注册JDBC驱动程序
不同数据库应的数据库驱动程序名称见下表。
注册驱动程序常用的方法是使用Java的Class.forName()方法,将驱动程序的类文件加载到内存中并将其自动注册。
try {
Class.forName("com.mysql.cj.jdbc.Driver");
}catch(ClassNotFoundException ex) {
System.out.println("Error: unable to load driver class!");
System.exit(1);
}
第二种方法是使用静态DriverManager.registerDriver()方法。
try {
Driver myDriver = new com.mysql.cj.jdbc.Driver();
DriverManager.registerDriver(myDriver);
}catch(ClassNotFoundException ex) {
System.out.println("Error: unable to load driver class!");
System.exit(1);
}
RDBMS
|
JDBC
驱动程序名称
|
网址格式
|
MySQL
|
com.mysql.cj.jdbc.Driver
|
jdbc:mysql://hostname:3306/databaseName
|
MYSQL8
|
com.mysql.jdbc.Driver
| jdbc:mysql://hostname:3306/databaseName?serverTimezone=UTC |
ORACLE
|
oracle.jdbc.driver.OracleDriver
|
jdbc:oracle:thin:@hostname:port Number
:
databaseName
|
DB2
|
COM.ibm.db2.jdbc.net.DB2Driver
|
jdbc:db2:hostname:port Number / databaseName
|
SYBASE
|
com.sybase.jdbc.SybDriver
|
jdbc:sybase:Tds:hostname:port Number / databaseName
|
4.2 数据库URL配置及创建连接对象
//getConnection的三种重载方法
getConnection(String url)
getConnection(String url,Properties prop)
getConnection(String url,String user,String password)
创建数据库连接对象
String URL = "jdbc:mysql://localhost:3306/student?serverTimezone=UTC";
String USER = "username";
String PASS = "password";
Connection conn = DriverManager.getConnection(URL, USER, PASS);
String URL = "jdbc:mysql://localhost:3306/student?serverTimezone=UTC";
Properties info = new Properties();
info.put("user", "username");
info.put("password", "password");
Connection conn = DriverManager.getConnection(URL, info);
4.3 JDBC执行SQL语句
Statement statement = null;
statement = connection.createStatement();
statement = connection.createStatement();
int result = statement.executeUpdate("insert into grade values(5,'第五阶段')");//执行增删改操作时使用executeUpdate
ResultSet resultSet = statement.executeQuery("select * from grade");//执行查询语句时使用executeQuery
利用Statement的executeQuery方法得到一个ResultSet对象后,就可以对该对象进行内容查询。
//4.取出结果集信息
System.out.println(result);
while(resultSet.next()){
System.out.println("id:"+resultSet.getInt("gradeid")+",name="+resultSet.getString("gname"));
}
5.释放资源
resultSet.close();
statement.close();
connection.close();
全部代码示例:
import java.sql.*;
public class demo1 {
public static void main(String[] args) {
Connection connection = null;
Statement statement = null;
ResultSet resultSet = null;
//1.加载驱动程序
try {
Class.forName("com.mysql.cj.jdbc.Driver");
//2.创建数据库连接
String username = "root";
String password = "123456";
String url = "jdbc:mysql://localhost:3306/student?serverTimezone=UTC";
connection = DriverManager.getConnection(url,username,password);
//3.定义sql,创建状态通道(sql语句的发送)
statement = connection.createStatement();
int result = statement.executeUpdate("insert into grade values(5,'第五阶段')");//执行增删改操作时使用executeUpdate
resultSet = statement.executeQuery("select * from grade");//执行查询语句时使用executeQuery
//4.取出结果集信息
System.out.println(result);
while(resultSet.next()){
System.out.println("id:"+resultSet.getInt("gradeid")+",name="+resultSet.getString("gname"));
}
} catch (ClassNotFoundException e) {
e.printStackTrace();
} catch (SQLException throwables) {
throwables.printStackTrace();
} finally {
try {
if (resultSet != null) {
resultSet.close();
}
if (statement != null) {
statement.close();
}
if (connection != null) {
connection.close();
}
} catch (SQLException throwables) {
throwables.printStackTrace();
}
}
}
}