1、利用阿里的開源數(shù)據(jù)庫同步工具-canal來解析不同的數(shù)據(jù)庫表binlog日志,解析完成的數(shù)據(jù),我們要入庫不同的數(shù)據(jù)庫,不同的表。
2、每個表對應(yīng)一個Mapper類,插入不同的表,我們需要選擇不同的Mapper來執(zhí)行同一個函數(shù):insertSelective
3、普通的完成方式,我們需要根據(jù)不同的表名采用“if”條件判斷,選擇不同的Mapper,這樣的代碼是比較冗余的。
10年積累的成都網(wǎng)站制作、成都網(wǎng)站設(shè)計經(jīng)驗,可以快速應(yīng)對客戶對網(wǎng)站的新想法和需求。提供各種問題對應(yīng)的解決方案。讓選擇我們的客戶得到更好、更有力的網(wǎng)絡(luò)服務(wù)。我雖然不認(rèn)識你,你也不認(rèn)識我。但先網(wǎng)站設(shè)計后付款的網(wǎng)站建設(shè)流程,更有溫縣免費網(wǎng)站建設(shè)讓你可以放心的選擇與我們合作。
package com.jane.binlog.dao;
public interface IProcessor<T> {
int insertSelective(T record);
int updateSelective(T record);
}
package com.jane.binlog.dao;
import java.lang.annotation.*;
@Target({ ElementType.METHOD, ElementType.TYPE })
@Retention(RetentionPolicy.RUNTIME)
@Inherited
public @interface ProcessorMapper {
String value() default "";
}
1、注解的值就是表的名字。
2、Mapper實現(xiàn)接口IProcessor,傳入操作對象的類型
import java.util.Date;
@Repository
@ProcessorMapper("pos_sale")
public interface PosSaleMapper extends IProcessor<PosSale> {
int insert(PosSale record);
}
package com.jane.binlog.service;
import com.alibaba.fastjson.JSONObject;
import com.jane.binlog.dao.IProcessor;
import com.jane.binlog.dao.ProcessorMapper;
import com.jane.binlog.entity.PosSale;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.ApplicationContext;
import org.springframework.stereotype.Service;
import javax.annotation.PostConstruct;
import java.util.HashMap;
import java.util.Map;
@Service
public class PosSaleService {
private static Logger LOG = LoggerFactory.getLogger(PosSaleService.class);
public static Map<String, Class> map = new HashMap<>();
//定義表和對象的關(guān)系
static {
map.put("pos_sale", PosSale.class);
}
private Map<String, IProcessor> mapperMap = new HashMap<String, IProcessor>();
@Autowired
private ApplicationContext applicationContext;
//利用spring上下文,注入帶有自定義注解的所有mapper到一個hashmap中。
@PostConstruct
public void init() {
String[] classNames = applicationContext.getBeanNamesForAnnotation(ProcessorMapper.class);
for (String name: classNames) {
Class<?> type = applicationContext.getType(name);
boolean posSaleMapper = type.isAnnotationPresent(ProcessorMapper.class);
if (posSaleMapper) {
String value = type.getAnnotation(ProcessorMapper.class).value();
mapperMap.put(value, (IProcessor) applicationContext.getBean(name));
}
}
}
/**
* 數(shù)據(jù)寫入操作
* @param table
* @param data
* @param op
*/
public void binlogInsert(String table, Map<String, Object> data, String op) {
try {
//獲取表對應(yīng)的對象類
Class clazz = map.get(table);
//組裝對象數(shù)據(jù)
Object obj = this.assumePosSale(data, clazz);
//實現(xiàn)寫操作
IProcessor processor = mapperMap.get(table);
processor.insertSelective(obj);
} catch(Exception e) {
throw e;
}
}
/**
* 把數(shù)據(jù)map轉(zhuǎn)化為對應(yīng)表對象
* @param data
* @param clazz
* @return
*/
private Object assumePosSale(Map<String, Object> data, Class clazz) {
return JSONObject.parseObject(JSONObject.toJSONString(data), clazz);
}
}
網(wǎng)站標(biāo)題:自定義注解+策略模式,實現(xiàn)不同表的寫操作!
文章網(wǎng)址:http://jinyejixie.com/article6/ghojig.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供網(wǎng)頁設(shè)計公司、網(wǎng)站維護、企業(yè)建站、搜索引擎優(yōu)化、做網(wǎng)站、網(wǎng)站收錄
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)