91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

自定義注解+策略模式,實現不同表的寫操作!

發布時間:2020-06-16 03:47:57 來源:網絡 閱讀:689 作者:shayang88 欄目:編程語言

案例:

1、利用阿里的開源數據庫同步工具-canal來解析不同的數據庫表binlog日志,解析完成的數據,我們要入庫不同的數據庫,不同的表。
2、每個表對應一個Mapper類,插入不同的表,我們需要選擇不同的Mapper來執行同一個函數:insertSelective
3、普通的完成方式,我們需要根據不同的表名采用“if”條件判斷,選擇不同的Mapper,這樣的代碼是比較冗余的。

如何利用自定義注解來實現?

1、定義一個接口:IProcessor

package com.jane.binlog.dao;

public interface IProcessor<T> {
    int insertSelective(T record);

    int updateSelective(T record);
}

2、定義一個注解:ProcessorMapper

package com.jane.binlog.dao;

import java.lang.annotation.*;

@Target({ ElementType.METHOD, ElementType.TYPE })
@Retention(RetentionPolicy.RUNTIME)
@Inherited
public @interface ProcessorMapper {

    String value() default "";
}

3、每個Mapper增加注解:@ProcessorMapper

1、注解的值就是表的名字。
2、Mapper實現接口IProcessor,傳入操作對象的類型

import java.util.Date;

@Repository
@ProcessorMapper("pos_sale")
public interface PosSaleMapper extends IProcessor<PosSale> {
   int insert(PosSale record);
}

4、調用文件

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<>();

    //定義表和對象的關系
    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));
            }
        }
    }

    /**
     * 數據寫入操作
     * @param table
     * @param data
     * @param op
     */
    public void binlogInsert(String table, Map<String, Object> data, String op) {
        try {
                    //獲取表對應的對象類
            Class clazz = map.get(table);
                        //組裝對象數據
            Object obj = this.assumePosSale(data, clazz);
                        //實現寫操作
            IProcessor processor = mapperMap.get(table);
            processor.insertSelective(obj);
        } catch(Exception e) {
            throw e;
        }
    }

    /**
     * 把數據map轉化為對應表對象
     * @param data
     * @param clazz
     * @return
     */
    private Object assumePosSale(Map<String, Object> data, Class clazz) {
        return JSONObject.parseObject(JSONObject.toJSONString(data), clazz);
    }

}
向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

措美县| 闽清县| 上饶县| 河东区| 海盐县| 武平县| 介休市| 阿巴嘎旗| 会宁县| 北宁市| 道孚县| 西丰县| 金阳县| 开远市| 桃园县| 黑河市| 自治县| 南江县| 黄陵县| 安溪县| 太仆寺旗| 靖远县| 平武县| 土默特左旗| 图木舒克市| 长顺县| 黄浦区| 囊谦县| 塘沽区| 泰兴市| 景洪市| 威远县| 龙岩市| 拉萨市| 庄浪县| 化州市| 桦甸市| 枝江市| 房产| 金阳县| 桃园县|