jdbc 系列文章列表, 请查看目录: 《jdbc学习笔记》
1. jdbc 简介
jdbc(Java Database Connectivity) 是一个独立于特定数据库管理系统, 通用的sql数据库存取和操作的共用接口, 定义了用来访问数据库的标准java类库. jdbc 为访问不同的数据库,提供了一种统一的API.
1.1 jdbc API
jdbc API(接口)包括两个层次:
面向应用的API: Java API(接口), 供java 应用程序开发使用.面向数据库的API: Java Driver API, 供开发商开发数据库驱动程序使用.
1.2 jdbc 驱动
jdbc 只定义了java对数据库操作的接口, 具体实现由各数据库厂商提供实现. 各数据库厂商依据jdbc规范制作的jdbc实现类的类库, 称之为jdbc 驱动. jdbc 驱动程序共有四种类型:
JDBC网路协议的纯Java驱动程序: 使用最多的类型JDBC-ODBC 桥部分本地API,部分Java的驱动程序本地协议的纯java驱动程序
1.3 jdbc URL
jdbc url 用于指定驱动程序类型和要连接的数据库信息. 驱动程序管理器(DriverManager) 通过此url 选择正确的驱动程序, 与指定的数据库建立连接.URL 格式: <协议>:<子协议>:<子名称>
协议: 始终为jdbc子协议: 用于标识一个数据库驱动程序子名称: 标识具体数据库. 可根据不同的子协议而变化, 目的是为了给定位数据库提供足够多的信息.
# mysql jdbc url
jdbc:mysql://localhost:3306/learn-jdbc?characterEncoding=UTF-8
# oracle jdbc url
jdbc:oracle:thin:@(DESCRIPTION=(ADDRESS_LIST=(ADDRESS=(PROTOCOL=TCP)(HOST=localhost)(PORT=1521)))(CONNECT_DATA=(SERVICE_NAME=orcl)))
2. jdbc 常用API
所谓jdbc 只提供API, 指的是在jdk源码(java.sql.*)中定义了jdbc 操作的相关接口, 可直接利用接口进行开发. 理想情况下, 应用使用什么数据库存储数据, 只需要替换相应的数据库驱动即可.因为不同数据库的sql略有不同, 因此是理想情况下.java.sql 包下提供了很多接口, 笔者这里介绍几个比较常用的接口.需要注意的是, Connection, Statement, ResultSet 均为数据库连接资源, 虽然继承了AutoCloseable接口, 但是依然建议手动关闭资源.
2.1 Driver
接口: java.sql.DriverDirver 接口是所有JDBC 驱动程序必须实现的接口, 由数据库厂商实现, 这个接口用于向应用程序注册该驱动程序.通常不建议通过直接创建Driver 实例, 建立与数据库的连接. 因为这样会导致程序与数据库强耦合.
2.2 DriverManager
驱动管理器: java.sql.DriverManagerDriverManager 用于管理数据库驱动, 根据不同jdbc URL 获取相应数据库的连接.通过DriverManager 获取数据库连接有两个好处:
应用程序可注册多种数据库驱动程序, DriverManager可根据jdbc URL 类型返回相应数据库的连接应用程序与驱动实现解耦, 因为程序代码中无须直接编写Driver 实现类的代码.
2.3 Connection
数据库连接: java.sql.ConnectionConnection 是jdbc 与数据库搭建的数据传输桥梁, 可用于获取数据操作对象Statement, 设置事务隔离级别, 控制事务提交与回滚等操作.
2.4 Statment
Statment 用于执行sql, jdbc 定义了三种Statment接口:
java.sql.Statement: 接口. 可用于执行增删改查等操作, 但有sql注入风险.
java.sql.PreparedStatement: 接口, 继承于Statement. 用于参数化执行sql, 最常用的一种方式.
java.sql.CallableStatement: 接口, 继承于 PreparedStatement. 用于调用数据库的存储过程或函数.
2.5 ResultSet
结果集: java.sql.ResultSetResultSet 是jdbc定义的一个查询结果集, 类似于一个二维表结构. 但是遍历时, 需要采用游标的方式进行遍历, 默认游标在表头, 需要使用next()方法判断并移动游标.
2.6 ResultSetMetaData
结果集信息: java.sql.ResultSetMetaDataResultSetMetaData 用于存储结果集中各列信息, 包含类名称, 列别名, 列的数据库类型, 列的jdbc 类型, 列数量等. 可通过ResultSetMetaData 和反射开发结果集封装工具类, 类似于Mybatis 的结果集封装功能.
2.7 DatabaseMetaData
数据库信息:java.sql.DatabaseMetaDataDatabaseMetaData 用于获取数据库和驱动的相关信息, 如数据库类型, 数据库版本, 数据库列表, 表列表, 驱动版本等信息.