自定义注解+策略模式,实现不同表的写操作!
案例:
1、利用阿里的开源数据库同步工具-canal来解析不同的数据库表binlog日志,解析完成的数据,我们要入库不同的数据库,不同的表。
2、每个表对应一个Mapper类,插入不同的表,我们需要选择不同的Mapper来执行同一个函数:insertSelective
3、普通的完成方式,我们需要根据不同的表名采用“if”条件判断,选择不同的Mapper,这样的代码是比较冗余的。
10年积累的成都网站制作、成都网站设计经验,可以快速应对客户对网站的新想法和需求。提供各种问题对应的解决方案。让选择我们的客户得到更好、更有力的网络服务。我虽然不认识你,你也不认识我。但先网站设计后付款的网站建设流程,更有温县免费网站建设让你可以放心的选择与我们合作。
如何利用自定义注解来实现?
1、定义一个接口:IProcessor
package com.jane.binlog.dao;
public interface IProcessor {
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 {
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 map = new HashMap<>();
//定义表和对象的关系
static {
map.put("pos_sale", PosSale.class);
}
private Map mapperMap = new HashMap();
@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 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 data, Class clazz) {
return JSONObject.parseObject(JSONObject.toJSONString(data), clazz);
}
}
分享标题:自定义注解+策略模式,实现不同表的写操作!
文章位置:http://myzitong.com/article/ghojig.html