国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學(xué)院 > 開發(fā)設(shè)計 > 正文

新手上路:JDBC初級應(yīng)用實例(一)

2019-11-18 12:38:56
字體:
供稿:網(wǎng)友

  在了解JDBC基礎(chǔ)知識以后,我們先來寫一個數(shù)據(jù)庫操作的類(Bean)以后我們會在這個類的基礎(chǔ)上,隨著介紹的深入不斷提供優(yōu)化的方案.要把一個數(shù)據(jù)庫操作獨立到一個類(Bean)中,至少要考慮以下幾個方面:
  
  1.對于不同層次的應(yīng)用,應(yīng)該有不同的得到連結(jié)的方法,假如得到連結(jié)的方法要隨著應(yīng)用層次的不同而改變,我們就應(yīng)該把他獨立成一個專門的類中,而把在任何應(yīng)用層次中都通用的處理方法封裝到一個(類)Bean中.
  
  2.既然考慮到既作為javaBean使用又可以用為一個普通類調(diào)用,要考慮到j(luò)avaBean的規(guī)范和普通類的靈活性.
  
  3.對于特定的數(shù)據(jù)庫操作不應(yīng)封裝到共性的(類)Bean中,而應(yīng)該成為它的擴展類.
  
  以上幾點是充分考慮JAVA的面象對象的思想,經(jīng)過深入的抽象形成的層次,下面我們就按這個思想來設(shè)計:
  
  一:定義一個用于連結(jié)的Bean,以后假如要在不同的應(yīng)用中,如可以在J2EE中從DataSource中得到連結(jié),或從普通的連結(jié)池中得到連結(jié),以及直接從DriverManager中得到
  
  連結(jié),只需修改本類中的得到連結(jié)的實現(xiàn)方法.
  
  package com.imnamg.axman.beans;
  import java.sql.*;
  import ..................
  public class ConnectionFactory{
  PRotected Connection conn;
  ConnectionFactory() throws SQLException
  {  //構(gòu)造方法中生成連結(jié)
  //無論是從DataSource還是直接從DriverManager中取得連結(jié).
  //先初始化環(huán)境,然后取得連結(jié),本例作為初級應(yīng)用,從DriverManager中取得連結(jié),因為是封裝類,所以要把異常拋給調(diào)用它的程序處理而不要用try{}catch(){}塊自選處理了.
  //因為要給業(yè)務(wù)方法的類繼續(xù),而又不能給調(diào)用都訪問,所以conn聲明為protected
  conn =   DriverManager.getConnection(url,user,passwd);
  }
  
  /**
  在多線程編程中,很多時候有可能在多個線程體中得到同一連結(jié)的引用,但假如在一個線程中關(guān)閉了連結(jié),則另一個得到相同引用的線程就無法操作了,所以我們應(yīng)該加一個重新建立連結(jié)的輔助方法,有人問為什么既然有這個輔助方法不直接調(diào)用這個輔助而要在構(gòu)造方法中生成連結(jié)?因為這樣可以增加效率,假如在構(gòu)造時不能生成連結(jié)則就不能生成這個對象了,沒有必要在對象生成后再測試能不能生成連結(jié).
  */
  public void makeConnection(){
  //此處的代碼同構(gòu)造方法,無論以后假如實現(xiàn)連結(jié),都將構(gòu)造方法的代碼復(fù)制到此處.
  conn =   DriverManager.getConnection(url,user,passwd);
  }
  }
  
  這個類就封裝到這里,當然你可以在這兒增加業(yè)務(wù)方法,但假如要修改連結(jié)的實現(xiàn),整個類都要重新編譯,因為業(yè)務(wù)方法和應(yīng)用層次無關(guān),代碼一經(jīng)生成不易變動,所以獨立封裝.以下我們實現(xiàn)業(yè)務(wù)方法:
  
  package com.imnamg.axman.beans;
  import java.sql.*;
  import ..................
  public class DBOperater extends ConnectionFactory{
  //private Statement stmt;
  //private ResultSet rs;
  //為什么要注釋成員變量stmt和rs,基礎(chǔ)部分已經(jīng)說過,假如聲明為成員變量,在關(guān)閉conn時可以顯示地先關(guān)閉rs和stmt,別的沒有任何好處,而顯示關(guān)閉只是說明你編程風格好,但綜合考慮,我們要生成多個stmt或不是類型的stmt就不能聲明為成員方法,否則引用同一對象,所以我們要業(yè)務(wù)方法中生成stmt對象.不僅可以同時處理多個結(jié)果集,還可以提高性能和靈活性.
  
  public ResultSet executeQuery(String sql) throws SQLException{
  if(conn==null conn.isClosed())
  makeConnection();
  Statement stmt = con.createStatement(
  ResultSet.TYPE_SCROLL_INSENSITIVE,
  ResultSet.CONCUR_READ_ONLY);
  //對于一般的查詢操作,我們只要生成一個可流動的結(jié)果集就行了.
  //而對于在查詢時要更新記錄,我們用另一個業(yè)務(wù)方法來處理,這樣,這樣可以在普通查詢時節(jié)省回滾空間.
  ResultSet rs = stmt.executeQuery(sql);
  return rs;
  }
  
  public ResultSet executeUpdatabledQuery(String sql) throws SQLException{
  if (con == null con.isClosed())
  makeConnection();
  Statement stmt = con.createStatement(
  ResultSet.TYPE_SCROLL_INSENSITIVE,
  ResultSet.CONCUR_UPDATABLED);
  //可更新的結(jié)果結(jié)要更大的回滾空間,普通查詢時不要調(diào)用這個方法
  ResultSet rs = stmt.executeQuery(sql);
  return rs;
  }
  
  /**
  基于同上的原因,在執(zhí)行更新操作是我們根本不要任何回滾空間,所以建立一個基本類型的stmt,實現(xiàn)如下
  */
  
  public int executeUpdate(String sql) throws SQLException{
  if (con == null con.isClosed())
  makeConnection();
  Statement stmt = con.createStatement();
  //這個stmt在執(zhí)行更新操作時更加節(jié)省內(nèi)存,永遠記住,能節(jié)省的時候要節(jié)省每一個字節(jié)的內(nèi)存,雖然硬件設(shè)備可能會有很大的物理內(nèi)存,但內(nèi)存是給用戶用的而不是給程序員用的(!!!!!!!!!!!!!!!!!!)
  int s = stmt.executeUpdate(sql);
  return s;
  }
  
  //以上實現(xiàn)了常用功能,還有兩個通用的功能也是/"共性/"的,我們一起在這個封裝類中實現(xiàn):
  public PreparedStatement getPreparedStmt(String sql) throws SQLException{
  if (con == null con.isClosed())
  makeConnection();
  PreparedStatement ps = con.prepareStatement(sql);
  return ps;
  }
  public CallableStatement getCallableStmt(String sql) throws SQLException{
  if (con == null con.isClosed())
  makeConnection();
  PreparedStatement ps = con.prepareCall(sql);
  return ps;
  }
  
  //記住:對于封裝類而言預(yù)編譯語句和存儲過程調(diào)用應(yīng)該從連結(jié)中返PreparedStatement和CallableStatement供調(diào)用者處理而不是返回它們的處理結(jié)果.也就是說封裝類只封裝了它們的連結(jié)過程.最后再次聲明,一定要有一個close()方法供調(diào)用者調(diào)用,而且告訴調(diào)用者無論假如要調(diào)用這個方法:
  
  public void close() throws SQLException{
  if(conn != null && !conn.isClosed())
  conn.close();
  }
  //這個方法最好放在ConnectionFactory中,這樣可以直接調(diào)用來只測試連結(jié).而不用再調(diào)用子類來關(guān)閉
  }
  
  OK,我們已經(jīng)實現(xiàn)了數(shù)據(jù)庫常用操作的封裝,注重這些業(yè)務(wù)方法都是把異常拋給調(diào)用者而沒有用try...catch來處理,你假如在這里處理了那么調(diào)用者則無法調(diào)試了.對于特定的數(shù)據(jù)庫的非凡操作,不要封裝到此類中,可以再從這個類繼續(xù),或直接從ConnectionFactory類繼續(xù),當然最好是從這個業(yè)務(wù)類中繼續(xù),這樣不僅可以調(diào)用非凡方法也可以調(diào)用共性的業(yè)務(wù)方法,興一個例子,我在應(yīng)用Oracle時要把xml文件直接存到數(shù)據(jù)數(shù)和把數(shù)據(jù)直接讀取為XML文件,那么這兩個方法只對Oracle才用到,所以:
  
  package com.inmsg.axman.beans;
  
  import java.sql.*;
  import oracle.xml.sql.query.OracleXMLQuery;
  import oracle.xml.sql.dml.OracleXMLSave;
  
  public class OracleDBOperater extends DBOperater{
  public OracleXMLQuery getOXQuery(String sql,String table) throws Exception
  {
  OracleXMLQuery qry = new OracleXMLQuery(con,sql);
  qry.setRowsetTag(table);
  qry.setRowTag(/"RECORD/");
  return qry;
  }
  public int insertXML(String path,String table) throws Exception
  {
  OracleXMLSave sav = new OracleXMLSave(con,table);
  URL url = sav.createURL(path);
  sav.setRowTag(/"RECORD/");
  int x = sav.insertXML(url);
  sav.close();
  return x;
  }
  }

發(fā)表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發(fā)表
主站蜘蛛池模板: 青铜峡市| 当涂县| 武冈市| 怀化市| 汉源县| 本溪市| 于田县| 辉县市| 容城县| 苗栗市| 郧西县| 台湾省| 灯塔市| 清远市| 盈江县| 西乌珠穆沁旗| 河东区| 泗水县| 平潭县| 洛阳市| 诸暨市| 澜沧| 华池县| 晋州市| 边坝县| 商丘市| 舞阳县| 朝阳县| 宁远县| 玛纳斯县| 新营市| 辽阳县| 尤溪县| 高邑县| 团风县| 恩施市| 澳门| 青冈县| 新干县| 南雄市| 阜新|