JDBC------Java Database Connectivity

一.数据持久化

持久化(persistence): 把数据保存到可掉电式存储设备中以供之后使用. 大多数情况下, 特别是企业级应用, 数据持久化意味着将内存中的数据保存到硬盘上加以”固化”, 而持久化的实现过程大多通过各种关系数据库来完成.

持久化的主要应用是将内存中的数据存储在关系型数据库中, 当然也可以存储在磁盘文件、XML数据文件中.

二.Java中的数据存储技术

① JDBC直接访问数据库
② JDO技术(即Java Data Object)
③ 第三方O/R工具, 如: Hibernate, ibatis等

JDBC是Java访问数据库的基石, JDO、Hibernate等只是更好的封装了JDBC.

三.JDBC基础

JDBC(Java Database Connectivity)是一个独立于特定数据库管理系统、通用的SQL数据库存取和操作的公共接口(一组API), 定义了用来访问数据库的标准Java类库, 使用这个类库可以以一种标准的方法、方便地访问数据库资源.

JDBC为访问不同的数据库提供了一种统一的途径, 为开发者屏蔽了一些细节问题.

JDBC的目标是使Java程序员使用JDBC可以连接任何提供了JDBC驱动程序的数据库系统, 这样就使得程序员无需对特定的数据库系统的特点有过多的了解, 从而大大简化和加快了开发过程.

JDBC驱动程序由数据库厂商实现.

JDBC编程是一种面向接口的编程, 我们在程序中用的是java.sql下的Connection接口, 但是该接口在java包里并没有具体的实现, 其实现就是JDBC驱动程序.

JDBC_01

1.JDBC体系结构

JDBC接口(API)包括两个层次:

  • 面向应用的API: Java API, 抽象接口, 供应用程序开发人员使用(连接数据库, 执行SQL语句, 获得结果).

  • 面向数据库的API: Java Driver API, 供开发商开发数据库驱动程序用.

JDBC_02

2.JDBC驱动程序

JDBC驱动程序: 各个数据库厂商根据JDBC的规范制作的 JDBC 实现类的类库

JDBC分类:

  • 第一类: JDBC-ODBC桥.
  • 第二类: 部分本地API部分Java的驱动程序.
  • 第三类: JDBC网络纯Java驱动程序.
  • 第四类: 本地协议的纯 Java 驱动程序.
  • 第三、四两类都是纯Java的驱动程序, 因此, 对于Java开发者来说, 它们在性能、可移植性、功能等方面都有优势.

第一类: JDBC-ODBC桥

JDBC_03

第二类: 部分本地API部分Java的驱动程序.

JDBC_04

第三类: JDBC网络纯Java驱动程序. 一般在做JSP网站开发时用.

JDBC_05

第四类: 本地协议的纯 Java 驱动程序.

JDBC_06

我们之后主要将的是第四类: 本地协议的纯 Java 驱动程序. 其实, 第三类和第四类差不多.

四.JDBC API

JDBC API 是一系列的接口, 它使得应用程序能够进行数据库联接, 执行SQL语句, 并且得到返回结果.

JDBC_07

  通过Driver Manger我们能获取到代表数据库连接的Connection, 通过Connection我们能获取到用于执行SQL语句的 Statement , 通过Statement 我们能获取到代表查询结果的 Result.

五.Driver接口

  • Java.sql.Driver 接口是所有 JDBC 驱动程序需要实现的接口. 这个接口是提供给数据库厂商使用的, 不同数据库厂商提供不同的实现.
  • 在程序中不需要直接去访问实现了 Driver 接口的类, 而是由驱动程序管理器类(java.sql.DriverManager)去调用这些Driver实现
  • 但是我们是可以通过Driver接口来获取数据库连接的.
  • 注意: 数据库的连接是稀缺资源, 用完后必须要关闭连接.

1.将JDBC驱动引入项目

  • ①下载需要的 JDBC 驱动
  • ②在项目下新建一个 lib 目录.
  • ③将用到的 JDBC 驱动(jar文件, 例: mysql-connector-java-8.0.15.jar)放入该目录.
  • ④在 lib 目录下的 JDBC 驱动上, 右键单击, 依次选择 “构建路径”, “添加至构建路径”.
  • 之后, JDBC驱动就成功导入项目了, 在 “引用的库” 里面可以看到.

JDBC_08

2.Driver获取mysql的连接

注意: 测试时要开启MySQL服务

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
import java.sql.SQLException;
import java.sql.Connection;
import java.sql.Driver;

public class Test{
public static void main(String[] args) throws SQLException{
//以前的mysql JDBC驱动 Driver实现类为: com.mysql.jdbc.Driver
Driver driver = new com.mysql.cj.jdbc.Driver();
String url = "jdbc:mysql://127.0.0.1:3306/test?serverTimezone=UTC&useUnicode=true&characterEncoding=utf-8&useSSL=false";
Properties info = new Properties();
info.put("user", "root");
info.put("password", "root");
Connection conn = driver.connect(url, info);
System.out.println(conn);
conn.close();
}
}

3.Driver获取任何数据库的连接

编写一个通用的方法, 在不修改Java源码的情况下, 可以获取任何数据库的连接

解决方案: 将Driver接口实现类的全类名、要连接数据库的URL、数据库用户名user、用户名密码password放进一个配置文件里.

通过修改配置文件的方式实现和具体的数据库解耦.

在项目的src目录下, 新建一个 jdbc.properties 文件, 内容:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#SQL Server DB
driver=com.microsoft.sqlserver.jdbc.SQLServerDriver
jdbc=jdbc:sqlserver://127.0.0.1:1433;DatabaseName=SPJDB
user=root
password=root

#MySQL DB
#driver=com.mysql.jdbc.Driver
#driver=com.mysql.cj.jdbc.Driver
#jdbcUrl=jdbc:mysql://127.0.0.1:3306/test?serverTimezone=UTC&useUnicode=true&characterEncoding=utf-8&useSSL=false
#user=root
#password=root

#Oracle DB
#driver=oracle.jdbc.driver.OracleDriver
#jdbcUrl=jdbc:oracle:thin:@localhost:1521:orcl
#user=scott
#password=java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
import java.sql.SQLException;
import java.util.Properties;

import org.junit.Test;

import java.io.InputStream;
import java.sql.Connection;
import java.sql.Driver;

public class Test {
//注意: 这里用到了 junit 单元测试类
@Test
public void testConnection() throws Exception {
System.out.println(getConnection());
}
public Connection getConnection() throws Exception {
String driverClass = null;
String jdbcUrl = null;
String user = null;
String password = null;
//读取类路径下的 jdbc.properties 文件
InputStream in =
getClass().getClassLoader().getResourceAsStream("jdbc.properties");
Properties properties = new Properties();
properties.load(in);
driverClass = properties.getProperty("driver");
jdbcUrl = properties.getProperty("jdbc");
user = properties.getProperty("user");
password = properties.getProperty("password");
//利用反射, 实例化全类名对应的类 即 创建不同驱动的Driver对象
Driver driver =
(Driver) Class.forName(driverClass).newInstance();
Properties info = new Properties();
info.put("user", user);
info.put("password", password);
Connection connection = driver.connect(jdbcUrl, info);
return connection;
}
}

你只需关闭properties文件里某个数据库配置的注释, 注释其他的数据库配置. 就可以得到不同的数据库连接

4.关于连接字符串

对于 MySQL 的连接字符串,自 Connector 8.0 新版本之后,jdbcUrl 必须添加 serverTimezone 属性。

当然,一般这样设置就OK了:

1
jdbcUrl=jdbc:mysql://127.0.0.1:3306/test?serverTimezone=UTC&useUnicode=true&characterEncoding=utf-8&useSSL=false

更多新增内容,详见 MySQL 官网 doc


评论