JDBC
JDBC
面向关系型数据库的 Java 数据库连接,Java DataBase Connectivity,用于执行 SQL语句的 Java-API,由一组用 Java 语言编写的类和接口组成。Java 应用程序通过通用的 JDBC-API 在不同的 JDBC 驱动程序的管理下访问不同的数据库。目前常用的 JDBC 驱动是纯 Java 的、智能的,直接与数据库实例交互。
- 与数据库建立连接;
- 执行 SQL 语句;
- 获取并处理执行结果;
JDBC-API 支持两层 C/S 和三层 B/S 处理模型进行数据库访问,包括两个层次:
- 面向应用的 API:Java (JDBC) API,抽象接口,供程序开发人员使用;
- 面向数据库的 API:Java Driver API,供开发商开发数据库驱动程序使用。所有的 JDBC 驱动程序必须实现 Java.sql.Driver 接口;
优缺点
- 统一对不同数据库的操作,实现跨数据库、跨平台,可移植性好
- 直接底层操作,数据访问速度快
- 代码量大、重复,维护成本高
JDBC包
- java.sql
- javax.sql
JDBC组件
SQLException:类,异常处理;
Driver:接口,与数据库的通讯;
DriverManager:类,驱动管理器,主要功能是获取 Connection 对象;
Connection:接口,代表数据库连接对象;
Statement:接口,执行 SQL 语句、DDL/DML/DCL 的工具;
- PreparedStatement:子接口,预编译的 Statement 对象,性能优于 Statement 对象;
♂ 简化 sql 拼接带来的编程复杂度,执行效率高;
♂ 防止 SQL 注入(Cracker入侵方式),安全性好;
- CallableStatement:子接口,用于调用存储过程;
ResultSet:结果集对象,其方法 getMetaData() 返回 ResultSetMetaData 对象;
通过传入参数 resultSetType 和 resultSetConcurrency 控制 ResultSet 的类型及其并发类型。
~ TYPE_SCROLL_SENSITIVE:可更新
~ CONCUR_UPDATABLE:可滚动
- ResultSetMetaData:分析结果集的元数据接口,获取 ResultSet 对象的描述信息;
♂ int getColumnCount():列数量;
♂ String getColumnName(int columnIndex):指定索引的列名;
♂ int getColumnType(int columnIndex):指定索引的列类型;
RowSet:ResultSet 的子接口,可滚动、可更新、可序列化,可作为 JavaBean 用于网络传输、同步两端数据。离线 RowSet 不需保持与数据库的连接,可充分利用内存,降低数据库服务器的负载、提高程序性能,CachedRowSet 是所有离线 RowSet 的父接口。Java 的 RowSet 类似 C# 的 DataSet,同时 RowSet 支持分页查询。
- RowSetProvider:类,其方法 newFactory() 创建 RowSetFactory 对象;
- RowSetFactory:接口,用于创建 RowSet 不同子接口的对象;
利用 RowSet 对象的 populate() 方法可以将 ResultSet 对象(分页)装填到 RowSet 对象。
DatabaseMetaData:接口,封装数据库连接对应的数据库信息,由 Connection 的实例方法 getMetaData() 获取。此外,可以通过查询系统表 information_schema 来分析数据库信息。
- boolean supportsBatchUpdates():查看底层数据库是否支持批量更新;
- ResultSet getXxx():获取 Xxx(数据列、主键等)信息;
JDBC 编程
♬ 加载数据库驱动;
Class.forName("com.mysql.jdbc.Driver");
♬ 通过 DriverManager 获取数据库连接 Connection 对象;
DriverManager.getConnection(url, userName, passWord); 其中,url 应为 "jdbc:mysql://hostName:port/databaseName"
♬ 通过 Connection 对象创建 Statement 对象;
createStatement();
prepareStatement(String sql);
prepareCall(String sql);{call 存储过程名(?,?,?…)},同时需要为输出参数注册数据类型,其中,sql 中可以包含 ? 占位符。
♬ 通过 Statement 对象执行 SQL 语句;
execute(); executeUpdate(); executeQuery();
♬ 操作结果集;
使用列索引作为参数性能更优,使用列名作为参数可读性好;
♬ 回收数据库资源;
注:JDBC 使用 连接池 javax.sql.DataSource 管理数据库连接。数据库连接池是 Connection 对象的工厂,接口 DataSource 的对象的实例方法 getConnection() 获取数据库连接。
JDBC - 事务支持
JDBC 连接的的事务支持由 Connection 提供:
conn.setAutoCommit(false); // 关闭自动提交,开启事务 conn.commit(); // 提交事务 conn.rollback()/rollback(Savepoint savepoint); // 回滚事务(到中间点)
Connection 提供的其他方法:
boolean getAutoCommit(); // 获取该连接的自动提交模式 Savepoint setSavepoint()/setSavepoint(String name) // 设置并返回中间点的Savepoint对象
此外,利用 Statement 对象的实例方法 addBatch(String sql) 和 executeBatch() 可以提供批量更新功能。
参考
Java的事务类型
JDBC事务
JTA事务
Java Transaction API,
容器事务