JDBC初級応用例(一)回転


回転:http://blog.csdn.net/axman/archive/2006/07/07/887843.aspx
JDBC初級応用例(一)
    JDBCの基礎知識を知ってから、まずデータベース操作の種類を書きます.
この種類の基礎の上で、紹介の深く入り込むことに従って絶えず最適化の方案を提供します.
    一つのデータベース操作を一つのクラス(Bean)に独立させるには、少なくとも次のいくつかの側面を考慮しなければならない.
    1.異なる階層の応用に対して、異なる結合を得る方法があるべきで、連結を得る方法は
アプリケーションのレベルの違いを変えて、私たちは彼を専門的なクラスに独立させるべきです.
のいずれも共通の処理方法を一つのビーンにパッケージします.
    2.javaBeanとしても使えるし、普通のタイプでも使えると考えている以上、javaBeanを考慮してください.
の規範と普通類の柔軟性.
    3.特定のデータベース操作については、共通性のビーコンにカプセル化してはならず、その拡張クラスになるべきである.
    以上の点はJAVAの面象対象の思想を十分に考慮し、深く抽象的に形成された段階を経て、次のように私は
私たちはこの思想に基づいて設計します.
    一つは連結のためのBeanを定義します.これからは異なるアプリケーションでJ 2 EEからも使えます.
DataSourceで連結されたり、普通の連結池から連結されたり、直接DriverManagerから入手します.
連結は、本類における連結された実現方法を修正するだけでよい.
   
package com.imnamg.axman.beans;
    import java.sql.*;
    import ..................
    public class ConnectionFactory{
        protected Connection conn;
        ConnectionFactory() throws SQLException 
        {    //         
            //    DataSource     DriverManager     .
            //      ,      ,        , 
            //DriverManager     ,      ,       
            //             try{}catch(){}      .
            //            ,          ,  
            //conn   protected
            conn =     DriverManager.getConnection(url,user,passwd);
        }
        
        /**
                   ,                   
                ,              ,        
                       ,               
                 ,                      
                          ?          ,  
                                 ,     
                           .
        */
        public void makeConnection(){
            //          ,          ,     
            //         .
            conn =     DriverManager.getConnection(url,user,passwd);
        }
    }
    このタイプはここに包装します.もちろんここで業務方法を増やすことができますが、連結の実現を修正したいなら、
全体のクラスを再コンパイルする必要があります.業務方法と応用レベルは関係なく、コードが生成されると変更しにくいので、独立してパッケージ化します.
以下の業務方法を実現します.
  
 package com.imnamg.axman.beans;
    import java.sql.*;
    import ..................
    public class DBOperater extends ConnectionFactory{
        //private Statement stmt;
        //private ResultSet rs;
        //          stmt rs,        ,         ,
        //   conn         rs stmt,        ,    
        //           ,     ,       stmt      
        //stmt          ,        ,           
        // stmt  .             ,           .

        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);
            //         ,                  .
            //            ,             ,  ,
            //                .
            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);
            //               ,             
            ResultSet rs = stmt.executeQuery(sql);
            return rs;
        }

        /**
                   ,                    ,    
                   stmt,    
        */



        public int executeUpdate(String sql) throws SQLException{
            if (con == null || con.isClosed()) 
                makeConnection();
            Statement stmt = con.createStatement();
            //  stmt              ,    ,         
            //        ,                 ,      
            //            (!!!!!!!!!!!!!!!!!!)
            int s = stmt.executeUpdate(sql);
            return s;
        }

        //         ,           "  " ,          
        //   :
        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;
        }

        //  :                          PreparedStatement
        // CallableStatement                  .         
        //         .      ,      close()        ,   
        //               :

        public void close() throws SQLException{
            if(conn != null && !conn.isClosed())
                conn.close();
        }
        //        ConnectionFactory ,              .    
               
    }
    OKです.私達はすでにデータベースの通常の操作のパッケージを実現しました.これらの業務方法はすべて使用者に異常を投げています.役に立たないです.
try...catchで処理します.ここで処理したら、コーディネーターはデバッグできなくなります.特定のデータベースの特殊操作については、閉じないでください.
このような中に入れば、この類から継承したり、直接にConnection Factory類から継承したりできます.もちろんこの業務類から継承したほうがいいです.
このように、特殊な方法だけでなく、共通の業務方法も呼び出すことができます.例を挙げて、Oracleを適用する時、XMLファイルを直接に使用します.
データの保存数とデータを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;
                 }
    }
    今、このようないくつかの「もの」が手元にありますが、他に何か不便なことがありますか?
    ここは初級アプリケーションとしても、デザイン思想はすでにJAVAの達人の決まり道です.
はい、休みましょう.