1、JDBC概述
JDBC是sun公司提供的,用来访问数据库的一套规范接口。主要由Connection、Statement、PreparedStatement、ResultSet四大接口组成。数据库厂商要想让Java应用程序来访问自己的数据库,就必须按规范来实现JDBC的接口,把自己的驱动程序注册进来。简单来说,JDBC对程序员来说是API,对数据库厂商来说是接口规范。
2、JDBC的连接步骤(以mysql数据库为例)
注册驱动 → 获取连接 → 创建sql执行环境 → 使用mysql协议传输数据 → 返回结果集 → 关闭连接
a、注册驱动
/**
*注册mysql数据源驱动
*/
Class.forName("com.mysql.jdbc.Driver");
注册数据库驱动这一句代码足够了。因为mysql自己实现的java.sql.Driver接口中只存在几行静态代码块,加载Driver的类对象时,静态代码块执行,调用registerDriver()方法自动注册驱动。而且继续追溯源码可以知道,DriverManager中的Driver对象都放在Object类型的数组snapShot中,添加驱动的方法是 addIfAbsent()注册的驱动是不会重复的,即当要注册的驱动已经存在时,不会再继续添加。
public class Driver extends NonRegisteringDriver implements java.sql.Driver {
//
// Register ourselves with the DriverManager
//
static {
try {
java.sql.DriverManager.registerDriver(new Driver());
} catch (SQLException E) {
throw new RuntimeException("Can't register driver!");
}
}
/**
* Construct a new driver and register it with DriverManager
*
* @throws SQLException
* if a database error occurs.
*/
public Driver() throws SQLException {
// Required for Class.forName().newInstance()
}
}
b、获取连接
通过DriverManager这个类的静态方法getConnection(url,userName,password)获取连接,每次获取连接,会遍历驱动管理中的所有驱动,直到返回一个正确的connection对象,否则获取连接失败。也就是,url如下填写,DriverManager会选择一个合适的驱动来生成一个数据库连接。
/**
* Attempts to establish a connection to the given database URL.
* The <code>DriverManager</code> attempts to select an appropriate driver from
* the set of registered JDBC drivers.
*/
Connection connection = DriverManager.getConnection("jdbc:mysql://localhost:3306/testa?useSSL=false&useUnicode=true&characterEncoding=utf8,"root","123456");
c、创建sql执行环境
sql执行环境指的是PreparedStatement实例,可以从一个连接对象中取得。源码如下
PreparedStatement preparedStatement = connection.prepareStatement(sql);
获取sql执行环境很简单,但是mysql-connector-java-5.1.47版本(目前我们的工程中使用的版本)是不支持预编译功能的,需要通过useServerPrepStmts=true参数开启。开启预编译,先把带占位符“?”的sql语句发送给数据库解析,再把参数的值传过去执行得到结果,有两次网络传输用时。若不开启,会直接把参数代替占位符传给数据库执行。我们可以先不使
用userServerPreStmts=true开启预编译功能,执行 select 查询,查看sql执行日志如下:
62 Que