JDBC
JDBC 是 Java Database Connectivity 的缩写,是允许Java 程序访问并操作关系型数据库数据的一套 应用程序接口。本身就是一种规范,它提供的接口有一套完整的,可移植的访问底层数据库的程序。
JDBC 的架构
JDBC API支持两层和三层处理模型进行数据库访问,但在一般的JDBC体系结构由两层组成:
-
JDBC API: 提供了应用程序对JDBC的管理连接。
-
JDBC Driver API: 支持JDBC管理到驱动器连接。
JDBC API的使用驱动程序管理器和数据库特定的驱动程序提供透明的连接到异构数据库。JDBC驱动程序管理器可确保正确的驱动程序来访问每个数据源。
JDBC常用类和接口
类或接口 | 说明 |
---|---|
DriverManager | 这个类管理数据库驱动程序的列表。确定内容是否符合从Java应用程序使用的通信子协议正确的数据库驱动程序的连接请求。识别JDBC在一定子协议的第一个驱动器将被用来建立数据库连接 |
Driver | 此接口处理与数据库服务器通信。很少直接使用驱动程序(Driver)对象,一般使用DriverManager 中的对象,它用于管理此类型的对象。它也抽象与驱动程序对象工作相关的详细信息 |
Connection | 此接口与接触数据库的所有方法。连接对象表示通信上下文,即与数据库中的所有的通信是通过此唯一的连接对象 |
Statement / PreparedStatement | 创建的对象的SQL语句提交到数据库。一些派生的接口接受除执行存储过程的参数 |
ResultSet | 这些对象保存从数据库后,执行使用Statement 对象的SQL查询中检索数据。它作为一个迭代器,可以通过移动它来检索下一个数据 |
SQLException | 用于处理发生在数据库应用程序中的任何错误 |
常用的JDBC驱动程序名和连接URL
URL的写法为:
jdbc:数据库名称(如mysql)😕/数据库地址:3306/databaseName?参数名:参数值
常用数据库实例:
数据库 | 驱动名称 | URL格式 |
---|---|---|
MySQL 5.x | com.mysql.jdbc.Driver | jdbc:mysql://hostname/databaseName |
Oracle | oracle.jdbc.driver.OracleDriver | jdbc:oracle:thin:@hostname:portNumber:databaseName |
PostgreSQL | org.postgresql.Driver | jdbc:postgresql://hostname:port/dbname |
注意,mysql版本8以上的驱动名为:com.mysql.cj.jdbc.Driver
Connection
Jdbc程序中的Connection,它用于代表数据库的链接,Collection是数据库编程中最重要的一个对象,客户端与数据库所有交互都是通过connection对象完成的,创建方法为:
Connection conn = DriverManager.getConnection(url,username,password);
这个对象的常用方法:
方法 | 描述 |
---|---|
createStatement() | 创建向数据库发送sql的statement对象。 |
prepareStatement(sql) | 创建向数据库发送预编译sql的PrepareSatement对象。 |
prepareCall(sql) | 创建执行存储过程的callableStatement对象。 |
setAutoCommit(boolean autoCommit) | 设置事务是否自动提交。 |
commit() | 在链接上提交事务。 |
rollback() | 在此链接上回滚事务。 |
示例: |
public class DBUtil {
private final static String DRIVERCLASS = "com.mysql.cj.jdbc.Driver";
private final String userName = "root";
private final String passwd = "152887";
private final String url = "jdbc:mysql://127.0.0.1:3306/rbas?serverTimeZone=Asia/ShangHai";
/**
* 加载驱动
*/
static {
try {
Class.forName(DRIVERCLASS);
} catch (ClassNotFoundException e) {
throw new RuntimeException(e);
}
}
public DBUtil() {}
/**
* 创建数据库连接
* @return connection 链接
*/
Connection connection = null;
try {
connection = DriverManager.getConnection(url,userName,passwd);
} catch (SQLException e) {
throw new RuntimeException(e);
}
}
Statement 和 PreperedStatement
Statement
Jdbc程序中的Statement对象用于向数据库发送SQL语句,创建方法为:
Statement st = conn.createStatement();
Statement对象常用方法:
方法 | 含义 |
---|---|
executeQuery(String sql) | 用于向数据发送查询语句。 |
executeUpdate(String sql) | 用于向数据库发送insert、update或delete语句 |
execute(String sql) | 用于向数据库发送任意sql语句 |
addBatch(String sql) | 把多条sql语句放到一个批处理中。 |
executeBatch() | 向数据库发送一批sql语句执行。 |
示例:
Statement st = null;
//获取用于向数据库发送sql语句的statement
st = conn.createStatement();
//向数据库发sql
String sql = "select id,name,password,email,birthday from users";
st.executeQuery(sql);
PreperedStatement
PreperedStatement是Statement的子接口,它的实例对象可以通过调用:
PreperedStatement st = conn.preparedStatement();
实例:
PreparedStatement preparedStatement = null;
String sql = "select * from users where name=? and password=?";
// 获取用于向数据库发送sql语句的Preperedstatement
preparedStatement = conn.preparedStatement(sql);//在此次传入,进行预编译
preparedStatement.setString(1, username);
preparedStatement.setString(2, password);
// 向数据库发sql
preparedStatement.executeQuery();//在这里不需要传入sql
ResultSet
ResultSet用于代表 SQL 语句的执行结果。Resultset 封装执行结果时,采用的类似于表格的方式,ResultSet 对象维护了一个指向表格数据行的游标,初始的时候,游标在第一行之前,调用 ResultSet.next() 方法,可以使游标指向具体的数据行,进行调用方法获取该行的数据。
获取行相关方法
ResultSet提供了对结果集进行滚动的方法:
- next():移动到下一行
- Previous():移动到前一行
- absolute(int row):移动到指定行
- beforeFirst():移动resultSet的最前面。
- afterLast() :移动到resultSet的最后面。
获取值相关方法
ResultSet既然用于封装执行结果的,所以该对象提供的都是用于获取数据的get方法:
-
获取任意类型的数据
- getObject(int index)
- getObject(string columnName)
-
获取指定类型的数据
- getString(int index)
- getString(String columnName)
常用数据类型转换对比表
SQL类型 | Jdbc对应方法 | 返回类型 |
---|---|---|
bit(1),bit(n) | getBoolean,getBytes() | Boolean,byte[] |
tinyint | getByte() | Byte |
smallint | getShort() | Short |
int | getInt | Int |
bigint | getLong() | Long |
char,varchar,longvarchar | getString | String |
text(clob) blob | getClob(),getblob() | Clob,blob |
date | getDate() | java.sql.Date |
time | getTime() | java.sql.Time |
timestamp | getTimestamp | java.sql.Timestamp |
释放资源
Jdbc程序运行完后,切记要释放程序在运行过程中,创建的那些与数据库进行交互的对象,这些对象通常是ResultSet, Statement和Connection对象。
注意:为确保资源释放代码能运行,资源释放代码也一定要放在finally语句中。
示例:
public void close(Connection connection , PreparedStatement preparedStatement , ResultSet resultSet){
try {
if (resultSet == null) {
resultSet.close();
}
if (preparedStatement == null) {
preparedStatement.close();
}
if (connection == null) {
connection.close();
}
} catch (SQLException e) {
throw new RuntimeException(e);
}
}
//使用 懒 就不写在方法中了
try {
preparedStatement = connection.prepareStatement(sql);
//填充占位符(sql语句的参数)
int len = args.size();
for (int i = 0; i < len; i++) {
preparedStatement.setObject(i+1,args.get(i));
}
//执行SQL语句并返回影响的数据量
count = preparedStatement.executeUpdate();
} catch (SQLException e) {
throw new RuntimeException(e);
}finally {
close(connection ,preparedStatement ,null);
}
使用时需下载jdbc.jar包,完整程序示例(多表联合查询,SQL语句请自行复习)包括jar包放在资源文件中。