디자인 모드 - 템 플 릿 모드 실제 응용

10782 단어
디자인 모드 - 템 플 릿 모드 실제 응용
배경 설명:
최근 에 보고서 데 이 터 를 Hadoop 플랫폼 에서 TiDB 로 옮 기 는 수 요 를 하고 있 습 니 다. 그런데 TiDB 는 저장 과정 이 없어 서 자바 로 실현 하려 고 합 니 다.
구체 적 인 실현 방향: sql 데 이 터 를 조회 한 후에 데 이 터 를 데이터베이스 임시 표 에 삽입 하고 마지막 으로 결과 표 로 이전 합 니 다.
템 플 릿 디자인 모드 를 사용 하 는 것 은 전체 보고서 데이터 가 10 + 의 임시 표를 사 용 했 기 때 문 입 니 다. 우 리 는 임시 표 에 대한 처리 절차 가 똑 같 습 니 다. 모두 데이터 양 을 먼저 조회 한 다음 에 데 이 터 를 분할 삽입 합 니 다 (데이터 양 이 너무 많 으 면)
 
추상 템 플 릿 디자인:
package com.dfx.demo.service;

import java.util.*;

/**
 *           
 */
public abstract class OnePrimHaAbstract {


    /**
     *                ,          ,           
     * @param methodName        
     * @return
     */
    public abstract Integer getInsertDataNums(String methodName) throws Exception;

    /**
     *           
     * @param methodName        
     * @param start          
     * @param end        
     */
    public abstract void  insertData2DB(String methodName,Integer start,Integer end)throws Exception;

    /**
     *     
     * 1.     
     * 2.(  )          
     * @return
     */
    public Integer HaProData(String methodName,Integer maxInsertNums ) throws Exception{
        long starttime = System.currentTimeMillis();

        //      ,            
        Integer sumdataNums =getInsertDataNums(methodName);
        List> limitList = getStartEndLimits(sumdataNums,maxInsertNums);
        if(limitList != null){
            for(Map limitListObj : limitList){
                System.out.println(methodName+" - limitListObj:"+limitListObj);
                insertData2DB(methodName,limitListObj.get("start"),limitListObj.get("end"));
            }
        }
        System.out.println(methodName+" -   :"+(System.currentTimeMillis()-starttime)/1000 +"s");

        return sumdataNums;
    }

    /**
     *     or         ,                        
     * @param tablename           (eg: rs_Ha_Pro)
     */
    public abstract void truncateConProTable(String  tablename);

    /**
     *
     *          
     * @param tablename               (eg: rs_Ha_Pro)
     * @param tabledatanums           
     * @param status           ,       1,          0.(    0)
     * @param remark          
     */
    public abstract void updConProMonitor(String  tablename,Integer tabledatanums,Integer status,String remark);


    /**
     *           (             -      )
     * @param sumNumbers     
     * @param maxInsertNums           
     * @return     list(seqid         ,start     ,end     )
     */
    private  List> getStartEndLimits(Integer sumNumbers,Integer maxInsertNums){

        if(sumNumbers <= 0 ){return null;}//   0    null
        int len = sumNumbers/maxInsertNums +1;
        int modlen = sumNumbers%maxInsertNums ;
        int start = 0;
        int end = maxInsertNums;

        List> limitList = new ArrayList>();

        //      ,      (  maxInsertNums      1   )
        len = sumNumbers/maxInsertNums +1;
        modlen = sumNumbers%maxInsertNums ;
        start = 0;
        end = maxInsertNums;
        if(sumNumbers < maxInsertNums){end=sumNumbers;} //       20w        
        for(int i=0;i  limitMaps = new HashMap();
            limitMaps.put("start",start);
            limitMaps.put("end",end);
            limitMaps.put("seqid", i);
            limitList.add(limitMaps);
//            System.out.println(" "+(i+1)+"      limitMaps:"+limitMaps);
//            System.out.println(" "+(i+1)+"      limitList:"+limitList);
            if(i==(len-2)){
                end =modlen;
            }
            start +=maxInsertNums;

        }

        //       
        Collections.sort(limitList,new Comparator>(){
            @Override
            public int compare(Map map1, Map map2) {
                if( map1.get("seqid") > map2.get("seqid")){
                    return 1;
                }
                return -1;
            }
        });

        return limitList;
    }

}

 
추상 템 플 릿 시트 의 하위 클래스
(여 기 는 제 모든 하위 클래스 의 실현 논리 가 거의 일치 하기 때문에 마지막 에 호출 된 Dao 만 다 릅 니 다. 즉, 실 행 된 sql 이 다 릅 니 다. 그래서 저 는 하위 클래스 만 정 의 했 습 니 다. 하위 클래스 에서 switch case 를 통 해 처 리 했 습 니 다. 필요 에 따라 서로 다른 하위 클래스 를 정의 하고 추상 적 인 방법 으로 나 눌 수 있 습 니 다) package com. dfx. demo. service. impl;
import com.dfx.demo.dao.haProMapper;
import com.dfx.demo.service.OnePrimHaAbstract;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.util.List;

/**
 *           
 */
@Service
public  class OnePrimHaAbstractImpl extends OnePrimHaAbstract {


    @Autowired
    private haProMapper haProMapper;

    /**
     *                ,          ,           
     * @return
     */
    public  Integer getInsertDataNums(String methodName) throws Exception{
        Integer resultNums = null;
        if(methodName != null ){
            switch(methodName){
                case "insertTmp1": resultNums = haProMapper.getTmp1nums();
                    break;
......... case ........ case "insertTmp20": resultNums = haProMapper.getTmp20nums(); break; } } return resultNums ; } /** * */ public void insertData2DB(String methodName,Integer start,Integer end)throws Exception{ if(methodName != null ){ switch(methodName){ case "insertHaProtmp1": haProMapper.insertTmp1(start,end); break;
............. case................. case "insertHaProtmp20": haProMapper.insertTmp20(start,end); break; } } } @Override public void truncateConProTable(String tablename) { haProMapper.truncateConProTable(tablename); } @Override public void updConProMonitor(String tablename, Integer tabledatanums, Integer status, String remark) { haProMapper.updConProMonitor(tablename,tabledatanums,status,remark); } }

 
Dao 층 의 Mapper 인터페이스 클래스
package com.dfx.demo.dao;

import com.sun.org.glassfish.gmbal.ParameterNames;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;

import java.util.List;
import java.util.Map;

/**
 *        
 */
@Mapper
public interface ContactAgentMapper {

 
  //     1     
  public Integer getTmp1nums();
  //      1         
  public void insertTmp1(@Param("start") Integer start, @Param("end") Integer end);

.......                       ......
/** * or , * @param tablename */ public void truncateConOnelifeTable(@Param("tablename") String tablename); }

  
Dao 층 의 Mapper 파일 (sql)









	


.........        xml  .........



	




 
동적 전송 테이블 이름 실행 sql
특별히 설명해 주세요.  truncateConProTable (String tablename) 이 방법 은 Dao 층 에 전 달 된 것 은 Mybatis 에서 ${} 로 변 수 를 가 져 오 는 것 이 아니 라 ${} 로 가 져 오 는 것 을 표시 하기 때 문 입 니 다.
원인: \ # {} 을 사용 하여 얻 은 값 은 사전 컴 파일 을 거 쳐 sql 주입 에 작은 따옴표 가 있 는 것 을 방지 합 니 다. 전체 sql 실행 에 문법 문제 가 있 을 수 있 습 니 다.
예제 사용 (정확):

	


 
my batis 의 \ # 와 $의 차이 점:
1、#              ,               。
 :where username=#{username},       111,     sql    where username="111",        id,     sql where username="id". 
2、$             sql 。
 :where username=${username},       111,     sql    where username=111;
       ;drop table user;,     sql :select id, username, password, role from user where username=;drop table user;
3、#          sql  ,$      Sql  。
4、$             ,      .
5、    #    $,      “${xxx}”     ,          ,   sql    。
6、 MyBatis ,“${xxx}”            SQL  ,          。            ,    “${xxx}”       。  ,                        。
【  】   MyBatis      ,    “#{xxx}”     。      “${xxx}”     ,          ,   SQL    。

  
마지막 으로 Controller 층 에서 업무 논리 순서에 따라 호출 처리 하면 됩 니 다.
컨트롤 러 호출 예시
package com.dfx.demo.web;

import com.dfx.demo.dao.pojo.ContactAgentPojo;
import com.dfx.demo.service.OnePrimContactsService;
import com.dfx.demo.service.OnePrimContactsAbstract;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.bind.annotation.RestController;

import java.util.ArrayList;
import java.util.List;

/**
 *        
 */
@RestController
public class OnePrimContacts {

    @Autowired
    private  OnePrimHaAbstract  OnePrimHaAbstract oneAbstract;

    @RequestMapping("/getOnePrimContactsTemplate")
    public Integer dealContactPro(){
        Integer resultNums = null;
        try {
            resultNums = getContactPro();
        } catch(Exception e){
            System.out.println("      ,     ,    :"+ e);
            //                          
           dealContactPro();//          
        }
        return resultNums;
    }

    private Integer getContactPro() throws Exception{

        long starttime = System.currentTimeMillis();
        //1.                
        oneAbstract.truncateConProTable("rs_table_tmp1");

        //2.           
        Integer insertTmp1 =  oneAbstract.HaProData("insertTmp1",200000);
        System.out.println("   1 insertTmp1"+insertTmp1);
       
	    ....          .....
		
        long endtime = System.currentTimeMillis();
        System.out.println("      :"+(endtime-starttime)/1000 +"s");
		
        return contactsPro;
    }
}

  
전체 템 플 릿 모델 은 주로 Service 층, 추상 류 의 정의 에 응용 되 고 그 다음 에 하위 클래스 의 실현 이다.
템 플 릿 부모 클래스: 추상 적 인 방법 (하나 이상) 을 정의 하고 추상 적 이지 않 은 방법 에서 추상 적 인 방법 을 호출 하 며 같은 업무 논 리 를 작성 합 니 다.
템 플 릿 하위 클래스: 추상 적 인 부 류 를 계승 하여 추상 적 인 방법 을 실현 합 니 다.
호출: 부모 클래스 대상 을 설명 하고 부모 클래스 의 비 추상 적 인 방법 (즉 템 플 릿 방법) 을 호출 하면 됩 니 다.

좋은 웹페이지 즐겨찾기