前段时间小冰在工作中遇到了一系列关于数据持久化的问题,在排查问题时发现自己对 Java 后端的数据持久化框架的原理都不太了解,只有不断试错,因此走了很多弯路。于是下定决心,集中精力学习了持久化相关框架的原理和实现,总结出这个系列。
上图是我根据相关源码和网上资料总结的有关 Java 数据持久化的架构图(只代表本人想法,如有问题,欢迎留言指出)。最下层就是今天要讲的 JDBC,上一层是数据库连接池层,包括 HikariCP 和 Druid等;再上一层是分库分表中间件,比如说 ShardingJDBC;再向上是对象关系映射层,也就是 ORM,包括 Mybatis 和 JPA;最上边是 Spring 的事务管理。
本系列的文章会依次讲解图中各个开源框架的基础使用,然后描述其原理和代码实现,最后会着重分析它们之间是如何相互集成和配合的。
废话不多说,我们先来看 JDBC。
JDBC 定义JDBC是Java Database Connectivity的简称,它定义了一套访问数据库的规范和接口。但它自身不参与数据库访问的实现。因此对于目前存在的数据库(譬如Mysql、Oracle)来说,要么数据库制造商本身提供这些规范与接口的实现,要么社区提供这些实现。
如上图所示,Java 程序只依赖于 JDBC API,通过 DriverManager 来获取驱动,并且针对不同的数据库可以使用不同的驱动。这是典型的桥接的设计模式,把抽象 Abstraction 与行为实现Implementation 分离开来,从而可以保持各部分的独立性以及应对他们的功能扩展。
JDBC 基础代码示例单纯使用 JDBC 的代码逻辑十分简单,我们就以最为常用的MySQL 为例,展示一下使用 JDBC 来建立数据库连接、执行查询语句和遍历结果的过程。
public static void connectionTest(){ Connection connection = null; Statement statement = null; ResultSet resultSet = null; try { // 1. 加载并注册 MySQL 的驱动 Class.forName("com.mysql.cj.jdbc.Driver").newInstance(); // 2. 根据特定的数据库连接URL,返回与此URL的所匹配的数据库驱动对象 Driver driver = DriverManager.getDriver(URL); // 3. 传入参数,比如说用户名和密码 Properties props = new Properties(); props.put("user", USER_NAME); props.put("password", PASSWORD); // 4. 使用数据库驱动创建数据库连接 Connection connection = driver.connect(URL, props); // 5. 从数据库连接 connection 中获得 Statement 对象 statement = connection.createStatement(); // 6. 执行 sql 语句,返回结果 resultSet = statement.executeQuery("select * from activity"); // 7. 处理结果,取出数据 while(resultSet.next()) { System.out.println(resultSet.getString(2)); } ..... }finally{ // 8.关闭链接,释放资源 按照JDBC的规范,使用完成后管理链接, // 释放资源,释放顺序应该是: ResultSet ->Statement ->Connection resultSet.close(); statement.close(); connection.close(); } }