JDBC
基本概念:
什么是JDBC?
JDBC是Java DataBase Connectivity的缩写,它是Java程序访问数据库的标准接口。
使用Java程序访问数据库时,Java代码并不是直接通过TCP连接去访问数据库,而是通过JDBC接口来访问,而JDBC接口则通过JDBC驱动来实现真正对数据库的访问。
为什么要有JDBC?
统一标准!!!
我们在Java代码中如果要访问MySQL,那么必须编写代码操作JDBC接口。
注意到JDBC接口是Java标准库自带的,所以可以直接编译,而具体的JDBC驱动是由数据库厂商提供的,例如,MySQL的JDBC驱动由Oracle提供。
因此,访问某个具体的数据库,我们只需要引入该厂商提供的JDBC驱动,就可以通过JDBC接口来访问,这样保证了Java程序编写的是一套数据库访问代码,却可以访问各种不同的数据库,因为他们都提供了标准的JDBC驱动:
┌ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ┐
│ ┌───────────────┐ │
│ Java App │
│ └───────────────┘ │
│
│ ▼ │
┌───────────────┐
│ │JDBC Interface │<─┼─── JDK
└───────────────┘
│ │ │
▼
│ ┌───────────────┐ │
│ JDBC Driver │<───── Vendor
│ └───────────────┘ │
│
└ ─ ─ ─ ─ ─│─ ─ ─ ─ ─ ┘
▼
┌───────────────┐
│ Database │
└───────────────┘
数据库连接,java语言操作数据库定义了操作所有关系型数据库的规则(接口)
从代码来看,Java标准库自带的JDBC接口其实就是定义了一组接口,而某个具体的JDBC驱动其实就是实现了这些接口的类:
┌ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ┐
│ ┌───────────────┐ │
│ Java App │
│ └───────────────┘ │
│
│ ▼ │
┌───────────────┐
│ │JDBC Interface │<─┼─── JDK
└───────────────┘
│ │ │
▼
│ ┌───────────────┐ │
│ MySQL Driver │<───── Oracle
│ └───────────────┘ │
│
└ ─ ─ ─ ─ ─│─ ─ ─ ─ ─ ┘
▼
┌───────────────┐
使用JDBC的好处是:
各数据库厂商使用相同的接口,Java代码不需要针对不同数据库分别开发;
Java程序编译期仅依赖java.sql包,不依赖具体数据库的jar包;
可随时替换底层数据库,访问数据库的Java代码基本不变。
功能:
JDBC连接
Connection代表一个JDBC连接,它相当于Java程序到数据库的连接(通常是TCP连接)。
打开一个Connection时,需要准备URL、用户名和口令,才能成功连接到数据库。
URL是由数据库厂商指定的格式,例如,MySQL的URL是:
jdbc:mysql://<hostname>:<port>/<db>?key1=value1&key2=value2
假设数据库运行在本机localhost,端口使用标准的3306,数据库名称是learnjdbc,那么URL如下:
jdbc:mysql://localhost:3306/learnjdbc?useSSL=false&characterEncoding=utf8
JDBC事物
数据库事务(Transaction)具有ACID特性:
Atomicity:原子性
Consistency:一致性
Isolation:隔离性
Durability:持久性
JDBC提供了事务的支持,使用Connection可以开启、提交或回滚事务。
要在JDBC中执行事务,本质上就是如何把多条SQL包裹在一个数据库事务中执行。我们来看JDBC的事务代码:
Connection conn = openConnection();
try {
// 关闭自动提交:
conn.setAutoCommit(false);
// 执行多条SQL语句:
insert(); update(); delete();
// 提交事务:
conn.commit();
} catch (SQLException e) {
// 回滚事务:
conn.rollback();
} finally {
conn.setAutoCommit(true);
conn.close();
}
连接池
数据库连接池是一种复用Connection的组件,它可以避免反复创建新连接,提高JDBC代码的运行效率;
可以配置连接池的详细参数并监控连接池。
JDBC连接池有一个标准的接口javax.sql.DataSource,注意这个类位于Java标准库中,但仅仅是接口。要使用JDBC连接池,我们必须选择一个JDBC连接池的实现。常用的JDBC连接池有:
HikariCP
C3P0
BoneCP
Druid
目前使用最广泛的是HikariCP。
//初始化连接池
HikariConfig config = new HikariConfig();
MySQLConfig usr = null;
try {
InputStreamReader is = new InputStreamReader(new FileInputStream("src/database/config.json"));
char[] buf = new char[1024 * 1024];
int len;
try {
len = is.read(buf);
//将json配置文件数据 转换成 String
String json = new String(buf, 0, len);
//实例化
usr = JSON.parseObject(json, MySQLConfig.class);
} catch (IOException e) {
Log.debug("读取数据库配置文件失败...");
System.exit(1);
}
} catch (FileNotFoundException e) {
Log.debug("数据库配置文件config.json丢失");
System.exit(1);
}
config.setJdbcUrl(usr.getUrl());
config.setUsername(usr.getName());
config.setPassword(usr.getPsw());
config.addDataSourceProperty("connectionTimeout", "1000");//连接超时:1秒
config.addDataSourceProperty("idleTimeout", "60000");//空闲超时:60秒
config.addDataSourceProperty("maximumPoolSize", "200");//最大连接数:200
pool = new HikariDataSource(config);
Log.info("MySQL连接池启动成功");