JDBC简介
在说JDBC之前,必须先聊聊数据持久化。
持久化
把数据保存到可掉电式存储设备中以供之后使用。
大多数情况下,数据持久化意味着将内存中的数据保存到磁盘中加以“固化”。而持久化的实现过程大多通过各种关系数据库完成。当然,也可以存入磁盘文件或者XML数据文件(崔老师JavaWeb day14练习中,使用了XML充当“数据库”)。
图片来自尚硅谷JDBC
JDBC
数据库是实现持久化的一种途径,而JDBC则是通向数据库的桥梁。
通俗地讲,JDBC就是一组API(包括少量类),为访问不同数据库提供了统一的途径,为开发者屏蔽了一些细节问题。比如,我们都知道浏览器发送HTTP请求访问服务器,但其实请求底层仍是TCP协议。同样的,访问数据库底层也通过TCP协议。你知道怎么与数据库建立TCP连接吗?一部分科班读者可能对计算机网络非常熟悉,但是大部分像我这样的野生程序员可能压根没想过这个问题。所幸,这些具体的实现,各大数据库产商已经替我们做了。
驱动
JDBC是Java制定的接口,数据库产商依照该接口编写与自家数据库配套的实现类。比如MySQL、Oracle、SqlServer等都有自己的不同实现,这些实现类的集合既是我们笼统意义上的“驱动”。
面向接口编程
在代码中直接new具体的驱动类,会使程序高度耦合。比如,后期如果要切换数据库(虽然很少),就要临时调换驱动类,需要修改源码,不符合开闭原则。而面向接口编程,实际上就是一种“多态”。屏蔽具体的实现,只需调用接口方法,传入规定的参数即可得到预期的返回值。切换数据库驱动并不影响程序运行结果。
基本环境搭建
上面说过,JDBC只是一组接口,具体实现交给驱动。所以,要使用JDBC完成CRUD,必须先导入具体的数据库驱动。本次我们以MySQL为例,所以导入MySQL的数据库驱动。
pom.xml
<dependencies>
<!--MySQL数据库驱动-->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.46</version>
</dependency>
<!--Junit-->
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
<scope>compile</scope>
</dependency>
</dependencies>
代码结构
DriverDemo
public class DriverDemo {
@Test
public void testDriver() throws SQLException {
//1. 创建一个 Driver 实现类的对象
Driver driver = new com.mysql.jdbc.Driver();
//2. 准备连接数据库的基本信息: url, user, password
String url = "jdbc:mysql://192.168.136.128:3306/test";
Properties info = new Properties();
info.put("user", "root");
info.put("password", "root");
//3. 调用 Driver 接口的 connect(url, info) 获取数据库连接
Connection connection = driver.connect(url, info);
System.out.println(connection);
}
}
运行结果
使用JDBC有三个大步骤:
连接数据库
执行SQL语句
获得结果
我们上面的代码,仅完成了第一步。
Driver
上面testDriver()方法中的第一句:
//1. 创建一个 Driver 实现类的对象
Driverdriver=newcom.mysql.jdbc.Driver();
这是一个典型的面向接口编程。
我们先看左边的Driver接口:
接口的方法并不多,我们在上面用到了其中的connect()方法
接着我们再来看看右边MySQL的Driver实现类:
怎么回事?!
只有一个静态代码块和无参构造。不对啊,我们明明在程序中调用了driver.connect(),怎么连connect方法都没了?!
仔细一看,原来MySQL的Driver类还继承了NonRegisteringDriver,它实现了Driver接口的全部方法:
connect()的核心代码就一句:
ConnectionnewConn=com.mysql.jdbc.ConnectionImpl.getInstance(host(props),port(props),props,database(props),url);
总之,就是根据给定的url和用户名密码,返回一个与数据库关联的Connection。JDBC相当于是程序与数据库之间的桥梁。得到Connect代表桥已经建好,此刻已经可以通车了。