树形下拉组件数据查询覆写

一、背景与问题

Oinone 的树形下拉组件(TreeSelect)和树视图(Tree)在查询数据时,最终调用的是树节点所配置模型的数据管理器函数:

树接口 调用的数据管理器函数 场景
fetchAll queryListByWrapper 一次性全量加载
fetchChildren queryPage 按层级懒加载(默认)
queryKeywords4Tree queryListByWrapper 关键字搜索
reverselyQuery queryListByWrapper 已选数据回填

官方文档原文:「所有树查询接口都会调用模型对应的数据管理器函数,可以通过重写的方式修改其查询结果。」

直接覆写的风险

如果直接在原模型(如 business.PamirsDepartment)上覆写 queryPage

// ⚠️ 危险写法:会影响所有使用 PamirsDepartment.queryPage 的场景
@Component
@Model.model(PamirsDepartment.MODEL_MODEL)
public class DeptQueryAction {

    @Function.Advanced(type = FunctionTypeEnum.QUERY, category = FunctionCategoryEnum.QUERY_PAGE)
    @Function.fun(FunctionConstants.queryPage)
    @Function(openLevel = {FunctionOpenEnum.LOCAL, FunctionOpenEnum.REMOTE, FunctionOpenEnum.API})
    public Pagination<PamirsDepartment> queryPage(Pagination<PamirsDepartment> page, IWrapper<PamirsDepartment> queryWrapper) {
        // 追加过滤条件...
        return new PamirsDepartment().queryPage(page, queryWrapper);
    }
}

该覆写会全局生效——不仅是树形下拉,所有调用 PamirsDepartmentqueryPage 的地方(组织架构页面、人员管理列表、权限分配、框架内部关联查询等)都会受到影响,容易引发难以排查的副作用。

二、推荐方案:代理模型(PROXY)隔离

核心思路

  1. 创建一个继承原模型的代理模型ModelTypeEnum.PROXY),拥有独立的模型命名空间
  2. 在代理模型中重新声明自关联字段(如 parent),将关联目标指向代理模型自身
  3. 在代理模型的 Action 中覆写数据管理器函数,追加树形场景专属的过滤逻辑
  4. 树形下拉的视图 DSL 中,<node>model 指向代理模型

代理模型与原模型共享同一张数据表,但函数注册在各自独立的命名空间下,互不干扰。

框架官方示例

Oinone 框架自身就采用了这一模式:ResourceRegionProxyModel 继承 ResourceRegion,用于地区页面的代理展示,其扩展点 ResourceRegionProxyModelExtPoint 中的 queryPageAfter 只影响代理模型自身的查询。

三、完整实现步骤(以 PamirsDepartment 为例)

场景假设

业务需求:某个表单页面的「部门」树形下拉只需要展示当前公司companyCode == 当前用户公司)且启用状态dataStatus == ENABLED)的部门,而系统中其他使用 PamirsDepartment 的地方(组织架构、权限管理等)不受影响。

步骤 1:定义代理模型

package com.example.demo.model;

import pro.shushi.pamirs.meta.annotation.Field;
import pro.shushi.pamirs.meta.annotation.Model;
import pro.shushi.pamirs.meta.enmu.ModelTypeEnum;
import pro.shushi.pamirs.business.api.model.PamirsDepartment;

import java.util.List;

/**
 * 部门树形下拉专用代理模型
 * <p>
 * 继承 PamirsDepartment,共享同一张数据表,
 * 但拥有独立的函数命名空间,覆写 queryPage 不影响原模型。
 */
@Model.model(DeptTreeProxy.MODEL_MODEL)
@Model.Advanced(type = ModelTypeEnum.PROXY)
@Model(displayName = "部门(树选择)", labelFields = "name")
public class DeptTreeProxy extends PamirsDepartment {

    public static final String MODEL_MODEL = "demo.DeptTreeProxy";

    /**
     * 【必须重新声明】上级部门(自关联字段)
     * <p>
     * 基类 PamirsDepartment 中 parent 的类型是 PamirsDepartment,
     * 代理模型必须将其覆盖为指向自身(DeptTreeProxy),
     * 否则设计器/树组件无法在代理模型命名空间内构成完整的自关联关系,
     * 导致树形下拉无法正确展开层级。
     */
    @Field.many2one
    @Field.Relation(relationFields = {"parentCode"}, referenceFields = {"code"})
    @Field(displayName = "上级部门")
    private DeptTreeProxy parent;

    /**
     * 【必须重新声明】下级部门(自关联 O2M 字段)
     * <p>
     * 与 parent 对应,保持自关联关系的双向完整性。
     */
    @Field.one2many
    @Field.Relation(relationFields = {"code"}, referenceFields = {"parentCode"})
    @Field(displayName = "下级部门")
    private List<DeptTreeProxy> childList;
}

要点说明:

  • ModelTypeEnum.PROXY:标记为代理模型,不会新建数据表,底层复用父模型的表
  • MODEL_MODEL 使用项目自己的命名空间(如 demo.),与框架的 business. 隔离

⚠️ 关键陷阱:自关联字段必须重新声明

基类 PamirsDepartmentparent 字段的类型是 PamirsDepartment,其关联关系指向 business.PamirsDepartment
如果代理模型不重新声明 parent,则树组件在解析 selfReferences="parent" 时,
发现该字段的关联目标不是当前代理模型(demo.DeptTreeProxy),而是父模型(business.PamirsDepartment),
导致设计器页面和树形下拉无法构成完整的自关联树结构,表现为:树只有一层、无法展开子节点、或报错。

因此,所有构成树形结构的自关联字段(M2O 的 parent 和 O2M 的 childList)都必须在代理模型中重新声明,将类型指向代理模型自身。

步骤 2:在代理模型 Action 中覆写数据管理器函数

package com.example.demo.action;

import org.springframework.stereotype.Component;
import pro.shushi.pamirs.framework.connectors.data.sql.query.LambdaQueryWrapper;
import pro.shushi.pamirs.framework.connectors.data.sql.query.QueryWrapper;
import pro.shushi.pamirs.meta.annotation.Function;
import pro.shushi.pamirs.meta.annotation.Model;
import pro.shushi.pamirs.meta.api.dto.condition.Pagination;
import pro.shushi.pamirs.meta.api.session.PamirsSession;
import pro.shushi.pamirs.meta.constant.FunctionConstants;
import pro.shushi.pamirs.meta.enmu.FunctionCategoryEnum;
import pro.shushi.pamirs.meta.enmu.FunctionOpenEnum;
import pro.shushi.pamirs.meta.enmu.FunctionTypeEnum;
import pro.shushi.pamirs.core.common.enmu.DataStatusEnum;
import com.example.demo.model.DeptTreeProxy;

import java.util.List;

/**
 * 部门树形下拉代理模型的查询动作
 * <p>
 * 覆写 queryPage 和 queryListByWrapper,
 * 仅对树形下拉组件的查询生效,不影响 PamirsDepartment 原模型。
 */
@Component
@Model.model(DeptTreeProxy.MODEL_MODEL)
public class DeptTreeProxyAction {

    /**
     * 覆写分页查询 —— 树组件懒加载(fetchChildren)时调用
     *
     * @param page         分页参数
     * @param queryWrapper 框架自动构建的查询条件(已包含树层级关联条件)
     * @return 过滤后的分页结果
     */
    @Function.Advanced(type = FunctionTypeEnum.QUERY, category = FunctionCategoryEnum.QUERY_PAGE)
    @Function.fun(FunctionConstants.queryPage)
    @Function(openLevel = {FunctionOpenEnum.LOCAL, FunctionOpenEnum.REMOTE, FunctionOpenEnum.API})
    public Pagination<DeptTreeProxy> queryPage(Pagination<DeptTreeProxy> page,
                                               QueryWrapper<DeptTreeProxy> queryWrapper) {
        // 将 QueryWrapper 转为 LambdaQueryWrapper,通过方法引用指定字段,避免硬编码列名
        LambdaQueryWrapper<DeptTreeProxy> wrapper = queryWrapper.lambda();
        // 追加业务过滤条件:只展示启用状态的部门
        wrapper.eq(DeptTreeProxy::getDataStatus, DataStatusEnum.ENABLED);
        // 追加业务过滤条件:只展示当前用户所属公司的部门
        String companyCode = PamirsSession.getContext().getCompanyCode();
        wrapper.eq(DeptTreeProxy::getCompanyCode, companyCode);
        // 调用代理模型的默认数据管理器执行查询
        return new DeptTreeProxy().queryPage(page, wrapper);
    }

    /**
     * 覆写列表查询 —— 树组件全量加载(fetchAll)和搜索(queryKeywords4Tree)时调用
     *
     * @param queryWrapper 框架自动构建的查询条件
     * @return 过滤后的列表结果
     */
    @Function.Advanced(type = FunctionTypeEnum.QUERY)
    @Function.fun(FunctionConstants.queryListByWrapper)
    @Function(openLevel = {FunctionOpenEnum.LOCAL, FunctionOpenEnum.REMOTE, FunctionOpenEnum.API})
    public List<DeptTreeProxy> queryListByWrapper(QueryWrapper<DeptTreeProxy> queryWrapper) {
        // 将 QueryWrapper 转为 LambdaQueryWrapper
        LambdaQueryWrapper<DeptTreeProxy> wrapper = queryWrapper.lambda();
        // 追加与 queryPage 相同的业务过滤条件
        wrapper.eq(DeptTreeProxy::getDataStatus, DataStatusEnum.ENABLED);
        String companyCode = PamirsSession.getContext().getCompanyCode();
        wrapper.eq(DeptTreeProxy::getCompanyCode, companyCode);
        return new DeptTreeProxy().queryListByWrapper(wrapper);
    }
}

要点说明:

  • @Function.fun(FunctionConstants.queryPage):将方法注册为代理模型命名空间下的 queryPage 数据管理器函数,覆盖默认实现
  • 树组件内部通过 Models.data().queryPage(pagination, queryWrapper) 调用时,pagination.model 已被设置为节点配置的模型编码,因此会自动路由到代理模型的覆写版本
  • 通过 queryWrapper.lambda() 转为 LambdaQueryWrapper,使用 DeptTreeProxy::getDataStatus 等方法引用指定字段,避免硬编码数据库列名,字段重命名时编译期即可发现错误
  • 方法体内调用 new DeptTreeProxy().queryPage(page, wrapper) 执行实际的数据库查询

步骤 3:配置树形下拉视图 DSL

在表单视图中,将 TreeSelect 字段的 <node> 指向代理模型:

<view model="业务模型编码" type="form" name="xxx_form_view">
  <template slot="form">
    <!-- 树形下拉字段:node 的 model 指向代理模型 -->
    <field data="department" label="部门" widget="TreeSelect" span="1">
      <nodes>
        <node label="activeRecord.name"
              model="demo.DeptTreeProxy"
              selfReferences="parent"
              searchFields="name" />
      </nodes>
    </field>
  </template>
</view>

DSL 关键属性:

属性 说明
model 树节点数据来源模型 —— 指向代理模型,这是隔离生效的关键
selfReferences 自关联字段名(parent),表示该模型通过 M2O 字段 parent 构成树
label 节点显示文本的表达式,activeRecord.name 表示取记录的 name 字段
searchFields 搜索时匹配的字段列表
filter 可选,RSQL 语法的静态过滤条件(简单场景可替代后端覆写)

步骤 4(可选):多级树节点配置

如果树形下拉需要「公司 → 部门」两级结构:

<field data="department" label="部门" widget="TreeSelect" span="1">
  <nodes>
    <!-- 第一级:公司 -->
    <node label="activeRecord.name" model="business.PamirsCompany" />
    <!-- 第二级:部门,通过 company 字段关联上级,parent 构成部门内自关联 -->
    <node label="activeRecord.name"
          model="demo.DeptTreeProxy"
          references="company"
          selfReferences="parent"
          searchFields="name" />
  </nodes>
</field>

四、方案对比

维度 直接覆写原模型 代理模型隔离(推荐) DSL filter 属性
影响范围 全局所有使用该模型查询的场景 仅树组件(指向代理模型的视图) 仅该视图的树节点
灵活性 高(可写任意 Java 逻辑) 高(可写任意 Java 逻辑) 低(仅支持 RSQL 静态条件)
副作用风险
适用场景 确实需要全局修改查询行为 特定页面/组件需要定制数据 简单的静态过滤

五、注意事项

  1. 自关联字段必须在代理模型中重新声明:基类的 parent(M2O)和 childList(O2M)字段的关联目标指向基类模型,代理模型必须用自身类型重新声明这些字段,否则设计器无法识别代理模型内的完整树形关联关系,树形下拉将无法正确展开
  2. queryPage 和 queryListByWrapper 都要覆写:树组件的懒加载走 queryPage,全量加载和搜索走 queryListByWrapper,只覆写一个会导致部分场景过滤失效
  3. 代理模型不建新表ModelTypeEnum.PROXY 类型的模型复用父模型的物理表,无需担心数据同步问题
  4. 使用 LambdaQueryWrapper + 方法引用指定字段:通过 queryWrapper.lambda() 转换后,使用 DeptTreeProxy::getDataStatus 等方法引用指定字段,避免硬编码数据库列名字符串,字段重命名时编译期即可发现错误
  5. 不要在覆写方法中调用 Models.data().queryPage():这会再次路由到函数注册中心,可能形成递归调用;应使用 new XxxProxy().queryPage(page, wrapper) 直接执行
  6. 简单过滤优先考虑 DSL filter:如果过滤条件是静态的(如 dataStatus == ENABLED),直接在 <node filter="..."> 中配置 RSQL 即可,无需写代码

Oinone社区 作者:nation原创文章,如若转载,请注明出处:https://doc.oinone.top/backend/25596.html

访问Oinone官网:https://www.oinone.top获取数式Oinone低代码应用平台体验

Like (1)
nation's avatarnation数式员工
Previous 2026年7月2日 pm4:53
Next 2024年5月23日 am10:04

相关推荐

  • 如何把平台功能菜单加到项目中?

    概述 在使用Oinone低代码平台进行项目开发的过程中,会存在把平台默认提供的菜单加到自己的项目中。这篇文章介绍实现方式,以角色管理为例。 1. 低代码情况 即项目是通过后端代码初始化菜单的方式。 通常在 XXXMenu.java类通过@UxMenu注解的方式,代码片段如下: 此种情况与添加项目本地的菜单无区别,具体代码: @UxMenu(value = "账号管理", icon = "icon-yonghuguanli") class AccountManage { @UxMenu("用户管理") @UxRoute(value = CustomerCompanyUserProxy.MODEL_MODEL, title = "用户管理") class CompanyUserManage { } @UxMenu("角色管理") @UxRoute(value = AuthRole.MODEL_MODEL, module = AdminModule.MODULE_MODULE, title = "角色管理") class RoleManage { } @UxMenu("操作日志") @UxRoute(value = OperationLog.MODEL_MODEL, module = AdminModule.MODULE_MODULE/***菜单所挂载的模块**/) class OperateLog { } } 2. 无代码情况 在界面设计器中,新建菜单–>选择绑定已有页面,进行发布即可。

    2024年4月19日
    2.0K00
  • 使用Mapper方式进行联表查询

    有些业务场景需要查询两张表的数据,这时候就需要用到联表查询。下面将介绍两种方式进行联表查询。 场景:A模型页面,查询条件中包含B模型字段 模型A @Model.model(YesOne.MODEL_MODEL) @Model(displayName = "YesOne", summary = "YesOne") public class YesOne extends IdModel { public static final String MODEL_MODEL = "top.YesOne"; @Field.Integer @Field(displayName = "YesId") private Long yesId; @Field.String @Field(displayName = "名字") private String name; @Field.String @Field(displayName = "科目名字") private String professionalName; @Field(displayName = "关联YesTwo") @Field.many2one @Field.Relation(relationFields = {"yesId"},referenceFields = {"id"}) private YesTwo yesTwo; } 模型B @Model.model(YesTwo.MODEL_MODEL) @Model(displayName = "YesTwo", summary = "YesTwo") public class YesTwo extends IdModel { public static final String MODEL_MODEL = "top.YesTwo"; @Field.Integer @Field(displayName = "科目id") private Long professionalId; @Field.String @Field(displayName = "科目名字") private String professionalName; } 1. 使用in的方式查询 通过B模型的查询条件查询出符合条件的所有数据ID,再根据这个ID去A模型里面查询出所需的数据。 @Function.Advanced(displayName = "查询列表", type = FunctionTypeEnum.QUERY, category = FunctionCategoryEnum.QUERY_PAGE, managed = true) @Function(openLevel = {FunctionOpenEnum.LOCAL, FunctionOpenEnum.REMOTE, FunctionOpenEnum.API}) public Pagination<YesOne> queryPage(Pagination<YesOne> page, IWrapper<YesOne> queryWrapper) { String professionalName = (String) queryWrapper.getQueryData().get("professionalName"); if (StringUtils.isNotBlank(professionalName)) { List<Long> yesTwoId = new YesTwo().queryList(Pops.<YesTwo>lambdaQuery() .from(YesTwo.MODEL_MODEL) .eq(YesTwo::getProfessionalName, professionalName)) .stream().map(YesTwo::getId) .collect(Collectors.toList()); LambdaQueryWrapper<YesOne> wq = Pops.<YesOne>lambdaQuery().from(YesOne.MODEL_MODEL); if (CollectionUtils.isNotEmpty(yesTwoId)) { wq.in(YesOne::getYesId, yesTwoId); } return new YesOne().queryPage(page, wq); } return new YesOne().queryPage(page, queryWrapper); } 2. 使用mapper的方式查询 利用sql的方式去直接查询出结果。使用联表查询的方式查询 @Autowired private YesOneQueryMapper yesOneQueryMapper; @Function.Advanced(displayName = "查询列表", type = FunctionTypeEnum.QUERY, category = FunctionCategoryEnum.QUERY_PAGE, managed = true) @Function(openLevel = {FunctionOpenEnum.LOCAL,…

    2024年9月27日
    1.7K00
  • 【MSSQL】后端部署使用MSSQL数据库(SQLServer)

    MSSQL数据库配置 驱动配置 Maven配置(2017版本可用) <mssql.version>9.4.0.jre8</mssql.version> <dependency> <groupId>com.microsoft.sqlserver</groupId> <artifactId>mssql-jdbc</artifactId> <version>${mssql.version}</version> </dependency> 离线驱动下载 mssql-jdbc-7.4.1.jre8.jarmssql-jdbc-9.4.0.jre8.jarmssql-jdbc-12.2.0.jre8.jar JDBC连接配置 pamirs: datasource: base: type: com.alibaba.druid.pool.DruidDataSource driverClassName: com.microsoft.sqlserver.jdbc.SQLServerDriver url: jdbc:sqlserver://127.0.0.1:1433;DatabaseName=base username: xxxxxx password: xxxxxx initialSize: 5 maxActive: 200 minIdle: 5 maxWait: 60000 timeBetweenEvictionRunsMillis: 60000 testWhileIdle: true testOnBorrow: false testOnReturn: false poolPreparedStatements: true asyncInit: true 连接url配置 暂无官方资料 url格式 jdbc:sqlserver://${host}:${port};DatabaseName=${database} 在jdbc连接配置时,${database}必须配置,不可缺省。 其他连接参数如需配置,可自行查阅相关资料进行调优。 方言配置 pamirs方言配置 pamirs: dialect: ds: base: type: MSSQL version: 2017 major-version: 2017 pamirs: type: MSSQL version: 2017 major-version: 2017 数据库版本 type version majorVersion 2017 MSSQL 2017 2017 PS:由于方言开发环境为2017版本,其他类似版本原则上不会出现太大差异,如出现其他版本无法正常支持的,可在文档下方留言。 schedule方言配置 pamirs: event: enabled: true schedule: enabled: true dialect: type: MSSQL version: 2017 major-version: 2017 type version majorVersion MSSQL 2017 2017 PS:由于schedule的方言在多个版本中并无明显差异,目前仅提供一种方言配置。 其他配置 逻辑删除的值配置 pamirs: mapper: global: table-info: logic-delete-value: CAST(DATEDIFF(S, CAST('1970-01-01 00:00:00' AS DATETIME), GETUTCDATE()) AS BIGINT) * 1000000 + DATEPART(NS, SYSUTCDATETIME()) / 100 MSSQL数据库用户初始化及授权 — init root user (user name can be modified by oneself) CREATE LOGIN [root] WITH PASSWORD = 'password'; — if using mssql database, this authorization is required. ALTER SERVER ROLE [sysadmin] ADD MEMBER [root];

    2024年10月18日
    1.4K00
  • Oinone构建分布式项目一些注意点

    1. Oinone如何支持构建分布式项目 参考文档:https://doc.oinone.top/kai-fa-shi-jian/5572.html 2. Oinone远程服务发布范围 泛化服务范围,可选值:module、namespacemodule:按模块维度发布远程服务namespace:按Fun的namespace维度发布远程服务默认按module维度发布服务 pamirs: distribution: service: #serviceScope: 可选值namespace、module serviceScope: module 3.关闭Dubbo服务注册元数据上报日志 logging: level: root: info pro.shushi.pamirs.framework.connectors.data.mapper.PamirsMapper: error pro.shushi.pamirs.framework.connectors.data.mapper.GenericMapper: error # mybatis sql日志 RocketmqClient: error org.apache.dubbo.registry.zookeeper.ZookeeperRegistry: error org.apache.dubbo.registry.integration.RegistryDirectory: error org.apache.dubbo.config.ServiceConfig: error com.alibaba.nacos.client.naming: error org.apache.dubbo.registry.nacos.NacosRegistry: error org.apache.dubbo.registry.support.AbstractRegistryFactory: error org.apache.dubbo.registry.integration.RegistryProtocol: error org.apache.dubbo.registry.client.metadata.store.RemoteMetadataServiceImpl: off org.apache.dubbo.metadata.store.zookeeper.ZookeeperMetadataReport: off org.apache.dubbo.metadata.store.nacos.NacosMetadataReport: off 4.Naocs配置列表出现多余配置 dubbo 集成 nacos注册中心,会出现多余的配置,详细参考:配置列表会自动创建很多无关的配置: https://github.com/apache/dubbo/issues/6645配置列表出现多余的配置:https://github.com/alibaba/nacos/issues/8843 按照下面的配置可以将其关闭(📢主要是这三项配置use-as-config-center, use-as-metadata-center,metadata-report.failfast),已生成的配置需要手动删除掉。 dubbo: application: name: pamirs-demo version: 1.0.0 metadata-type: local registry: id: pamirs-demo-registry address: nacos://192.168.0.129:8848 username: nacos password: nacos # dubbo使用nacos的注册中心往配置中心写入配置关闭配置 use-as-metadata-center: false use-as-config-center: false config-center: address: nacos://192.168.0.129:8848 username: nacos password: nacos metadata-report: failfast: false # 关闭错误上报的功能 address: nacos://192.168.0.129:8848 username: nacos password: nacos protocol: name: dubbo port: -1 serialization: pamirs scan: base-packages: pro.shushi cloud: subscribed-services:

    2024年2月1日
    2.0K10
  • 【DM】后端部署使用Dameng数据库(达梦)

    达梦数据库配置 驱动配置 达梦数据库的服务端版本和驱动版本需要匹配,建议使用服务端安装时提供的jdbc驱动,不要使用官方maven仓库中的驱动。 报错 表 xx 中不能同时包含聚集 KEY 和大字段,建表的时候就指定非聚集主键。SELECT * FROM V$DM_INI WHERE PARA_NAME = ‘PK_WITH_CLUSTER’;SP_SET_PARA_VALUE(1,’PK_WITH_CLUSTER’,0) Maven配置 DM8(目前maven仓库最新版本) <dm.version>8.1.2.192</dm.version> <dependency> <groupId>com.dameng</groupId> <artifactId>DmJdbcDriver18</artifactId> <version>${dm.version}</version> </dependency> PS: 8.1.3.12版本驱动需要手动上传到nexus仓库使用,本文包含该版本相关内容。 Maven配置 DM7 <dm7.version>7.6.1.120</dm7.version> <dependency> <groupId>com.dameng</groupId> <artifactId>Dm7JdbcDriver18</artifactId> <version>${dm7.version}</version> </dependency> PS: 7.6.1.120版本驱动需要手动上传到nexus仓库使用,本文包含该版本相关内容。 离线驱动下载 Dm7JdbcDriver18-7.6.1.120.jarDmJdbcDriver18-8.1.3.12.jar JDBC连接配置 pamirs: datasource: base: type: com.alibaba.druid.pool.DruidDataSource driverClassName: dm.jdbc.driver.DmDriver # url: jdbc:dm://127.0.0.1:5236/BASE?clobAsString=true&useUnicode=true&characterEncoding=utf8&compatibleMode=mysql url: jdbc:dm://127.0.0.1:5236?schema=BASE&clobAsString=true&columnNameUpperCase=false&useUnicode=true&characterEncoding=utf8&compatibleMode=mysql username: xxxxxx password: xxxxxx initialSize: 5 maxActive: 200 minIdle: 5 maxWait: 60000 timeBetweenEvictionRunsMillis: 60000 testWhileIdle: true testOnBorrow: false testOnReturn: false poolPreparedStatements: true asyncInit: true validConnectionCheckerClassName: com.alibaba.druid.pool.vendor.OracleValidConnectionChecker validationQuery: SELECT 1 FROM DUAL 连接url配置 点击查看官方文档:DM JDBC 编程指南 连接串1 jdbc:dm://127.0.0.1:5236?schema=BASE&clobAsString=true&columnNameUpperCase=false&useUnicode=true&characterEncoding=utf8&compatibleMode=mysql PS:schema参数在低版本驱动区分大小写,高版本驱动不再区分大小写,为了避免错误,统一使用全大写。columnNameUpperCase参数与官方介绍不一致,为了避免错误,需要显式指定。 连接串2 jdbc:dm://127.0.0.1:5236/BASE?clobAsString=true&useUnicode=true&characterEncoding=utf8&compatibleMode=mysql PS:可能是未来更高版本中使用的连接串形式。 达梦数据库在不同驱动版本下需要使用不同的连接串进行处理,具体可参考下表:(使用错误的连接串将无法正常启动) Dm7JdbcDriver18版本 Build-Time 使用的连接串类型 是否支持指定schema schema是否区分大小写 是否可用 不可用原因 7.6.0.165 2019.06.04 1 否 是 否 不支持LocalDateTime类型 7.6.1.120(建议) 2022.09.14 1 是 是 是 – DmJdbcDriver18版本 Build-Time 使用的连接串类型 是否支持指定schema schema是否区分大小写 是否可用 不可用原因 8.1.2.192 2023.01.12 1 是 否 是 – 8.1.3.12(建议) 2023.04.17 2 是 否 是 – 方言配置 pamirs方言配置 pamirs: dialect: ds: base: type: DM version: 8 majorVersion: 8 pamirs: type: DM version: 8 majorVersion: 8 数据库版本 type version majorVersion 7-20220916 DM 7 20220916 8-20230418 DM 8 8 schedule方言配置 pamirs: event: schedule: dialect: type: DM version: 8 majorVersion: 8 type version majorVersion…

    2023年11月1日
    15.3K00

Leave a Reply

Please Login to Comment