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 对象;
 通过传入参数 resultSetTyperesultSetConcurrency 控制 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
容器事务

原文地址:https://www.cnblogs.com/wjcx-sqh/p/5929877.html