AgentStack
SKILL verified Apache-2.0 Self-run

Anyline Xugudb Adapter

skill-kourou25-xugudb-dev-skills-anyline-xugudb-adapter · by kourou25

AnyLine 动态数据源框架适配虚谷数据库(XuguDB)的完整指南。当用户需要将基于 AnyLine 的 Java 项目配置或适配到虚谷数据库时使用此技能,包括动态数据源注册、切换、元数据操作、DDL/DML 自动生成等。适用于数据中台、低代码平台、异构数据库迁移等场景。

No reviews yet
0 installs
14 views
0.0% view→install

Install

$ agentstack add skill-kourou25-xugudb-dev-skills-anyline-xugudb-adapter

✓ scanned · ✓ verified — works with Claude Code, Cursor, and more.

Security review

✓ Passed

No issues found. Passed automated security review. · v0.1.0 How review works →

  • Prompt-injection patterns
  • Secret / credential exfiltration
  • Dangerous shell & filesystem operations
  • Untrusted network calls
  • Known-malicious package signatures

What it can access

  • Network access No
  • Filesystem access No
  • Shell / process execution No
  • Environment & secrets No
  • Dynamic code execution No

From automated source analysis of v0.1.0. “Used” means the capability is present in the source — more access means more to trust, not that it’s unsafe.

Are you the author of Anyline Xugudb Adapter? Claim this listing to set pricing, connect Stripe payouts, and keep 70% of every sale.
Sign up to claim

About

AnyLine 动态数据源适配虚谷数据库指南

概述

本技能提供 AnyLine 动态数据源框架适配虚谷数据库(XuguDB)的完整配置指南。AnyLine 是一个面向运行时的元数据动态关系映射框架,支持运行时动态注册切换数据源、自动生成 SQL(DDL/DML/DQL)、读写元数据、对比数据库结构差异。

适用场景:

  • 数据中台和数据仓库项目
  • 低代码平台和动态表单系统
  • 异构数据库迁移和同步
  • 多数据源管理和切换
  • 物联网和车联网数据处理
  • 运行时自定义报表和查询条件

核心特性:

  • 运行时动态注册和切换数据源
  • 自动生成 DDL/DML/DQL 语句
  • 读写数据库元数据(表结构、索引、约束等)
  • 跨数据库结构对比和迁移
  • 支持 100+ 种关系型/非关系型数据库
  • 与 Spring Boot、Vert.x、Solon 等框架无缝集成

快速开始

1. 添加依赖

Maven 配置:


    org.anyline
    anyline-core
    8.7.3

    org.anyline
    anyline-data-jdbc
    8.7.3

    com.xugudb
    xugu-jdbc
    12.3.4

    com.alibaba
    druid-spring-boot-starter
    1.2.20

Gradle 配置:

implementation 'org.anyline:anyline-core:8.7.3'
implementation 'org.anyline:anyline-data-jdbc:8.7.3'
implementation 'com.xugudb:xugu-jdbc:12.3.4'
implementation 'com.alibaba:druid-spring-boot-starter:1.2.20'

2. 配置数据源

application.yml 配置:

# AnyLine 数据源配置
anyline:
  # 默认数据源
  datasource:
    type: com.alibaba.druid.pool.DruidDataSource
    driver-class-name: com.xugu.cloudjdbc.Driver
    url: jdbc:xugu://127.0.0.1:5138/SYSTEM?current_schema=PUBLIC&CHAR_SET=UTF8&COMPATIBLE_MODE=MYSQL
    username: SYSDBA
    password: SYSDBA
    
    # Druid 连接池配置
    initial-size: 5
    min-idle: 5
    max-active: 20
    max-wait: 60000
    time-between-eviction-runs-millis: 60000
    min-evictable-idle-time-millis: 300000
    validation-query: SELECT 1
    test-while-idle: true
    test-on-borrow: false
    test-on-return: false
    
    # 监控统计
    filters: stat,wall,log4j
    pool-prepared-statements: true
    max-pool-prepared-statement-per-connection-size: 20
    use-global-data-source-stat: true
    connection-properties: druid.stat.mergeSql=true;druid.stat.slowSqlMillis=5000
  
  # 多数据源列表
  datasource-list: xugu-main, xugu-report
  
  # 数据源1:主数据源
  datasource.xugu-main:
    type: com.alibaba.druid.pool.DruidDataSource
    driver-class-name: com.xugu.cloudjdbc.Driver
    url: jdbc:xugu://127.0.0.1:5138/SYSTEM?current_schema=PUBLIC&CHAR_SET=UTF8&COMPATIBLE_MODE=MYSQL
    username: SYSDBA
    password: SYSDBA
  
  # 数据源2:报表数据源
  datasource.xugu-report:
    type: com.alibaba.druid.pool.DruidDataSource
    driver-class-name: com.xugu.cloudjdbc.Driver
    url: jdbc:xugu://127.0.0.1:5138/REPORT_DB?current_schema=PUBLIC&CHAR_SET=UTF8&COMPATIBLE_MODE=MYSQL
    username: SYSDBA
    password: SYSDBA

3. 动态注册数据源

import org.anyline.data.datasource.DataSourceHolder;
import com.alibaba.druid.pool.DruidDataSource;
import javax.sql.DataSource;

public class DynamicDataSourceConfig {
    
    /**
     * 动态注册虚谷数据库数据源
     */
    public void registerXuguDataSource() {
        // 创建 Druid 数据源
        DruidDataSource dataSource = new DruidDataSource();
        dataSource.setDriverClassName("com.xugu.cloudjdbc.Driver");
        dataSource.setUrl("jdbc:xugu://127.0.0.1:5138/SYSTEM?current_schema=PUBLIC&CHAR_SET=UTF8&COMPATIBLE_MODE=MYSQL");
        dataSource.setUsername("SYSDBA");
        dataSource.setPassword("SYSDBA");
        
        // 连接池配置
        dataSource.setInitialSize(5);
        dataSource.setMinIdle(5);
        dataSource.setMaxActive(20);
        dataSource.setMaxWait(60000);
        dataSource.setTimeBetweenEvictionRunsMillis(60000);
        dataSource.setMinEvictableIdleTimeMillis(300000);
        dataSource.setValidationQuery("SELECT 1");
        dataSource.setTestWhileIdle(true);
        dataSource.setTestOnBorrow(false);
        dataSource.setTestOnReturn(false);
        
        // 注册数据源
        DataSourceHolder.reg("xugu-main", dataSource);
    }
    
    /**
     * 通过连接参数动态注册
     */
    public void registerByParams() {
        DataSourceHolder.reg("xugu-report", 
            "druid",           // 连接池类型
            "com.xugu.cloudjdbc.Driver",  // 驱动类名
            "jdbc:xugu://127.0.0.1:5138/REPORT_DB?current_schema=PUBLIC&CHAR_SET=UTF8&COMPATIBLE_MODE=MYSQL",  // URL
            "SYSDBA",          // 用户名
            "SYSDBA"           // 密码
        );
    }
    
    /**
     * 通过 Map 参数注册
     */
    public void registerByMap() {
        Map params = new HashMap<>();
        params.put("driver", "com.xugu.cloudjdbc.Driver");
        params.put("url", "jdbc:xugu://127.0.0.1:5138/SYSTEM?current_schema=PUBLIC&CHAR_SET=UTF8&COMPATIBLE_MODE=MYSQL");
        params.put("user", "SYSDBA");
        params.put("password", "SYSDBA");
        
        DataSourceHolder.reg("xugu-custom", params);
    }
    
    /**
     * 切换数据源
     */
    public void switchDataSource() {
        // 切换到指定数据源
        DataSourceHolder.switcher("xugu-main");
        
        // 执行业务操作...
        
        // 切换回默认数据源
        DataSourceHolder.switcher("default");
    }
}

核心功能

1. 数据操作(DML)

查询数据:

import org.anyline.data.service.AnylineService;
import org.anyline.data.DataRow;
import org.anyline.data.DataSet;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

@Service
public class UserService {
    
    @Autowired
    private AnylineService service;
    
    /**
     * 查询用户列表
     */
    public DataSet queryUsers(String name, String email) {
        // 切换到主数据源
        DataSourceHolder.switcher("xugu-main");
        
        // 构建查询条件
        // 条件格式: "字段:参数", "字段:[参数]"表示IN查询
        DataSet dataSet = service.queries("SSO_USER", 
            condition(true, "NAME:%name%", "EMAIL:%email%"));
        
        return dataSet;
    }
    
    /**
     * 分页查询
     */
    public DataSet queryUsersWithPage(int page, int size, String name) {
        // 切换到主数据源
        DataSourceHolder.switcher("xugu-main");
        
        // 构建分页配置
        ConfigStore configs = new ConfigStore();
        configs.setPage(page);
        configs.setRows(size);
        
        // 添加查询条件
        if (name != null && !name.isEmpty()) {
            configs.addCondition("NAME", "like", "%" + name + "%");
        }
        
        // 执行查询
        DataSet dataSet = service.select("SSO_USER", configs);
        
        return dataSet;
    }
    
    /**
     * 插入用户
     */
    public int insertUser(String name, String email, String phone) {
        // 切换到主数据源
        DataSourceHolder.switcher("xugu-main");
        
        // 构建数据行
        DataRow row = new DataRow();
        row.put("NAME", name);
        row.put("EMAIL", email);
        row.put("PHONE", phone);
        row.put("CREATE_TIME", new java.util.Date());
        
        // 执行插入
        return service.insert("SSO_USER", row);
    }
    
    /**
     * 更新用户
     */
    public int updateUser(Long id, String name, String email) {
        // 切换到主数据源
        DataSourceHolder.switcher("xugu-main");
        
        // 构建更新数据
        DataRow row = new DataRow();
        row.put("NAME", name);
        row.put("EMAIL", email);
        row.put("UPDATE_TIME", new java.util.Date());
        
        // 构建条件
        Condition condition = new Condition();
        condition.eq("ID", id);
        
        // 执行更新
        return service.update("SSO_USER", row, condition);
    }
    
    /**
     * 删除用户
     */
    public int deleteUser(Long id) {
        // 切换到主数据源
        DataSourceHolder.switcher("xugu-main");
        
        // 构建条件
        Condition condition = new Condition();
        condition.eq("ID", id);
        
        // 执行删除
        return service.delete("SSO_USER", condition);
    }
}

2. 元数据操作

读取表结构:

import org.anyline.data.metadata.Table;
import org.anyline.data.metadata.Column;
import org.anyline.data.metadata.Constraint;
import java.util.LinkedHashMap;
import java.util.List;

public class MetadataService {
    
    @Autowired
    private AnylineService service;
    
    /**
     * 获取表结构信息
     */
    public Table getTableStructure(String tableName) {
        // 切换到主数据源
        DataSourceHolder.switcher("xugu-main");
        
        // 获取表元数据
        Table table = service.metadata().table(tableName);
        
        // 获取所有列
        LinkedHashMap columns = table.getColumns();
        for (Map.Entry entry : columns.entrySet()) {
            Column column = entry.getValue();
            System.out.println("列名: " + column.getName());
            System.out.println("类型: " + column.getType());
            System.out.println("长度: " + column.getLength());
            System.out.println("注释: " + column.getComment());
            System.out.println("是否主键: " + column.isPrimary());
            System.out.println("是否自增: " + column.isAutoIncrement());
            System.out.println("---");
        }
        
        // 获取约束
        LinkedHashMap constraints = table.getConstraints();
        for (Map.Entry entry : constraints.entrySet()) {
            Constraint constraint = entry.getValue();
            System.out.println("约束名: " + constraint.getName());
            System.out.println("类型: " + constraint.getType());
            System.out.println("列: " + constraint.getColumns());
            System.out.println("---");
        }
        
        // 获取建表 DDL
        List ddls = table.getDdls();
        for (String ddl : ddls) {
            System.out.println("DDL: " + ddl);
        }
        
        return table;
    }
    
    /**
     * 获取所有表名
     */
    public List getAllTables() {
        // 切换到主数据源
        DataSourceHolder.switcher("xugu-main");
        
        // 获取所有表
        List tables = service.metadata().tables();
        
        return tables.stream()
                     .map(Table::getName)
                     .collect(Collectors.toList());
    }
}

3. DDL 操作

创建表:

import org.anyline.data.metadata.Table;
import org.anyline.data.metadata.Column;

public class DDLService {
    
    @Autowired
    private AnylineService service;
    
    /**
     * 创建新表
     */
    public void createTable() {
        // 切换到主数据源
        DataSourceHolder.switcher("xugu-main");
        
        // 创建表对象
        Table table = new Table("NEW_TABLE");
        
        // 添加列
        table.addColumn("ID", "BIGINT")
             .autoIncrement(true)
             .setPrimary(true)
             .setComment("主键ID");
        
        table.addColumn("CODE", "VARCHAR(20)")
             .setNotNull(true)
             .setComment("编码");
        
        table.addColumn("NAME", "VARCHAR(100)")
             .setComment("名称");
        
        table.addColumn("DESCRIPTION", "VARCHAR(500)")
             .setComment("描述");
        
        table.addColumn("STATUS", "TINYINT")
             .setDefaultValue("1")
             .setComment("状态:1-启用,0-禁用");
        
        table.addColumn("CREATE_TIME", "TIMESTAMP")
             .setDefaultValue("CURRENT_TIMESTAMP")
             .setComment("创建时间");
        
        table.addColumn("UPDATE_TIME", "TIMESTAMP")
             .setDefaultValue("CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP")
             .setComment("更新时间");
        
        // 设置表注释
        table.setComment("新表");
        
        // 执行创建
        service.ddl().create(table);
    }
    
    /**
     * 修改表结构
     */
    public void alterTable() {
        // 切换到主数据源
        DataSourceHolder.switcher("xugu-main");
        
        // 获取现有表结构
        Table table = service.metadata().table("EXISTING_TABLE");
        
        // 添加新列
        table.addColumn("NEW_COLUMN", "VARCHAR(50)")
             .setComment("新列");
        
        // 修改列
        table.getColumn("EXISTING_COLUMN")
             .setType("VARCHAR(200)")
             .setComment("修改后的列");
        
        // 执行修改
        service.ddl().alter(table);
    }
    
    /**
     * 删除表
     */
    public void dropTable(String tableName) {
        // 切换到主数据源
        DataSourceHolder.switcher("xugu-main");
        
        // 执行删除
        service.ddl().drop(tableName);
    }
    
    /**
     * 智能保存表结构(自动判断差异)
     */
    public void saveTable(Table table) {
        // 切换到主数据源
        DataSourceHolder.switcher("xugu-main");
        
        // 智能保存:自动判断需要 ADD 或 ALTER 的列
        service.ddl().save(table);
    }
}

4. 事务管理

编程式事务:

import org.anyline.data.transaction.TransactionProxy;
import org.anyline.data.transaction.TransactionState;

public class TransactionService {
    
    @Autowired
    private AnylineService service;
    
    /**
     * 编程式事务示例
     */
    public void executeWithTransaction() {
        // 开启事务并指定数据源
        TransactionState state = TransactionProxy.start("xugu-main");
        
        try {
            // 执行业务操作
            DataRow user = new DataRow();
            user.put("NAME", "张三");
            user.put("EMAIL", "zhangsan@example.com");
            service.insert("SSO_USER", user);
            
            // 执行其他操作
            DataRow order = new DataRow();
            order.put("USER_ID", user.get("ID"));
            order.put("PRODUCT_ID", 1001);
            order.put("AMOUNT", 100.00);
            service.insert("ORDERS", order);
            
            // 提交事务
            TransactionProxy.commit(state);
        } catch (Exception e) {
            // 回滚事务
            TransactionProxy.rollback(state);
            throw e;
        }
    }
    
    /**
     * 多数据源事务示例
     */
    public void executeWithMultiDataSourceTransaction() {
        // 开启主数据源事务
        TransactionState mainState = TransactionProxy.start("xugu-main");
        // 开启报表数据源事务
        TransactionState reportState = TransactionProxy.start("xugu-report");
        
        try {
            // 在主数据源执行操作
            DataSourceHolder.switcher("xugu-main");
            DataRow user = new DataRow();
            user.put("NAME", "李四");
            service.insert("SSO_USER", user);
            
            // 在报表数据源执行操作
            DataSourceHolder.switcher("xugu-report");
            DataRow report = new DataRow();
            report.put("USER_ID", user.get("ID"));
            report.put("REPORT_TYPE", "USER_CREATED");
            service.insert("REPORT_LOG", report);
            
            // 提交两个事务
            TransactionProxy.commit(mainState);
            TransactionProxy.commit(reportState);
        } catch (Exception e) {
            // 回滚两个事务
            TransactionProxy.rollback(mainState);
            TransactionProxy.rollback(reportState);
            throw e;
        }
    }
}

Spring Boot 集成

1. 配置类

import org.anyline.data.datasource.DataSourceHolder;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import com.alibaba.druid.pool.DruidDataSource;
import javax.sql.DataSource;

@Configuration
public class AnyLineConfiguration {
    
    /**
     * 主数据源配置
     */
    @Bean
    @ConfigurationProperties(prefix = "anyline.datasource")
    public DataSource primaryDataSource() {
        return new DruidDataSource();
    }
    
    /**
     * 报表数据源配置
     */
    @Bean
    @ConfigurationProperties(prefix = "anyline.datasource.xugu-report")
    public DataSource reportDataSource() {
        return new DruidDataSource();
    }
    
    /**
     * 初始化数据源注册
     */
    @Bean
    public DataSourceInitializer dataSourceInitializer(
            DataSource primaryDataSource,
            DataSource reportDataSource) {
        return new DataSourceInitializer(primaryDataSource, reportDataSource);
    }
}

@Component
public class DataSourceInitializer implements InitializingBean {
    
    private final DataSource primaryDataSource;
    private final DataSource reportDataSource;
    
    public DataSourceInitializer(DataSource primaryDataSource, DataSource reportDataSource) {
        this.primaryDataSource = primaryDataSource;
        this.reportDataSource = reportDataSource;
    }
    
    @Override
    public void afterPropertiesSet() throws Exception {
        // 注册主数据源
        DataSourceHolder.reg("xugu-main", primaryDataSource);
        
        // 注册报表数据源
        DataSourceHolder.reg("xugu-report", reportDataSource);
        
        // 设置默认数据源
        DataSourceHolder.switcher("xugu-main");

…

## Source & license

This open-source skill is cataloged on AgentStack and links to its original source — we do not rehost the code.

- **Author:** [kourou25](https://github.com/kourou25)
- **Source:** [kourou25/xugudb-dev-skills](https://github.com/kourou25/xugudb-dev-skills)
- **License:** Apache-2.0

Install and usage instructions live in the source repository linked above.

Reviews

No reviews yet — be the first.

Versions

  • v0.1.0 Imported from the upstream source.