Java 接口继承使用(什么?接口还能继承接口,好吧第一次见)

本贴最后更新于 1442 天前,其中的信息可能已经时异事殊

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

设计

这样的设计方便以后的扩展,扩展新的数据库类型的时候步骤比较清晰了。

  1. 增加 DatabaseOptMapper 的实现类,
  2. 增加实现类的 mapper xml。
  3. 在 DatabaseOptServiceImpl 中增加 switch 的内容。
  4. 如果想做更多的数据库操作,在 DatabaseOptMapper 增加方法即可,xml 记得实现哟。
  • Java

    Java 是一种可以撰写跨平台应用软件的面向对象的程序设计语言,是由 Sun Microsystems 公司于 1995 年 5 月推出的。Java 技术具有卓越的通用性、高效性、平台移植性和安全性。

    3169 引用 • 8208 回帖
  • 接口
    17 引用 • 77 回帖
  • 多数据源
    2 引用 • 2 回帖

相关帖子

欢迎来到这里!

我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。

注册 关于
请输入回帖内容 ...