亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 學院 > 開發設計 > 正文

淺談實際開發中數據源在JDBC中的應用

2019-11-18 12:39:18
字體:
來源:轉載
供稿:網友

  數據源在JDBC中的應用眾所周知,JDBC(java數據庫連接)是Java2企業版的重要組成部分。它是基于SQL層的API。通過把SQL語句嵌入JDBC接口的方法中,用戶可以通過Java程序執行幾乎所有的數據庫操作。
  
  JDBC只提供了接口,具體的類的實現要求數據庫的設計者完成。通過生成這些接口的實例,即使對于不同的數據庫,Java程序也可以正確地執行SQL調用。所以對于程序員來說,不必把注重力放在如何向數據庫發送SQL指令,因為程序員需要了解和用到的只是JDBC的接口,只有在極少數情況下會用到面向特定數據庫的類,例如程序員希望使用Oracle的擴展API。
  
  在JDBC程序中,首先需要做的是實現與數據庫的連接。在示例程序中,我們使用的是ORACLE8i的JDBC包。連接數據庫通常需要實現以下幾個步驟:
  
  1、注冊數據庫驅動程序(driver)
  
  可以通過調用java.sql.DriverManager類的registerDriver方法顯式注冊驅動程序,也可以通過加載數據庫驅動程序類隱式注冊驅動程序。例如我們希望向虛擬機注冊Oracle8i JDBC驅動程序顯式注冊:
  
  DriverManager.registerDriver
  (neworacle.jdbc.driver.OracleDriver());
  
  隱式注冊:
  
  Class.forName(“oracle.jdbc.driver.OracleDriver”);
  
  關于虛擬機如何自動注冊通過類加載器(ClassLoader)加載的數據庫驅動程序超過了本文討論的范圍,在此不做具體討論。
  
  2、建立連接
  
  調用java.sql.DriverManager類的getConnection()方法可以建立與數據庫的連接。GetConnection()方法返回一個Connection對象。需要注重的是,getConnection()方法會自動從數據庫驅動程序注冊表中選擇一個最合適的驅動程序。
  
  3、建立連接后
  
  答應自動更新(AutoCommit)。調用java.sql.Connection接口的serAutoCommit()方法可以設定當程序向數據庫發出一條SQL指令后,數據庫是否立即更新。下面是一個具體的實例。
  
  在該實例中,作為getConnection()方法參數的url使用的是Net8 keyWord-value pair格式。當然也可以使用普通格式。數據庫安裝在名為Chicago的服務器上,使用的協議是TCP協議,使用的端口是1521,數據庫的SID是chidb,使用的數據庫驅動程序是Oracle JDBC Thin驅動程序。
  
  import java.sql.*;
  // 初始化常數PRivate static String url=
  “jdbc:oracle:thin:@(description
  =(address=(host=Chicago)” +
  “(protocol=tcp)(port=1521))
  (connect_data=(sid=chidb)))”;
  // 也可以設定url為“jdbc:oracle:thin:@ Chicago:1521:chidb”
  private static String username
  = “guest”;private static String
  password = “guest”;
  try
  {
  // 注冊數據庫
  Class.forName(“oracle.jdbc.driver.OracleDriver”);
  // 建立連接
  Connection conn =
  DriverManager.getConnection(url,
  username, password);
  //答應自動更新Conn.setAutoCommit(true);
  }
  catch(ClassNotFoundException e )
  {
  e.printStackTrace();
  }catch(SQLException e)
  {
  e.printStackTrace();
  }
  
  從實際應用的角度出發,我們可以看出采取這種方式連接到數據庫存在幾個問題。第一是安全性問題,由于程序代碼中包含用戶名和密碼,其他人假如能得到bytecode,可以通過反編譯工具獲得用戶名和密碼。
  
  第二是代碼的可移植性問題。假如希望連接的數據庫名稱或用戶名有所更改,程序員需要修改源程序,然后把修改過的程序發送給用戶。也就是說,軟件無法脫離數據庫獨立存在。這樣不僅會大大提高軟件的成本,也不利于軟件本身的發展。
  
  還可能出現這樣的情況:在某些情況下,提供數據的機構不希望數據庫的用戶名和密碼讓編寫程序的程序員知道知道。這樣就提出了一個問題,如何使Java和數據庫之間建立連接時隱藏一些敏感的信息。
  
  數據源(Data Source)及JNDI數據源是在JDBC 2.0中引入的一個概念。在JDBC 2.0擴展包中定義了javax.sql.DataSource接口來描述這個概念。假如用戶希望建立一個數據庫連接,通過查詢在JNDI服務中的數據源,可以從數據源中獲取相應的數據庫連接。
  
  這樣用戶就只需要提供一個邏輯名稱(Logic Name),而不是數據庫登錄的具體細節。在這里有必要簡單介紹一下JNDI。JNDI的全稱是Java Naming and Directory Interface, 可以理解為Java名稱和目錄服務接口。
  
  JNDI向應用程序提供了一個查詢和使用遠程服務的機制。這些服務可以是任何企業服務。對于JDBC應用程序來說,JNDI提供的是數據庫連接服務。當然JNDI也可以向數據庫提供其他服務,但是這超出了本文范圍,在此不做論述。
  
  其實JNDI并不難理解。簡單來說,名稱服務提供了一個把文件,打印機,服務器等實體映射到一個邏輯名稱的機制。例如在操作系統中的名稱服務就把打印機映射到一個I/O端口。而目錄服務可以理解為名稱服務的一個擴展,它答應在服務中的各項擁有自己的屬性。
  
  又以打印機為例,打印機可以是彩色打印機,支持雙面打印,支持網絡打印,支持高速打印等。所有這些打印機的屬性都可以儲存在目錄服務中,和相應的打印機聯系起來。一些常見的目錄服務有NIS,NIS+,LDAP和Novell的NDS等。
  
  JNDI使應用程序通過使用邏輯名稱獲取對象和對象提供的服務,從而使程序員可以避免使用與提供對象的機構有關聯的代碼。例如在下面的例子中使用了在JNDI中的數據源,程序員就不需要提供Oracle8i驅動程序的名稱,這樣代碼的移植能力就更強。
  
  下面具體介紹一下數據源和javax.sql.DataSource接口。在數據源中存儲了所有建立數據庫連接的信息。就象通過指定文件名你可以在文件系統中找到文件一樣,通過提供正確的數據源名稱,你可以找到相應的數據庫連接。
  
  javax.sql.DataSource接口定義了如何實現數據源。在該接口中定義了九個屬性。同時,OracleDataSource還實現了java.io.Serializable和javax.naming.Referenceable接口。獨立使用數據源實際應用中,你可以把OracleDataSource注冊到JNDI,也可以單獨使用。
  
  下面先給出一個單獨使用OracleDataSource的例子:
  
  // 初始化數據源實例OracleDataSource ods
  = new OracleDataSource();
  ods.setDriverType("thin");
  ods.setServerName("Chicago");
  ods.setNetworkProtocol("tcp");
  ods.setDatabaseName("chidb");
  ods.setPortNumber(1521);
  ods.setUser("guest");
  ods.setPassword("guest");
  // 從數據源中獲取數據庫連接Connection
  conn = ods.getConnection();
  // 通過數據庫連接進行數據操作
  
  使用OracleDataSource時有幾點需要注重:假如使用的時服務器端內部驅動程序(server-side internal driver),driverType屬性會被設置為kprb,其它所有屬性失效。 假如使用Thin或OCI驅動程序: URL中可以包括用戶登錄名和用戶登錄密碼。例如:
  
  jdbc:oracle:thin:guest/guest@Chicago:1521:chidb;
  
  假如設定了url屬性,tnsEntry, driverType, portNumber, networkProtocol, serverName,和databaseName屬性將失效。在沒有設定url屬性的情況下,假如設定了tnsEntry屬性,portNumber, networkProtocol, serverName,和databaseName屬性將失效。
  
  假如使用OCI驅動程序,并且networkProtocol屬性被設定為ipc,除user和password外的所有其他屬性將失效。通過JNDI使用數據源在本節首先給出了一個實際程序,然后通過程序來講解如何通過JNDI查詢數據源。
  
  import java.sql.*;
  import javax.sql.*;
  import oracle.jdbc.driver.*;
  import oracle.jdbc.pool.OracleDataSource;
  import javax.naming.*;
  import javax.naming.spi.*;
  import java.util.Hashtable;
  public class DataSourceJNDI
  {
  public static void main
  (String args [])throws SQLException
  {
  // 初始化名稱服務環境Context ctx = null;
  try{Hashtable env = new Hashtable (5);
  env.put (Context.INITIAL_CONTEXT_FACTORY,
  "com.sun.jndi.fscontext.RefFSContextFactory");
  env.put (Context.PROVIDER_URL, "file:JNDI");
  ctx = new InitialContext(env);
  }
  catch (NamingException ne)
  {
  ne.printStackTrace();
  }bind(ctx, "jdbc/chidb");
  lookup(ctx, "jdbc/chidb");
  }
  static void bind
  (Context ctx, String ln)throws NamingException,
  SQLException
  {
  // 創建一個OracleDataSource
  實例OracleDataSource ods
  = new OracleDataSource();
  ods.setDriverType("thin");
  ods.setServerName("Chicago");
  ods.setNetworkProtocol("tcp");
  ods.setDatabaseName("chidb");
  ods.setPortNumber(1521);
  ods.setUser("guest");
  ods.setPassword("guest");
  // 把OracleDataSource實例注冊到JNDI中
  System.out.println
  ("Doing a bind with the logical name : " + ln);
  ctx.bind (ln,ods);
  System.out.println
  ("SUCcessfully bound");
  }
  static void

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
九色精品美女在线| 久久天天躁狠狠躁夜夜av| 国产午夜精品视频免费不卡69堂| 亚洲国产欧美在线成人app| 久久777国产线看观看精品| 精品爽片免费看久久| 亚洲第一页中文字幕| 日韩av一区二区在线观看| 国内精久久久久久久久久人| 日本精品一区二区三区在线| 久久影院资源网| 69视频在线免费观看| 深夜精品寂寞黄网站在线观看| 中文字幕亚洲天堂| 3344国产精品免费看| 国产精品国产福利国产秒拍| 亚洲成人精品久久久| 国产一区二区三区免费视频| 久久精品影视伊人网| 国产精品mp4| 久久久久久久久电影| 欧美电影免费观看电视剧大全| 中文字幕欧美亚洲| 欧美日韩一区二区免费在线观看| 欧美性少妇18aaaa视频| 97超级碰碰碰| 欧美日韩国产va另类| 5252色成人免费视频| 97久久国产精品| 亚洲最大福利网站| 97久久国产精品| 97精品久久久中文字幕免费| 北条麻妃一区二区在线观看| 欧美国产日韩一区二区在线观看| 亚洲精品美女网站| 精品国内自产拍在线观看| 亚洲精选一区二区| 久久亚洲一区二区三区四区五区高| 中文字幕亚洲二区| 欧美性猛交xxxx偷拍洗澡| 中文字幕欧美精品在线| 亚洲国产小视频| 国产免费亚洲高清| 久久九九免费视频| 一区二区三区天堂av| 国产精品日韩电影| 国产精品精品一区二区三区午夜版| 亚洲丝袜一区在线| 日韩电影大全免费观看2023年上| 亚洲精品www| 91精品国产色综合久久不卡98| 国产精品福利网| 久久色精品视频| 91wwwcom在线观看| 亚洲大胆人体av| 色婷婷亚洲mv天堂mv在影片| 欧美第一淫aaasss性| 亚洲免费高清视频| 欧美一级bbbbb性bbbb喷潮片| 国产精品久久久久久久美男| 国产中文字幕亚洲| 欧美丰满少妇xxxxx做受| 亚洲天堂免费在线| 国产精品无码专区在线观看| 亚洲人成网7777777国产| 亚洲精品国产综合区久久久久久久| 日韩欧美成人精品| 国产97色在线| 欧美激情视频在线免费观看 欧美视频免费一| 欧美日韩视频在线| 久久综合九色九九| 亚洲成人免费在线视频| 欧美日韩福利视频| 91美女福利视频高清| 久久久亚洲影院你懂的| 日韩精品中文字幕有码专区| 国产成人免费av| 91超碰caoporn97人人| 日av在线播放中文不卡| 国产精品视频久| 亚洲国产精彩中文乱码av在线播放| 国产精品都在这里| 久久99青青精品免费观看| 98精品在线视频| 中文字幕亚洲欧美| 欧美成aaa人片免费看| 欧美日韩激情小视频| 韩曰欧美视频免费观看| 日本精品视频在线观看| 国产精品久久久久免费a∨大胸| 亚洲在线www| 久久琪琪电影院| 精品久久久久久久久中文字幕| 国产精品成人一区二区三区吃奶| 欧美成人精品在线| 日产精品久久久一区二区福利| 亚洲一区中文字幕| 国产又爽又黄的激情精品视频| 久久久久久尹人网香蕉| 91免费国产网站| 亚洲精品720p| 国产精品久久久亚洲| 国产日韩视频在线观看| 久久福利视频导航| 精品久久久久国产| 国产成人激情视频| 欧美电影免费观看大全| 国产精品一区二区三区久久久| 亚洲国产天堂久久综合网| 亚洲美女在线视频| 国产精品6699| 91精品在线看| 欧美激情一二区| 亚洲福利视频专区| 亚洲无线码在线一区观看| 国产精品一区二区女厕厕| 亚洲乱码一区av黑人高潮| 日韩精品视频免费专区在线播放| 九九热这里只有在线精品视| 最近2019中文免费高清视频观看www99| 在线成人中文字幕| 色香阁99久久精品久久久| 欧美日韩在线观看视频小说| 91久久久国产精品| 亚洲第一级黄色片| 95av在线视频| 国内自拍欧美激情| 成人天堂噜噜噜| 国产激情久久久久| 久久免费在线观看| 色综合久久久久久中文网| 亚洲黄一区二区| 欧美国产精品va在线观看| 国产成人avxxxxx在线看| 亚洲女性裸体视频| 欧美老女人xx| 亚洲欧美国产精品va在线观看| 日韩在线观看免费全集电视剧网站| 国产精品福利在线观看网址| 国产在线精品一区免费香蕉| 91在线直播亚洲| 欧美一级免费看| 欧美性高跟鞋xxxxhd| 久久6精品影院| 精品视频偷偷看在线观看| 亚洲福利在线观看| 久久久久久久久久久国产| 日韩精品极品毛片系列视频| 亚洲第一视频网站| 亚洲色图校园春色| 亚洲国产成人精品久久久国产成人一区| 亚洲毛片在线观看.| 国产精品在线看| 亚洲国产又黄又爽女人高潮的| 一本大道久久加勒比香蕉| 日韩欧美亚洲综合| 97视频在线观看成人| 亚洲精品自产拍| 成人免费福利视频| 亚洲精品综合精品自拍| 亚洲午夜av久久乱码| 欧美午夜精品久久久久久浪潮| 久久精品成人欧美大片古装| 日韩亚洲精品视频|