Java数据库连接

JDBC
当前版本JDBC 4.3(2017年9月21日 (2017-09-21)
操作系统跨平台
类型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). 

外部链接

参见

Read other articles:

DanoneLogo Stato Francia Forma societariaSocietà anonima Borse valori Euronext: BN Borsa Italiana: DNN ISINFR0000120644 Fondazione1919 a Barcellona Fondata daIsaac Carasso Sede principaleParigi SettoreAlimentare Prodotti Prodotti lattieri freschi Acque Nutrizione Infantile Nutrizione clinica Fatturato25,3 miliardi di Euro[1] (2019) Utile netto1,92 miliardi di Euro[2] (2019) Dipendenti102.449 (2019) Sito webwww.danone.com/fr.html Modifica dati su Wikidata · Manu...

 

 

Georg Margreitter Informasi pribadiNama lengkap Georg MargreitterTanggal lahir 07 November 1988 (umur 35)Tempat lahir Schruns, AustriaTinggi 1,87 m (6 ft 1+1⁄2 in)Posisi bermain BelInformasi klubKlub saat ini Wolverhampton WanderersNomor 34Karier junior FC Schruns– BNZ VorarlbergKarier senior*Tahun Tim Tampil (Gol)2007–2010 LASK Linz 28 (2)2008–2009 → Magna Wiener Neustadt (pinjaman) 30 (4)2010–2012 Austria Vienna 59 (2)2012– Wolverhampton Wanderers 1 (0...

 

 

Charles-Ange LaisantCharles-Ange Laisant, par NadarFonctionsPrésidentSociété mathématique de France1888Député de la Seine4 octobre 1885 - 14 octobre 1893Député de la Loire-InférieurePremière circonscription de la Loire-Atlantique20 février 1876 - 9 novembre 1885Conseiller général de la Loire-Inférieure1871-1886DirecteurLe Petit ParisienBiographieNaissance 1er novembre 1841NantesDécès 5 mai 1920 (à 78 ans)Asnières-sur-SeineSépulture Columbarium du Père-Lachaise, Grave ...

Artikel ini membahas mengenai bangunan, struktur, infrastruktur, atau kawasan terencana yang sedang dibangun atau akan segera selesai. Informasi di halaman ini bisa berubah setiap saat (tidak jarang perubahan yang besar) seiring dengan penyelesaiannya. The Bay GateBay Gate tanggal 22 November 2007Informasi umumLokasiDubai, Uni Emirat ArabPerkiraan rampung2008Data teknisJumlah lantai40Desain dan konstruksiArsitekBothe Richter Teherani Architekten BDAPengembangAkar Properties LLC The Bay Gate m...

 

 

Korranid Laosubinprasoet Korranid​ Laosubinprasoet atau Aheye (lahir 9 Juni 2005) adalah seorang pemeran dan penyanyi asal Thailand. Ia tampil dalam drama Watsana Rak pada tahun 2020. Ia mula-mula tampil dalam acara The Voice Kids Thailand 2 (2014) dan We Kid Thailand (2017). Ia merupakan anggota grup vokal perempuan 4EVE. Ia juga membintangi sejumlah judul drama dan film, seperti Full House (2014), Bang Rak Soi 9/1 (2016), ABABO (2017), dan Dead Time Stories 2: City of Moon (2018). Pada 20...

 

 

Khalida ZahirBiographieNaissance 18 janvier 1927OmdourmanDécès 9 juin 2015 (à 88 ans)Nationalité soudanaiseFormation Faculty of Medicine University of Khartoum (en)Activités Médecin, militante pour les droits des femmesAutres informationsMembre de Sudanese Women's Union (en)Prononciationmodifier - modifier le code - modifier Wikidata Khalida Zahir (1927 – 9 juin 2015) [1](parfois Khalda Zahir) est une femme médecin soudanaise et militante des droits des femmes. Elle est née à ...

Voce principale: Football Club Rieti. Football Club RietiStagione 2006-2007Sport calcio Squadra Rieti Allenatore Giuseppe Ferazzoli poi Roberto Borrello poi Giuseppe Ferazzoli Presidente Stefano Palombi Serie C216º posto nel girone B. Retrocede in Serie D. Maggiori presenzeCampionato: Frasca, Melara (32) Miglior marcatoreCampionato: Gentile (8) 2005-2006 2007-2008 Si invita a seguire il modello di voce Questa voce raccoglie le informazioni riguardanti il Football Club Rieti nelle compe...

 

 

Artikel ini membutuhkan judul dalam bahasa Indonesia yang sepadan dengan judul aslinya. Cenote di Hubiku, Yucatan[1] Seorang penyelam yang tengah menyelam di sebuah cenote Cenote[2][3] adalah sebuah gua vertikal atau lubang runtuhan, yang dihasilkan dari runtuhnya batuan dasar batugamping yang mengeluarkan air tanah. Istilah ini secara khusus dikaitkan dengan formasi geologi di Semenanjung Yucatán, Meksiko, di sana cenote biasanya digunakan untuk persediaan air oleh s...

 

 

Yuyushikiゆゆ式GenreKomedi, potongan kehidupan[1] MangaPengarangKomata MikamiPenerbitHoubunshaMajalahManga Time KiraraDemografiSeinenTerbitApril 2008 – sekarangVolume10 Seri animeSutradaraKaoriSkenarioNatsuko TakahashiMusikAsuka SakaiStudioKinema CitrusPelisensiNA Sentai FilmworksSaluranasliTokyo MX, SUN-TV, KBS, tvk, TV Aichi, AT-X, BS11, Anime NetworkTayang 9 April 2013 – 26 Juni 2013Episode12 (Daftar episode) Video animasi orisinalAnnoying and Being AnnoyedSutradaraKaoriSken...

Government schoolHelen Liang Memorial Secondary SchoolLocationSha Tin, the New Territories, Hong KongCoordinates22°21′42″N 114°10′26″E / 22.36167°N 114.17389°E / 22.36167; 114.17389InformationTypeGovernment schoolMottoEruditio Et Commentatio (博學慎思)[1]Founded1961[2] (Primary School) 1977[3] (Sheung Wan) 1988[3] (Sha Tin)PrincipalMr. Chow Shau-on (周守安) Helen Liang Memorial Secondary SchoolHelen Liang Memorial Sec...

 

 

この項目には、一部のコンピュータや閲覧ソフトで表示できない文字が含まれています(詳細)。 数字の大字(だいじ)は、漢数字の一種。通常用いる単純な字形の漢数字(小字)の代わりに同じ音の別の漢字を用いるものである。 概要 壱万円日本銀行券(「壱」が大字) 弐千円日本銀行券(「弐」が大字) 漢数字には「一」「二」「三」と続く小字と、「壱」「�...

 

 

Political party in New Zealand New Zealand Sovereignty Party registered logo The New Zealand Sovereignty Party was a political party in New Zealand. It was founded in 2010 by Southland businessman Tony Corbett.[1] The party advocated repealing the 2007 anti-smacking law and the New Zealand Emissions Trading Scheme, and supported free dental care for school children. It opposes mining in national parks and privatisation.[1] In June 2011 the party was conditionally awarded $20,0...

يفتقر محتوى هذه المقالة إلى الاستشهاد بمصادر. فضلاً، ساهم في تطوير هذه المقالة من خلال إضافة مصادر موثوق بها. أي معلومات غير موثقة يمكن التشكيك بها وإزالتها. (فبراير 2016) الطوق والإسورةمعلومات عامةتاريخ الصدور 7 يونيو 1986مدة العرض 120 دقيقةاللغة الأصلية لغة عربيةالبلد  مصر �...

 

 

Australian federal election See also: Australian federal election, 1966 1967 Australian Senate election ← 1964 25 November 1967 1970 → 30 of the 60 seats in the Senate30 seats needed for a majority   First party Second party Third party   Leader John Gorton Lionel Murphy Vince Gair Party Coalition Labor Democratic Labor Party (Australia, 1955) Seats before 30 27 2 Seats won 14 13 2 Seats after 28 27 4 Seat change 2 2 Popular vote 2,365,...

 

 

Mayor Jenderal TNI (Purn.)Hein Victor Worang Gubernur Sulawesi Utara Ke-5Masa jabatan2 Maret 1967 – 21 Juni 1978PresidenSoehartoPendahuluAbdullah AmuPenggantiWilly LasutWali Kota Manado Ke-13Masa jabatan31 Januari 1975 – 23 Agustus 1975PresidenSoehartoGubernurHein Victor WorangPendahuluJH PussungPenggantiAdolf Albert Pelealu Informasi pribadiLahirHein Victor Worang(1919-03-12)12 Maret 1919Tontalete, Sulawesi Utara, Hindia BelandaMeninggal3 Februari 1982(1982-02-0...

B&H Airlines IATA ICAO Kode panggil JA BON AIR BOSNA Didirikan1994 (sebagai Air Bosna)PenghubungBandar Udara Internasional SarajevoKota fokusBandar Udara Internasional MostarProgram penumpang setiaMiles&SmilesLounge bandaraPenumpang kelas bisnis bisa menggunakan lounge di Bandar Udara Internasional SarajevoArmada4 (+ 3 pesanan)Tujuan9SloganThe airline of Bosnia and Herzegovina.Perusahaan indukPemerintah Federasi Bosnia dan Herzegovina 50.93%, Turkish Airlines 49% dan Energoinvest 0.07...

 

 

Title in the Peerage of England Arms of Ellis: Erminois, a cross sable charged with five crescents argent[1] borne in a lozenge shaped shield by the present Baroness Howard de Walden Arms of Czernin, heir apparent to the barony of Howard de Walden Arms of Thomas Audley, 1st Baron Audley of Walden: Quarterly per pale indented or and azure, in the 2nd and 3rd an eagle displayed of the 1st on a bend of the 2nd a fret between two martlets of the 1st.[2][wa 1] Quartered by ...

 

 

Німецька армія нім. Deutsches Heer[1] Бойовий Прапор Імперської армії Німеччини (1903—1919)На службі 16 квітня 1871; 153 роки тому (1871-04-16)[2] — 5 березня 1919; 105 років тому (1919-03-05)[3]Країна  Німецька імперіяВид сухопутні війська та повітряні силиЧисел�...

В Википедии есть статьи о других людях с такой фамилией, см. Синяговский. Синяговский Владимир Ильич Дата рождения 9 августа 1948(1948-08-09) (75 лет) Место рождения Новониколаевская, Калининский район, Краснодарский край, РСФСР, СССР Гражданство  СССР→ Россия Род деяте...

 

 

聖靈群島聖靈群島地理位置澳大拉西亞坐标20°18′S 148°59′E / 20.300°S 148.983°E / -20.300; 148.983鄰近水域太平洋总岛屿74主要島嶼聖靈島、漢密爾頓島、海曼島面積282.82平方公里(109.20平方英里)管轄 澳大利亞州和領地昆士蘭省地方政府區域威桑迪區 聖靈群島(英語:Whitsunday Islands)是位於澳大利亞昆士蘭州中部沿海地區的一個群島。聖靈群島中最大的島...