디자인 모드 - 템 플 릿 모드 실제 응용
배경 설명:
최근 에 보고서 데 이 터 를 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
추상 템 플 릿 시트 의 하위 클래스
(여 기 는 제 모든 하위 클래스 의 실현 논리 가 거의 일치 하기 때문에 마지막 에 호출 된 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 층, 추상 류 의 정의 에 응용 되 고 그 다음 에 하위 클래스 의 실현 이다.
템 플 릿 부모 클래스: 추상 적 인 방법 (하나 이상) 을 정의 하고 추상 적 이지 않 은 방법 에서 추상 적 인 방법 을 호출 하 며 같은 업무 논 리 를 작성 합 니 다.
템 플 릿 하위 클래스: 추상 적 인 부 류 를 계승 하여 추상 적 인 방법 을 실현 합 니 다.
호출: 부모 클래스 대상 을 설명 하고 부모 클래스 의 비 추상 적 인 방법 (즉 템 플 릿 방법) 을 호출 하면 됩 니 다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
다양한 언어의 JSONJSON은 Javascript 표기법을 사용하여 데이터 구조를 레이아웃하는 데이터 형식입니다. 그러나 Javascript가 코드에서 이러한 구조를 나타낼 수 있는 유일한 언어는 아닙니다. 저는 일반적으로 '객체'{}...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.