mybatisフレームワーク学習(一)

28886 ワード

mybatisで使用されるデザインモード
  • アダプタ設計モード
  • で解決された問題:1つのクラスが1つのインタフェースを継承する場合、クラスはインタフェース内のすべての方法を実現する必要があるため、インタフェースとインタフェース実装クラスとの間の継承矛盾の問題を解決する.
  • アダプタ設計モード特徴:
  • 抽象クラスを用いてインタフェースと【インタフェース実装クラス】
  • を分離する
  • 抽象クラス割り当てインタフェースを実装する必要がある一般的な方法
  • インタフェース実装クラスは、スーパーをぶらぶらするように、インタフェースの方法を任意に選択して
  • を実現することができる.
  • サーブレット仕様のGenericServicelet
  • を参照
    /**
    *	  
    */
    public interface Fu {
    
        public void zhuyaofangfa();
    
        public void chongfudaima1();
    
        public void chongfudaima2();
    
    }
    
    /**
    *	   
    */
    public  abstract class AdapterFu implements Fu {
    
        public void chongfudaima1() {
            System.out.println("           1.。。。。。。。");
        }
    
        public void chongfudaima2() {
            System.out.println("          2............");
        }
    
    }
    
    /**
    *	  
    */
    public class Zi extends AdapterFu {
    
        public void zhuyaofangfa() {
            System.out.println("Zi         ");
        }
    
        public void print(){
            zhuyaofangfa();
            super.chongfudaima1();
            super.chongfudaima2();
        }
    
    }
    
    /**
    *	   
    */
    public class TestMain {
    
        public static void main(String[] args) {
            Zi zi = new Zi();
            zi.print();
        }
    
    }
    
  • テンプレート設計モード
  • で解決された問題:親にサブクラスメソッドの呼び出し順序を制御させる;(ただし実際の開発では親のメソッドはfinalで修飾されない)
  • の利点:開発者が開発する際、方法の実現を考慮する必要があり、方法がどのような場合に呼び出されるかを考慮する必要がなく、コードの多重性を低減する
  • .
  • 注:HttpServeretを見ていると、サービスメソッドでfinalを使用して修飾されていないのは、sun社の人がこのメソッドを親を継承した子を上書きしてこのメソッドを柔軟に運用できるようにしたくないためであり、設計モードの真髄は固定不変のモードではなく、ビジネスに応じて最適化された処理
  • である
    /**
    *	       
    */
    public class AClass {
        public void method1(){
            System.out.println("AClass method1 .............");
        }
        public void method2(){
            System.out.println("AClass method2 .............");
        }
        public void method3(){
            System.out.println("AClass method3 .............");
        }
        public void method4(){
            System.out.println("AClass method4 .............");
        }
        public final void print(){
            method1();
            method2();
            method3();
            method4();
        }
    }
    /**
    *	      Aclass           
    */
    public class TemplateDemo extends AClass {
        @Override
        public void method1() {
            System.out.println( " TemplateDemo method1 .............");
        }
    }
    
    /**
     *    
    */
    public class TestMain {
        public static void main(String[] args) {
            TemplateDemo demo = new TemplateDemo();
            demo.print();
        }
    }
    
  • エージェント設計モード
  • で解決された問題:業務の観点から、「二次業務」と「主要業務」を解結合する
  • 【副次的タスク】と【主要業務】区分:
  • 副次的な業務:補助機能を持ち、補助【主な業務】が順調に実現し、プロジェクト【副次的な業務】では
  • が大量に繰り返されることが多い.
  • 主な業務:主な任務
  • 【マイナービジネス】開発効率への影響:
  • mybatisでは、sql文を書くことだけが主なタスクであり、他の操作は副次的なタスクであると考えられています.開発者はこれらの副次的なビジネスに注目すべきではありません.主なビジネス
  • に関心を持つ必要があります.
  • 例えばJDBC動作:
  • ロードドライバクラス(マイナービジネス)
  • 接続チャネル(マイナービジネス)
  • を確立する
  • データベース操作オブジェクト(サブビジネス)
  • を確立する
  • sqlコマンドをデータベースにプッシュして氷戻り処理結果(メインタスク)
  • を実行する.
  • conn statement rs(サブビジネス)
  • を破棄


  • の役割:主な業務と副次的な業務を分離し、仕事量を減らし、主な業務に関心を持つだけである.ブロッキング、フィルタ、およびリスナーは、いずれもエージェントモードの生成物
  • である.
  • 本質:行為の傍受
  • 例:onclickは1つのエージェント(リスニングオブジェクト)に相当する$proxy fun 1はInvocationHandler注に相当する:反射はエージェントモードで運用される技術にすぎず、モードの本質ではない
  • の構成:
  • インタフェース:傍受が必要と宣言された動作
  • エージェント実装クラス:InvocationHandlerを実装する実装クラス;副次的な業務の実現;セカンダリ・ビジネスおよびプライマリ・ビジネス・バインディング実行
  • エージェントオブジェクト:リスニングオブジェクト
  • /**
    *   :       
    *      【    】  ,  
    *      【    】  
    * mybatis       :
    * 	         ,            ,        ,          ,
    * 	             ,   mybatis ,  dao    dao.xml  ,dao    
    * 	      dao.xml    , dao         ,mybatis            
    * 	       xml    sql       
    */
    
    /**
    *	dao  
    */
    public interface BaseService {
        public void eating (String food);
        public void wcing();
    }
    
    /**
    *	     
    */
    public class Person implements BaseService {
        public void eating(String food) {
            System.out.println("chi " + food);
        }
        public void wcing() {
            System.out.println("la shi ....");
        }
    }
    
    /**
    *	     ,      dao    ,              
    */
    public class Agent implements InvocationHandler {
        private BaseService obj; //             
        public Agent(BaseService param){
            this.obj = param;
        }
        //            
        /**
         *
         * @param proxy           ----     onclick
         *
         * @param method           
         *
         * @param params               
         *
         * @return
         * @throws Throwable
         */
        public Object invoke(Object proxy, Method method, Object[] params) throws Throwable {
            //1.         
            String methodName = method.getName();
            if("eating".equals(methodName)){//    
                wash();
                //System.out.println(methodName + "is run .....");
                method.invoke(obj,params);
            }else{
                //System.out.println(methodName + "is run .....");
                method.invoke(obj,params);
                wash();
            }
            /*
                       ,                 ,     
                           (    )
            * */
            return null;
    
        }
        //    
        private void wash(){
            System.out.println("  "); //   
        }
    }
    
    /**
    *	    ,            ,          ,             
    */
    public class ProxyFactory {
        //          
        public static BaseService newInstance(){
            //0.             
            BaseService xiaoming = new Person();
            //1.           
            //InvocationHandler agent = new Agent();
            InvocationHandler agent = new Agent(xiaoming);
            //2.  /             (    ;     onclick    )
            /**
             * loader                    ;   BaseService        
             *
             * interface            ,                     
             *                     
             *
             */
            Class classArry[]  = {BaseService.class};
            //BaseService      = (BaseService)Proxy.newProxyInstance(BaseService.class.getClassLoader()/*loader*/,classArry/*interface*/,agent);
            BaseService      = (BaseService)Proxy.newProxyInstance(Person.class.getClassLoader()/*loader*/,classArry/*interface*/,agent);
            return     ;
        }
        
        //          
        public static BaseService newInstance(Class classFile) throws Exception {
            //0.             
            BaseService      = (BaseService)classFile.newInstance();
            //1.           
            //InvocationHandler agent = new Agent();
            InvocationHandler agent = new Agent(    );
    
            //2.  /             (    ;     onclick    )
            /**
             * loader                    ;   BaseService        
             *
             * interface            ,                     
             *                     
             *
             */
    
            Class classArry[]  = {BaseService.class};
    
            //BaseService      = (BaseService)Proxy.newProxyInstance(BaseService.class.getClassLoader()/*loader*/,classArry/*interface*/,agent);
    
            BaseService      = (BaseService)Proxy.newProxyInstance(classFile.getClassLoader()/*loader*/,classArry/*interface*/,agent);
    
            return     ;
        }
    }
    
    /**
    *	   
    */
    public class TestMain {
        public static void main(String[] args) throws Exception {
            //            
            /*BaseService service = ProxyFactory.newInstance();
            service.eating("jitui");*/
            //BaseService xiaoming = new Person(); //                 
            BaseService xiaoming = ProxyFactory.newInstance();
            xiaoming.eating("ya ");
        }
    }