(Translated by https://www.hiragana.jp/)
Java数据库连接 - 维基百科,自由的百科全书 とべ转到内容ないよう

Javaすうすえ库连せっ

本页使用了标题或全文手工转换
维基百科ひゃっか自由じゆうてき百科ひゃっかぜん
JDBC
操作そうさけいまたが平台ひらだい
类型Data access API
网站Java SE 7

Javaすうすえ库连せっ,(Java Database Connectivity,简称JDBCこれJava语言ちゅうようらい规范きゃく户端ほどじょ如何いからい访问かずすえてき应用ほどじょせっこう提供ていきょうりょう诸如查询更新こうしんすうすえ库中すうすえてき方法ほうほう。JDBC也是Sun Microsystemsてきしょう[1]。JDBCめんむこう关系がたすうすえてき

ざいJ2SEなか提供ていきょうりょう一个称之为JDBC-ODBC桥(JDBC-ODBC Bridge[2]てきAPI。つうODBC,JDBC-ODBC桥驱动ほどじょ以访问所有しょゆう支持しじODBCてき关系がたすうすえ库。あずかJDBC API不同ふどうてき,这个驱动ほどじょ并不よしJavaだい码而ゆかり機器きき(machine code)编写,并且开放げんだいてき[3]

驱动ほどじょ类型

[编辑]

JDBC驱动ほどじょどもぶんよん种类がた

类型1:JDBC-ODBC桥

[编辑]

这种类型てき驱动所有しょゆうJDBCてき调用传递给ODBC,さい让后しゃ调用すうすえ库本驱动だい码(也就すうすえ库厂しょう提供ていきょうてきすうすえ操作そうさ二进制代码库,れいOracleなかてきoci.dll)。

优点:

  • ただようゆう对应てきODBC驱动(だい部分ぶぶんすうすえ库厂商都しょうとかい提供ていきょう),几乎以访问所有しょゆうてきすうすえ库。

缺点けってん

  • 执行效率こうりつ较低,适合大数たいすうすえりょうそん取的とりてき应用;
  • よし于需ようきゃく户端预装对应てきODBC驱动,适合Internet/Intranet应用。

类型2:本地ほんじAPI驱动

[编辑]

这种类型てき驱动どおり过客户端载数すえ库厂しょう提供ていきょうてきほん地代じだい码库(CC++ひとしらい访问すうすえ库,而在驱动ほどじょちゅう包含ほうがんりょうJavaだい码。

优点:

  • 速度そくどかい于第いち类驱动(ただし仍比うえだい3、だい4类驱动)。

缺点けってん

  • よし于需ようきゃく户端预装对应てきすうすえ库厂しょうだい码库,仍不适合Internet/Intranet应用。

类型3:网络协议驱动

[编辑]

这种类型てき驱动给客户端提供ていきょうりょういち个网络API,きゃく户端じょうてきJDBC驱动ほどじょ使用しよう套接(Socket)らい调用ふく务器じょう的中てきちゅう间件ほどじょきさきしゃざいしょう其请もとめ转化为所需的具体ぐたいAPI调用。

优点:

  • 需要じゅようざいきゃく户端载数すえ库厂しょう提供ていきょうてきだい码库,单个驱动ほどじょ以对个数すえ库进ぎょう访问,扩展せい较好。

缺点けってん

  • 在中ざいちゅう间件层仍需对さい终数すえ进行配置はいち
  • よし于多一个中间件层,速度そくど如第よん类驱动程じょ

类型4:本地ほんじ协议驱动

[编辑]

这种类型てき驱动使用しようSocket,直接ちょくせつざいきゃく户端すうすえ库间通信つうしん

优点:

  • 访问速度そくどさいかい
  • 这是さい直接ちょくせつさい纯粹てきJava实现。

缺点けってん

  • 几乎ただ有数ゆうすうすえ库厂しょう自己じこ才能さいのう提供ていきょう这种类型てきJDBC驱动。
  • 需要じゅよう针对不同ふどうてきすうすえ使用しよう不同ふどうてき驱动ほどじょ

APIがいじゅつ

[编辑]

参看さんかんJava SE以及java.sql API

JDBC API主要しゅよう于JDKちゅうてきjava.sqlつつみちゅうこれきさき扩展てき内容ないよう于javax.sqlつつみちゅう),主要しゅよう包括ほうかつ斜体しゃたい代表だいひょうせっこう,需驱动程じょ提供ていきょうしゃらい具体ぐたい实现):

  • DriverManager:负责载各种不どう驱动ほどじょ(Driver),并根すえ不同ふどうてき请求,こう调用しゃかえしかいしょう应的すうすえ库连せっ(Connection)。
  • Driver:驱动ほどじょかいはた自身じしん载到DriverManagerちゅう,并处しょう应的请求并返かいしょう应的すうすえ库连せっ(Connection)。
  • Connectionかずすえ库连せっ,负责进行あずかかずすえ库间てきどおり讯,SQL执行以及ごと务处ざいぼう特定とくていConnection环境ちゅう进行てき以产せいよう以执ぎょうSQLてきStatement。
  • Statementよう以执ぎょうSQL查询更新こうしん(针对せい态SQL语句单次执行)。
  • PreparedStatementよう以执ぎょう包含ほうがん动态さんすうてきSQL查询更新こうしんざいふく务器はし编译,まこと许重复执ぎょう以提だか效率こうりつ)。
  • CallableStatementよう以调ようすうすえ库中てきそん储过ほど
  • SQLException:代表だいひょうざいすうすえ库连せってき建立こんりゅう关闭SQL语句てき执行过程ちゅう发生りょう例外れいがいじょう况(そく错误)。

かずすえ类型てきうつ

[编辑]
从SQLいたJavaすうすえ类型うつ射的しゃてきJDBC规范
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

ちゅう:这种类型ひきはい强制きょうせいせい标准,特定とくていてきJDBC厂商可能かのうかいあらため变这种类がたひきはいれい如OracleちゅうてきDATE类型包含ほうがん分秒ふんびょう,而java.sql.Date仅仅支持しじ年月日ねんがっぴ

れい

[编辑]

利用りようClass.forName()方法ほうほうらい载JDBC驅動くどうほどじょDriverいたりDriverManager:

Class.forName( "com.somejdbcvendor.TheirJdbcDriver" );

しか,从DriverManagerちゅう通過つうかJDBC URLよう户名,みつ碼來相應そうおうてき資料しりょう連接れんせつConnection):

Connection conn = DriverManager.getConnection( 
      "jdbc:somejdbcvendor:other data needed by some jdbc vendor", // URL
      "myLogin", // よう户名
      "myPassword" ); // みつ

不同ふどうてきJDBC驅動くどうほどじょてきURL不同ふどうてき,它永遠えいえん以“jdbc:”開始かいしただしこうめんてき内容ないようあきら驅動くどうほどじょ類型るいけい不同ふどう而各ことざいConnectionこれきさき便びん建立こんりゅうStatementよう執行しっこうSQL语句。下面かめんいち插入そうにゅう(INSERT)てきれい

 Statement stmt = conn.createStatement();
 stmt.executeUpdate( "INSERT INTO MyTable( name ) VALUES ( 'my name' ) " );

查詢(SELECT)てき结果そん于结はてしゅうResultSetちゅう以按あきら顺序訪問ほうもん

 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();

ただし通常つうじょう,Javaほどじょ们更倾向于使用しようPreparedStatement下面かめんてきれい使用しようじょうれいちゅうてきconn對象たいしょう

 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()时的错误
 }

如果すうすえ操作そうさしつ败,JDBCはたほういち个SQLException。一般いっぱんらい说,此類異常いじょう很少のう恢復かいふくただ一能做的就是盡可能詳細的打印異常日記。推薦すいせんてき做法はたSQLException翻譯ほんやくなり應用おうようほどじょ领域相關そうかんてき異常いじょう强制きょうせい處理しょり異常いじょうなみさい终回滚數よりどころ通知つうちよう户。

いちかずよりどころ事務じむだい碼如

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) {}
}

参考さんこう文献ぶんけん

[编辑]
  1. ^ そん副本ふくほん. [2005-07-11]. (原始げんし内容ないようそん于2009-12-05). 
  2. ^ そん副本ふくほん. [2005-07-11]. (原始げんし内容ないようそん档于2005-07-14). 
  3. ^ そん副本ふくほん. [2005-07-11]. (原始げんし内容ないようそん于2010-11-19). 

外部がいぶ链接

[编辑]

まいり

[编辑]