Java数 据 库连接
![本页使用了标题或全文手工转换](https://upload.wikimedia.org/wikipedia/commons/thumb/c/cd/Zh_conversion_icon_m.svg/35px-Zh_conversion_icon_m.svg.png)
类型 | Data access API |
---|---|
网站 | Java SE 7 |
![](https://upload.wikimedia.org/wikipedia/commons/b/b9/Crystal_source_java.png)
Java
驱动程 序 类型
[编辑]JDBC驱动
类型1:JDBC-ODBC桥
[编辑]这种类型
优点:
只 要 有 对应的 ODBC驱动(大 部分 数 据 库厂商都 会 提供 ),几乎可 以访问所有 的 数 据 库。
- 执行
效率 比 较低,不 适合大数 据 量 存 取的 应用; 由 于需要 客 户端预装对应的 ODBC驱动,不 适合Internet/Intranet应用。
类型2:本地 API驱动
[编辑]这种类型
优点:
速度 快 于第一 类驱动(但 仍比不 上 第 3、第 4类驱动)。
由 于需要 客 户端预装对应的 数 据 库厂商 代 码库,仍不适合Internet/Intranet应用。
类型3:网络协议驱动
[编辑]这种类型
优点:
不 需要 在 客 户端加 载数据 库厂商 提供 的 代 码库,单个驱动程 序 可 以对多 个数据 库进行 访问,可 扩展性 较好。
在中 间件层仍需对最 终数据 进行配置 ;由 于多出 一个中间件层,速度 不 如第四 类驱动程序 。
类型4:本地 协议驱动
[编辑]这种类型
优点:
- 访问
速度 最 快 ; - 这是
最 直接 、最 纯粹的 Java实现。
- 几乎
只 有数 据 库厂商 自己 才能 提供 这种类型的 JDBC驱动。 需要 针对不同 的 数 据 库使用 不同 的 驱动程 序 。
API概 述
[编辑]JDBC API
- DriverManager:负责
加 载各种不同 驱动程 序 (Driver),并根据 不同 的 请求,向 调用者 返 回 相 应的数 据 库连接 (Connection)。 - Driver:驱动
程 序 ,会 将 自身 加 载到DriverManager中 去 ,并处理 相 应的请求并返回 相 应的数 据 库连接 (Connection)。 - Connection:
数 据 库连接 ,负责进行与 数 据 库间的 通 讯,SQL执行以及事 务处理 都 是 在 某 个特定 Connection环境中 进行的 。可 以产生 用 以执行 SQL的 Statement。 - Statement:
用 以执行 SQL查询和 更新 (针对静 态SQL语句和 单次执行)。 - PreparedStatement:
用 以执行 包含 动态参 数 的 SQL查询和 更新 (在 服 务器端 编译,允 许重复执行 以提高 效率 )。 - CallableStatement:
用 以调用 数 据 库中的 存 储过程 。 - SQLException:
代表 在 数 据 库连接 的 建立 和 关闭和 SQL语句的 执行过程中 发生了 例外 情 况(即 错误)。
数 据 类型的 映 射
[编辑]SQL类型 | Java类型 |
---|---|
CHAR | java.lang.String |
VARCHAR | java.lang.String |
LONGVARCHAR | java.lang.String |
NUMERIC | java.math.BigDecimal |
DECIMAL | java.math.BigDecimal |
BIT | boolean |
TINYINT | byte |
SMALLINT | short |
INTEGER | int |
BIGINT | long |
REAL | float |
FLOAT | double |
DOUBLE | double |
BINARY | byte[] |
VARBINARY | byte[] |
LONGVARBINARY | byte[] |
DATE | java.sql.Date |
TIME | java.sql.Time |
TIMESTAMP | java.sql.Timestamp |
BLOB | java.sql.Blob |
CLOB | java.sql.Clob |
Array | java.sql.Array |
REF | java.sql.Ref |
Struct | java.sql.Struct |
例 子
[编辑]Class.forName( "com.somejdbcvendor.TheirJdbcDriver" );
Connection conn = DriverManager.getConnection(
"jdbc:somejdbcvendor:other data needed by some jdbc vendor", // URL
"myLogin", // 用 户名
"myPassword" ); // 密 碼
Statement stmt = conn.createStatement();
stmt.executeUpdate( "INSERT INTO MyTable( name ) VALUES ( 'my name' ) " );
查詢(SELECT)
Statement stmt = conn.createStatement();
ResultSet rs = stmt.executeQuery( "SELECT * FROM MyTable" );
while ( rs.next() ) {
int numColumns = rs.getMetaData().getColumnCount();
for ( int i = 1 ; i <= numColumns ; i++ ) {
// 與 大 部分 Java API中 下 標的 使用 方法 不同 ,字 段 的 下 標 從 1開始
// 當然 ,還 有 其他很多的 方式 (ResultSet.getXXX())獲 取 數 據
System.out.println( "COLUMN " + i + " = " + rs.getObject(i) );
}
}
rs.close();
stmt.close();
PreparedStatement ps = null;
ResultSet rs = null;
try {
ps = conn.prepareStatement( "SELECT i.*, j.* FROM Omega i, Zappa j
WHERE i = ? AND j = ?" );
// 使用 問 號 作 为參數 的 標示
// 進行 參 數 設置
// 與 大 部分 Java API中 下 标的使用 方法 不同 ,字 段 的 下 標 從 1開始 ,1代表 第 一 个問號
// 當然 ,還 有 其他很多針 對 不同 類型 的 類似 的 PreparedStatement.setXXX()方法
ps.setString(1, "Poor Yorick");
ps.setInt(2, 8008);
// 结果集
rs = ps.executeQuery();
while ( rs.next() ) {
int numColumns = rs.getMetaData().getColumnCount();
for ( int i = 1 ; i <= numColumns ; i++ ) {
// 與 大 部分 Java API中 下 标的使用 方法 不同 ,字 段 的 下 標 從 1開始
// 當然 ,還 有 其他很多的 方式 (ResultSet.getXXX())獲 取 數 據
System.out.println( "COLUMN " + i + " = " + rs.getObject(i) );
}
}
catch (SQLException e) {
// 異常 處理
}
finally { // 使用 finally进行资源释放
try {
rs.close();
ps.close();
} catch( SQLException e){} // 异常處理 :忽 略 close()时的错误
}
如果
boolean autoCommitDefault = conn.getAutoCommit();
try {
conn.setAutoCommit(false); //关闭自 动提交,从而将之 后 执行的 多 个SQL语句视为同一 个事务(自 动提交会使 每 一 个SQL语句执行后 提 交一次而重新启用新的事务)
/* 在 此基于有事務 控 制 的 conn執行 你的代 碼 */
conn.commit(); //最 终提交该次 事 务的修 改
} catch (Throwable e) {
try {
conn.rollback(); //回 退 到 上 一个事务开始时的状态
} catch (Throwable ignore) {}
throw e;
} finally {
try { conn.setAutoCommit(autoCommitDefault); } catch (Throwable ignore) {}
}
参考 文献
[编辑]外部 链接
[编辑]- Sun
提供 的 JDBC驱动程 序 及其供 应商列 表 - Sun
提供 的 教程 - Sun Java 2 1.4.2 API (页面
存 档备份,存 于互联网档案 馆) - 一个订单系统的原形 (页面
存 档备份,存 于互联网档案 馆) - DBAccessor: JDBC
数 据 库访问封装 类 (页面存 档备份,存 于互联网档案 馆) - 开源
的 JDBC驱动程 序列 表 (页面存 档备份,存 于互联网档案 馆) - http://blog.csdn.net/cho3en1/article/details/52695808 (页面
存 档备份,存 于互联网档案 馆)
参 见
[编辑]
|