建立连接的本质就是获取Connection对象,它的方式有两种,
第一种,Driver方式,可以直接通过驱动类,也可以通过驱动管理器类。实际中不使用,只学习的时候,或编写测试案例时使用。
第二种,DataSource,数据源,它是一个接口,第三方提供实现。它支持的功能完全由第三方实现,最常见的有连接池(通常命名为XXPooledDataSource),分布式(通常命名为XADataSource)。本篇略,后续介绍C3P0和Hirika数据源。
获取到Connection对象之后,可以查询数据库的元信息,执行SQL语句等。本篇只介绍查询元信息。
本篇按照建立连接之前,连接对象本身,建立连接之后的顺序,介绍三个阶段中涉及到的核心对象。
1、Driver
驱动接口,全称为java.sql.Driver,数据库厂商提供实现类。方法由三部分组成。建立连接,查询信息,兼容性检查。
1.1 建立连接
建立连接的步骤如下:
第一步,创建Driver对象。
Driver driver = new com.mysql.cj.jdbc.Driver();
第二步,调用connect方法。
Connection connection = driver.connect(url, properties);
url:数据库的url地址,例如mysql地址:jdbc:mysql://localhost:3306/test?useUnicode=true&characterEncoding=utf-8
properties:连接时需要的属性,用户名和密码是必须的,用户名的属性名称为user,密码的属性名称为password。
// 创建Driver对象, 实例化为mysql Driver Driver driver = new com.mysql.cj.jdbc.Driver(); // 建立连接需要的url地址 String url = "jdbc:mysql://localhost:3306/test?useUnicode=true&characterEncoding=utf-8"; // 设置连接的属性 Properties properties = new Properties(); properties.put("user", "xx"); properties.put("password","xx"); // 获取Connection对象 Connection connection = driver.connect(url, properties);
1.2 查询信息
查询版本信息,其他信息都封装在DriverPropertyInfo中,查看它需要建立连接。
// 创建Driver对象, 实例化为mysql Driver Driver driver = new com.mysql.cj.jdbc.Driver(); // 驱动主版本号, 返回8 log.info("驱动的主版本号:{}", driver.getMajorVersion()); // 驱动的次版本号, 返回3, 说明版本号为8.3 log.info("驱动的次版本号:{}", driver.getMinorVersion()); // 建立连接需要的url地址 String url = "jdbc:mysql://localhost:3306/test?useUnicode=true&characterEncoding=utf-8"; // 设置连接的属性,用户名,密码 Properties properties = new Properties(); properties.put("user", "xx"); properties.put("password","xx"); // 其他信息,封装对象DriverPropertyInfo。 log.info("驱动的其他属性:{}", JSON.toJSONString(driver.getPropertyInfo(url, properties)));
1.3 兼容性
// 驱动是否支持url,返回布尔值 log.info("驱动是否匹配此url地址:{}", driver.acceptsURL(url)); // 是否完全支持jdbc规范。 log.info("驱动是否完全支持jdbc规范:{}", driver.jdbcCompliant());
2、DriverManager
DriverManager,驱动管理器,方法由三部分组成。管理驱动,建立连接,get & set属性。
2.1 管理驱动
注册驱动,查询驱动,撤销驱动。
注册驱动有两种方式。
显示,调用DriverManager.registerDriver方法。
隐式,在驱动类加载时,设置jdbc.drivers虚拟机变量时,会自动注册。
查询驱动:
getDriver(url):根据url地址查询驱动。
getDrivers():所有驱动列表。
撤销驱动:调用deregisterDriver(driver)方法。
// 注册驱动 DriverManager.registerDriver(driverInstance); // 第二种方式, 设置jdbc:drivers System.setProperty("jdbc:drivers","com.mysql.cj.jdbc.Driver"); // 查询驱动信息 log.info("DriverManager根据url查询驱动:{}", JSONArray.toJSONString(DriverManager.getDriver(url))); log.info("DriverManager查询所有驱动:{}", JSONArray.toJSONString(DriverManager.getDrivers())); // 撤销驱动 DriverManager.deregisterDriver(driverInstance);
2.2 建立连接
建立连接,遍历已注册的驱动,逐个适配url地址。有三个方法。
getConnection,
getConnection(url, prop),
getConnection(url, user, password)
2.3 get & set
超时时间:loginTimeout, 单位为秒,当设置为0时,没有时间限制。
LogWriter:日志的输出流。
3、Connection
Connection, 连接对象,获取该对象是后续任何操作的前提条件。它的方法由四部分组成。
执行sql:创建三种Statement对象。
查询信息:获取DatabaseMeta,查询元信息。获取ClientInfo,客户端信息。
数据库功能:是否自动提交,事务隔离级别,等等。
类型映射:JDBC与Java对象相互转换时的映射关系,略。
3.1 执行sql
创建Statement对象,createStatement以及它的重写。
创建PreparedStatement对象,prepareStatement以及它的重写。
创建CallableStatement对象,prepareCall以及它的重写。
3.2 查询信息
元信息:
getDatabaseMetaData,所有元信息
catalog:get & set方法。catalog,数据库名称。
schema:get & set方法。schema名称
客户端信息: getClientInfo。
3.3 功能
事务相关:
隔离级别:get & setTransactionIsolation,返回值为int。
是否只读:布尔属性readOnly的基础方法。
存档点:set & release & rollback。
回滚:rollback。
提交:布尔属性autoCommit的基础方法。commit方法。
其他:
是否关闭: isClosed,close关闭。
3.4 类型映射
TypeMap:get & set方法。第一个参数string为数据库类型,class为Java对象类型。
4、DatabaseMetadata
元信息,主要有三类。
版本信息:数据库版本,JDBC版本,驱动版本。
实例信息:catalog, schema, table, column等信息。
变量:各类数据库的变量。
4.1 版本信息
// 数据库版本 log.info("数据库的厂商:{}", metaData.getDatabaseProductName()); log.info("数据库的版本号:{}.{}", metaData.getDatabaseMajorVersion(), metaData.getDatabaseMinorVersion()); // 驱动版本号 log.info("Driver的名称:{}", metaData.getDriverName()); log.info("Driver的版本:{}", metaData.getDriverVersion()); log.info("Driver的版本:{}.{}", metaData.getDriverMajorVersion(), metaData.getDriverMinorVersion()); // JDBC版本号 log.info("JDBC的版本号:{}.{}", metaData.getJDBCMajorVersion(), metaData.getJDBCMinorVersion());
4.2 实例信息
catalog-->schema--->table--->column(列定义信息等),只列举了schema。
ResultSet schema = metaData.getCatalogs(); while (schema.next()){ // 数据库信息 log.info("数据库的schema:{}", schema.getString(1)); }
4.3 变量
连接信息
log.info("url:{}", metaData.getURL()); log.info("userName:{}", metaData.getUserName());
数据库支持的函数。
log.info("所有的系统函数:{}", metaData.getSystemFunctions()); log.info("所有的数字函数:{}", metaData.getNumericFunctions()); log.info("所有的字符串函数:{}", metaData.getStringFunctions()); log.info("所有的日期函数:{}", metaData.getTimeDateFunctions());