自定义注解+策略模式,实现不同表的写操作!
1、利用阿里的开源数据库同步工具-canal来解析不同的数据库表binlog日志,解析完成的数据,我们要入库不同的数据库,不同的表。
2、每个表对应一个Mapper类,插入不同的表,我们需要选择不同的Mapper来执行同一个函数:insertSelective
3、普通的完成方式,我们需要根据不同的表名采用“if”条件判断,选择不同的Mapper,这样的代码是比较冗余的。
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)@Inheritedpublic @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;@Servicepublic 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); }}
声明:本站所有文章资源内容,如无特殊说明或标注,均为采集网络资源。如若本站内容侵犯了原著者的合法权益,可联系本站删除。