Java 接口继承使用(多数据库源类似查询的封装)
场景描述
我是因为一个中间件的项目(由用户维护多个数据库链接信息,系统从多数据源中读取库中的全部表)发现的这个东西。为了让扩展数据库类型比较方便,所以这个地方需要抽象出一个数据库基类,每次新增数据库类型的时候,只是写新类继承基类就可以了,通过反射呀,或者简单的 ifelse 的方式调用就可以了。我就简单写一下实现需要哪几部分。
实现
Holder 类
我比较懒,一个参数从 controller 传递到最内层是真的烦人呢,使用 ThreadLocal 就比较方便了,但是也别乱用呀。这个地方就是保存了数据库类型。ThreadLocal 是每个线程独享的,所以不会出现多线程互相影响的问题。
import org.springframework.core.NamedThreadLocal;
/**
* 描述:
* 数据库类型holder
*
* @author ludengke
* @create 2020-07-21 16:18
*/
public class DatabaseTypeHolder {
private static final ThreadLocal<String> DATABASE_TYPE_HOLDER = new NamedThreadLocal<>("DATABASE_TYPE");
public static String getDatabaseType() {
return DATABASE_TYPE_HOLDER.get();
}
public static void setDatabaseType(String databaseType) {
DATABASE_TYPE_HOLDER.set(databaseType);
}
public static void clearUserInfo() {
DATABASE_TYPE_HOLDER.remove();
}
}
mapper 层
mapper 层分为 mapper 类和 mapper xml
mapper 类
/** * 描述: * 数据库操作基类,不加Mapper注解,不加Mapper注解 * @author ludengke * @create 2020-07-21 16:22 */ public interface DatabaseOptMapper { /** * 查询数据库表信息 * @return 返回表信息 */ List<TableInfo> queryTableInfo(); }
/** * 描述: * mysql操作类,加Mapper注解 * @author ludengke * @create 2020-07-21 16:22 */ @Mapper public interface MysqlOptMapper extends DatabaseOptMapper{ }
/** * 描述: * PGSQL操作类 * @author ludengke * @create 2020-07-21 16:22 */ @Mapper public interface PgsqlOptMapper extends DatabaseOptMapper{ }
mysql 操作类的 mapper.xml 用于查询,当前连接的所有表
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd"> <mapper namespace="com.MysqlOptMapper"> <select id="queryTableInfo" resultType="com.TableInfo"> SELECT `table_name`, table_comment FROM information_schema.`TABLES` WHERE table_schema = (SELECT DATABASE ()) </select> </mapper>
PGSQL 操作类的 mapper.xml 用于查询,当前连接的所有表
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd"> <mapper namespace="com.PgsqlOptMapper"> <select id="queryTableInfo" resultType="com.TableInfo"> with tmp_tab as ( select pc.oid as ooid,pn.nspname,pc.* from pg_class pc left join pg_namespace pn on pc.relnamespace = pn.oid where pc.relkind in ('r') and pc.relnamespace in (select pn.oid from pg_namespace pn where pn.nspname in (select CURRENT_SCHEMA)) and pc.oid not in (select inhrelid from pg_inherits ) order by pc.relname ),tmp_desc as ( select pd.* from pg_description pd where pd.objsubid = 0 ) select tab.relname as table_name, de.description as table_commit from tmp_tab tab left join tmp_desc de on tab.ooid = de.objoid </select> </mapper>
service 层
服务方:负责处理不同数据库操作
package com.wangdian.bigdata.biserver.dataset.service.imlp;
import com.TableInfo;
import com.DatabaseTypeHolder;
import com.DatabaseOptMapper;
import com.MysqlOptMapper;
import com.PgsqlOptMapper;
import com.IDatabaseOptService;
import org.springframework.stereotype.Service;
import javax.annotation.Resource;
import java.util.List;
/**
* 描述:
* 不同数据源操作调用
*
* @author ludengke
* @create 2020-07-21 16:14
*/
@Service
public class DatabaseOptServiceImpl implements IDatabaseOptService {
@Resource
private MysqlOptMapper mysqlOptMapper;
@Resource
private PgsqlOptMapper pgsqlOptMapper;
@Override
public List<TableInfo> queryTableInfoFromOutSideLink(){
return this.getDatabaseOptMapper().queryTableInfo();
}
private DatabaseOptMapper getDatabaseOptMapper() {
DatabaseOptMapper result = null;
switch (DatabaseTypeHolder.getDatabaseType()){
case "mysql":
result = mysqlOptMapper;break;
case "pgsql":
result = pgsqlOptMapper;break;
default:
result = mysqlOptMapper;break;
}
return result;
}
}
package com.service;
import com.TableInfo;
import java.util.List;
/**
* 描述:
*
* @author ludengke
* @create 2020-07-21 16:36
*/
public interface IDatabaseOptService {
/**
* 查询目标库的表的绑定情况
* @return
*/
List<TableInfo> queryTableInfoFromOutSideLink();
}
设计
这样的设计方便以后的扩展,扩展新的数据库类型的时候步骤比较清晰了。
- 增加 DatabaseOptMapper 的实现类,
- 增加实现类的 mapper xml。
- 在 DatabaseOptServiceImpl 中增加 switch 的内容。
- 如果想做更多的数据库操作,在 DatabaseOptMapper 增加方法即可,xml 记得实现哟。
欢迎来到这里!
我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。
注册 关于