• HZERO 数据源功能扩展代码示例

    目前 HZERO 数据源支持MYSQLORACALSQLSERVERTIDB四种数据库类型,若在实际应用中需要新增其它数据库类型则需要对数据源的功能进行扩展开发,下面介绍一下如何扩展该功能。

    操作步骤

    首先需要确保项目是引入了平台服务依赖的。

    1. 在值集配置页面下查询值集编码为 HPFM.DATABASE_TYPE 的值集,在该值集下维护需要扩展的数据库类型(例如:Redis)。

    1. 在表单配置管理下维护表单信息,表单配置头的配置编码需要与刚刚维护的数据库类型的值保持一致(例如刚刚维护的数据库类型值为Redis,则此处的配置编码也需要设置为Redis),配置归类需要选择数据源类型,点击确定进行保存。

    1. 在创建好的表单配置头下维护需要扩展的表单配置项,配置编码 需要与后台需要扩展的数据库实体类字段保持一致,配置名称 为表单配置项在页面展示的表单名称,此外可以配置表单的 排序号默认值是否必输 以及 启用 状态等信息。

    1. 在项目下需要添加如下两个类来实现数据源功能的扩展,此处以 Redis 为例:

    (1) 数据库扩展配置类,包含测试数据源连接所需字段。示例中 passwordEncrypted 字段是数据库中存在的字段,redisHost 以及 redisPort 字段是我们通过表单配置出的字段(放在extConfig字段中传递到后端)。

    /**
     * RedisDB 数据库扩展配置类
     *
     * @author xiaoyu.zhao@hand-china.com 2019/07/18 15:37
     */
    public class RedisDB {
    
        private String passwordEncrypted;
        
        private String redisHost;
        private String redisPort;
    
        public String getPasswordEncrypted() {
            return passwordEncrypted;
        }
    
        public void setPasswordEncrypted(String passwordEncrypted) {
            this.passwordEncrypted = passwordEncrypted;
        }
    
        public String getRedisHost() {
            return redisHost;
        }
    
        public void setRedisHost(String redisHost) {
            this.redisHost = redisHost;
        }
    
        public String getRedisPort() {
            return redisPort;
        }
    
        public void setRedisPort(String redisPort) {
            this.redisPort = redisPort;
        }
    }
    

    (2) 测试数据源连接所需连接类对象,需要使用 @DatasourceType@Component 进行标注,并且要继承 AbstractConnection 抽象类。

    @DatasourceType 中要配置数据库类型编码,对于测试连接步骤相同的不同类型数据库支持多种配置,例如平台支持的几种关系型数据库可以按照下面的方式进行配置:

    @DatasourceType({Constants.Datasource.DB_MYSQL, Constants.Datasource.DB_TIDB, Constants.Datasource.DB_ORACLE, Constants.Datasource.DB_MSSQL})
    
    /**
     * RedisDB数据源测试连接
     *
     * @author xiaoyu.zhao@hand-china.com 2019/07/18 15:37
     */
    @DatasourceType({"Redis"})
    @Component
    public class RedisDBConnection extends AbstractConnection<RedisDB> {
    
        private static final Logger LOGGER = LoggerFactory.getLogger(RedisDBConnection.class);
    
        @Override
        protected RedisDB convertEntity(Datasource datasource, RedisDB entity) {
            // 校验测试连接所需参数是否完整
            this.validateRedisDBParam(datasource);
            // 解析扩展字段内容
            RedisDB parseResult = super.parse(datasource.getExtConfig());
            // 将数据库测试连接所需非扩展字段的参数set进去
            parseResult.setPasswordEncrypted(datasource.getPasswordEncrypted());
            return parseResult;
        }
    
    
        @Override
        public void testConnection(Datasource datasource) {
            RedisDB redisDB = this.convertEntity(datasource, new RedisDB());
            try (Jedis jedis = new Jedis(redisDB.getRedisHost(), Integer.parseInt(redisDB.getRedisPort()))) {
                if (StringUtils.isNotEmpty(redisDB.getPasswordEncrypted())) {
                    jedis.auth(redisDB.getPasswordEncrypted());
                }
                String pong = jedis.ping();
                LOGGER.info("connection redis success, ping result is : {}", pong);
            } catch (Exception e) {
                throw new CommonException(HpfmMsgCodeConstants.ERROR_GET_CONNECTION_FAIL);
            }
        }
    
    
        /**
         * 校验数据
         *
         * @param datasource 数据源
         */
        private void validateRedisDBParam(Datasource datasource) {
            if (StringUtils.isEmpty(datasource.getExtConfig())) {
                throw new CommonException("Redis param illegal!");
            }
            RedisDB parseResult = super.parse(datasource.getExtConfig());
            if (StringUtils.isEmpty(parseResult.getRedisHost()) || StringUtils.isEmpty(parseResult.getRedisPort())) {
                throw new CommonException("Redis param illegal!");
            }
        }
    }
    

    (3) 代码开发完成后重启项目配置即可生效,至此我们就完成了数据源功能的扩展,可以在环境中正常添加扩展出的数据源配置了。