欢迎光临
我们一直在努力

【金仓数据库征文】Mac开发环境|SpringBoot3 + MyBatisPlus对接KES V9 Docker实战全指南

【金仓数据库征文】Mac开发环境|SpringBoot3 + MyBatisPlus对接KES V9 Docker实战全指南

一、前言

本文实战环境:本地开发主机 Mac mini(MacOS 15.7.4 x86_64),Java17;金仓数据库 KingbaseES V9(V009R001C010B0004) 通过Docker部署在远端CentOS服务器。项目基于SpringBoot 3.3.2 + MyBatis-Plus 3.5.7搭建完整Demo,完整覆盖:远程Docker KES连接配置、金仓V9官方驱动适配、SpringBoot3适配踩坑、MyBatisPlus方言配置、Druid连接池调优、CRUD开发、KES存储过程/触发器调用,同时记录Mac开发侧、容器化部署场景下遇到的真实问题与最佳实践,贴合本次大赛开发实战征稿方向。

完整环境清单

环境组件版本与部署信息
本地开发主机 Mac mini MacOS 15.7.4(x86_64)
JDK OpenJDK 17.0.18(Microsoft LTS)
Maven 3.9.14
SpringBoot 3.3.2
MyBatis-Plus 3.5.7
数据库 KingbaseES V009R001C010B0004(KES V9)
KES部署方式 Docker镜像部署在远端CentOS服务器 KingbaseES_V009R001C010B0004_x86_64_Docker.tar
连接池 Druid SpringBoot Starter(适配SpringBoot3版本)

重点说明:SpringBoot3最低要求Java17,同时KES V9驱动包和旧V8驱动包包名存在差异;远端Docker部署会额外涉及端口放行、容器网络、访问权限等问题,MacOS客户端访问Linux容器数据库有专属调试难点,本文全部基于这套真实环境落地验证。

二、远端CentOS:KES V9 Docker部署与容器开放配置

2.1 Docker镜像导入与启动命令

上传镜像包 KingbaseES_V009R001C010B0004_x86_64_Docker.tar 到CentOS服务器

# 导入镜像
docker load -i KingbaseES_V009R001C010B0004_x86_64_Docker.tar

# 启动KES V9容器
docker run -d \\
–name kingbase \\
-p 54321:54321 \\
-e DB_USER=system \\
-e DB_PASSWORD=Kingbase@123 \\
-e DB_NAME=testdb \\
-v /data/kes_data:/var/lib/kingbase \\
kingbasees:v9r1

在这里插入图片描述

关键注意事项(Mac远程访问必看踩坑点)

  • CentOS服务器防火墙放行54321端口,安全组开放入站规则,否则Mac本地无法建立连接;
  • KES默认配置仅允许本地访问,需要修改 pg_hba.conf 新增客户端网段信任,允许Mac主机IP远程连接;
  • Docker端口映射必须使用54321:54321,KES默认端口54321,不要随意修改宿主机端口造成混淆。 在这里插入图片描述
  • 三、Maven依赖(SpringBoot3 + KES V9驱动完整pom.xml)

    ⚠️ 重大区别:KES V9 JDBC驱动包仍然groupId=com.kingbase8,类名com.kingbase8.Driver,向下兼容;SpringBoot3不再支持javax包,全部使用jakarta规范,依赖版本需要匹配。

    <?xml version="1.0" encoding="UTF-8"?>
    <project xmlns="http://maven.apache.org/POM/4.0.0"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">

    <modelVersion>4.0.0</modelVersion>

    <parent>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-parent</artifactId>
    <version>3.3.2</version>
    <relativePath/>
    </parent>

    <groupId>com.kes.v9.demo</groupId>
    <artifactId>kes-v9-springboot3-demo</artifactId>
    <version>1.0.0</version>
    <name>KES V9 + SpringBoot3 + MyBatisPlus Demo(Mac开发环境)</name>

    <properties>
    <java.version>17</java.version>
    <mybatis-plus.version>3.5.7</mybatis-plus.version>
    <!– KES V9 JDBC驱动版本 –>
    <kingbase.jdbc.version>9.1.0</kingbase.jdbc.version>
    <druid.version>1.2.24</druid.version>
    </properties>

    <dependencies>
    <dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-web</artifactId>
    </dependency>

    <!– KINGBASE V9 官方JDBC驱动 –>
    <dependency>
    <groupId>com.kingbase8</groupId>
    <artifactId>kingbase8</artifactId>
    <version>${kingbase.jdbc.version}</version>
    <scope>runtime</scope>
    </dependency>

    <!– MyBatis-Plus 适配SpringBoot3 –>
    <dependency>
    <groupId>com.baomidou</groupId>
    <artifactId>mybatis-plus-boot-starter</artifactId>
    <version>${mybatis-plus.version}</version>
    </dependency>

    <!– Druid连接池(支持SpringBoot3) –>
    <dependency>
    <groupId>com.alibaba</groupId>
    <artifactId>druid-spring-boot-3-starter</artifactId>
    <version>${druid.version}</version>
    </dependency>

    <dependency>
    <groupId>org.projectlombok</groupId>
    <artifactId>lombok</artifactId>
    <optional>true</optional>
    </dependency>

    <dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-test</artifactId>
    <scope>test</scope>
    </dependency>
    </dependencies>

    <build>
    <plugins>
    <plugin>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-maven-plugin</artifactId>
    <configuration>
    <excludes>
    <exclude>
    <groupId>org.projectlombok</groupId>
    <artifactId>lombok</artifactId>
    </exclude>
    </excludes>
    </configuration>
    </plugin>
    </plugins>
    </build>
    </project>

    Mac开发环境依赖常见问题

  • 内网仓库缺少kingbase8驱动:前往KES安装包lib目录取出kingbase8-9.1.0.jar,Mac本地执行maven命令手动安装;
  • SpringBoot3禁止旧版druid druid-spring-boot-starter,必须引入 druid-spring-boot-3-starter,否则启动报错。
  • 四、application.yml 完整配置(Mac本地连接远端Docker KES)

    server:
    port: 8080
    spring:
    datasource:
    type: com.alibaba.druid.pool.DruidDataSource
    driver-class-name: com.kingbase8.Driver
    # 【重点】url填写远端CentOS服务器公网IP
    url: jdbc:kingbase8://服务器IP:54321/testdb?currentSchema=public&useSSL=false&rewriteBatchedStatements=true
    username: system
    password: Kingbase@123
    druid:
    initial-size: 3
    min-idle: 3
    max-active: 20
    max-wait: 8000
    # KES 连接检测SQL,不能使用MySQL SELECT 1 FROM DUAL
    validation-query: SELECT 1
    test-while-idle: true
    test-on-borrow: false
    test-on-return: false
    time-between-eviction-runs-millis: 60000

    # MyBatisPlus配置
    mybatis-plus:
    mapper-locations: classpath:mapper/*.xml
    type-aliases-package: com.kes.v9.demo.entity
    configuration:
    map-underscore-to-camel-case: true
    log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
    global-config:
    db-config:
    id-type: auto
    table-underline: true
    # KES V9内核兼容PostgreSQL,方言指定postgresql
    db-type: postgresql

    Mac远程连接高频故障排查

  • 报错:连接超时/Connection refused 排查顺序:CentOS防火墙→云服务器安全组→KES pg_hba.conf允许外部IP访问→容器端口映射;
  • 报错:password authentication failed 确认账号密码,KES区分大小写,Docker启动设置的DB_PASSWORD不要写错;
  • schema找不到表 URL增加currentSchema=public,或者登录客户端手动设置search_path。
  • 五、项目核心代码实战

    5.1 KES V9 建表SQL(远端数据库执行)

    CREATE TABLE user_info (
    id SERIAL PRIMARY KEY,
    user_name VARCHAR(50) NOT NULL,
    age INT4,
    email VARCHAR(100),
    create_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP
    );

    5.2 实体类 UserInfo.java

    package com.kes.v9.demo.entity;

    import com.baomidou.mybatisplus.annotation.IdType;
    import com.baomidou.mybatisplus.annotation.TableId;
    import com.baomidou.mybatisplus.annotation.TableName;
    import lombok.Data;
    import java.time.LocalDateTime;

    @Data
    @TableName("user_info")
    public class UserInfo {
    @TableId(type = IdType.AUTO)
    private Integer id;
    private String userName;
    private Integer age;
    private String email;
    private LocalDateTime createTime;
    }

    5.3 Mapper

    package com.kes.v9.demo.mapper;

    import com.baomidou.mybatisplus.core.mapper.BaseMapper;
    import com.kes.v9.demo.entity.UserInfo;
    import org.apache.ibatis.annotations.Mapper;

    @Mapper
    public interface UserInfoMapper extends BaseMapper<UserInfo> {
    }

    5.4 Service层

    package com.kes.v9.demo.service;

    import com.baomidou.mybatisplus.extension.service.IService;
    import com.kes.v9.demo.entity.UserInfo;

    public interface IUserInfoService extends IService<UserInfo> {
    }

    package com.kes.v9.demo.service.impl;

    import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
    import com.kes.v9.demo.entity.UserInfo;
    import com.kes.v9.demo.mapper.UserInfoMapper;
    import com.kes.v9.demo.service.IUserInfoService;
    import org.springframework.stereotype.Service;

    @Service
    public class UserInfoServiceImpl extends ServiceImpl<UserInfoMapper, UserInfo> implements IUserInfoService {
    }

    5.5 MyBatisPlus分页插件配置(SpringBoot3专用)

    package com.kes.v9.demo.config;

    import com.baomidou.mybatisplus.annotation.DbType;
    import com.baomidou.mybatisplus.extension.plugins.MybatisPlusInterceptor;
    import com.baomidou.mybatisplus.extension.plugins.inner.PaginationInnerInterceptor;
    import org.springframework.context.annotation.Bean;
    import org.springframework.context.annotation.Configuration;

    @Configuration
    public class MybatisPlusConfig {

    @Bean
    public MybatisPlusInterceptor mybatisPlusInterceptor() {
    MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();
    // KES V9 使用PostgreSQL分页方言,自动生成 LIMIT … OFFSET
    interceptor.addInnerInterceptor(new PaginationInnerInterceptor(DbType.POSTGRE_SQL));
    return interceptor;
    }
    }

    5.6 Controller 测试接口

    package com.kes.v9.demo.controller;

    import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
    import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
    import com.kes.v9.demo.entity.UserInfo;
    import com.kes.v9.demo.service.IUserInfoService;
    import org.springframework.web.bind.annotation.*;
    import jakarta.annotation.Resource;
    import java.util.List;

    @RestController
    @RequestMapping("/user")
    public class UserController {

    @Resource
    private IUserInfoService userInfoService;

    // 分页查询
    @GetMapping("/page")
    public Page<UserInfo> pageQuery(@RequestParam(defaultValue = "1") Integer pageNum,
    @RequestParam(defaultValue = "5") Integer pageSize){
    Page<UserInfo> page = new Page<>(pageNum, pageSize);
    LambdaQueryWrapper<UserInfo> wrapper = new LambdaQueryWrapper<>();
    wrapper.like(UserInfo::getUserName,"张");
    return userInfoService.page(page,wrapper);
    }

    // 新增用户
    @PostMapping("/add")
    public boolean addUser(@RequestBody UserInfo userInfo){
    return userInfoService.save(userInfo);
    }

    @GetMapping("/list")
    public List<UserInfo> listAll(){
    return userInfoService.list();
    }
    }

    在这里插入图片描述 在这里插入图片描述

    六、KES V9 函数、触发器实战(可直接在容器内执行)

    6.1 自定义函数

    CREATE OR REPLACE FUNCTION get_age_level(age INT4)
    RETURNS VARCHAR AS $$
    BEGIN
    IF age < 18 THEN RETURN '少年';
    ELSIF age BETWEEN 18 AND 35 THEN RETURN '青年';
    ELSE RETURN '中年及以上';
    END IF;
    END;
    $$ LANGUAGE plpgsql;

    6.2 触发器示例

    CREATE TABLE user_opt_log(
    id SERIAL PRIMARY KEY,
    user_id INT4,
    opt_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
    opt_type VARCHAR(20)
    );

    CREATE OR REPLACE FUNCTION user_insert_trigger_func()
    RETURNS TRIGGER AS $$
    BEGIN
    INSERT INTO user_opt_log(user_id,opt_type) VALUES(NEW.id,'新增');
    RETURN NEW;
    END;
    $$ LANGUAGE plpgsql;

    CREATE TRIGGER after_user_insert
    AFTER INSERT ON user_info
    FOR EACH ROW EXECUTE FUNCTION user_insert_trigger_func();

    七、Mac mini开发环境特有踩坑总结

  • JDK17模块访问限制:Java17强封装,极少数场景连接数据库会触发反射警告,可在启动参数添加–add-opens java.base/java.net=ALL-UNNAMED规避;
  • MacOS网络差异:公司内网、VPN环境容易导致访问远端CentOS服务器54321端口不稳定,开发调试建议优先关闭代理;
  • Maven仓库缓存:Mac本地maven旧依赖缓存容易引发冲突,切换SpringBoot3版本前建议执行mvn clean清理;
  • Docker部署KES注意存储持久化:生产环境必须挂载数据卷,容器删除避免数据丢失。
  • 八、参赛选题思路、技术收获与参赛感想

    8.1 选题思路

    当前国产化改造项目中大量采用:本地Mac开发、服务部署Linux、数据库Docker容器化这套工作流;同时大量新项目直接选用SpringBoot3 + Java17技术栈。网上绝大多数KES开发教程仍然停留在SpringBoot2 + JDK8 + KES V8版本,缺少适配KES V9、SpringBoot3、Mac客户端远程连接Docker数据库完整实战案例。

    因此我选择这个实战方向:基于个人真实开发环境Mac mini,打通远端CentOS Docker部署的KingbaseES V9,使用SpringBoot3.3.2 + MyBatisPlus3.5.7完整Demo落地,把客户端远程访问、驱动适配、连接池、ORM框架适配、容器网络问题全部记录下来,给同行提供一套可以直接复刻的完整开发参考方案。

    8.2 技术收获

  • 理清KES V9与V8驱动兼容关系,确认V9依然沿用com.kingbase8.Driver驱动类,降低版本升级成本;
  • 掌握SpringBoot3(Jakarta)环境下金仓数据库整套适配方案,区分新旧版本Druid连接池依赖;
  • 熟悉容器化部署KES场景下,外部开发主机远程访问的网络、权限全套配置;
  • 理解MyBatisPlus针对兼容PG内核的国产数据库分页、主键策略最佳配置;
  • 在MacOS开发环境下积累了Java17对接国产数据库的调试经验。
  • 8.3 参赛感想

    以往学习金仓数据库资料大多是基于Linux服务器本地开发,很少有从Mac客户端远程连接容器化KES的实战分享。本次从零搭建完整环境,从导入Docker镜像、开放服务器端口、调试Mac远程连接,再搭建SpringBoot3项目、逐个解决依赖、方言、分页各类问题,完整走完一套国产数据库Java现代化技术栈开发流程。

    在适配过程中遇到网络连通、驱动版本、框架升级带来的各类报错,逐一查阅官方文档调试解决,让我不再简单把“数据库替换”理解成仅仅修改连接字符串。国产数据库落地,需要同时兼顾服务器部署、客户端开发环境、业务框架版本、网络架构多维度适配。希望本篇实战文章能够帮助同样使用Mac做开发、使用SpringBoot3技术栈的开发者,在对接KingbaseES V9时少走弯路。

    九、代码仓库

    gitcode–>https://gitcode.com/zhuyh/kes_demo

    赞(0)
    未经允许不得转载:171主机测评 » 【金仓数据库征文】Mac开发环境|SpringBoot3 + MyBatisPlus对接KES V9 Docker实战全指南
    分享到: 更多 (0)

    评论 抢沙发

    • 昵称 (必填)
    • 邮箱 (必填)
    • 网址