【金仓数据库征文】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服务器

bash 复制代码
# 导入镜像
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远程访问必看踩坑点)

  1. CentOS服务器防火墙放行54321端口,安全组开放入站规则,否则Mac本地无法建立连接;
  2. KES默认配置仅允许本地访问,需要修改 pg_hba.conf 新增客户端网段信任,允许Mac主机IP远程连接;
  3. Docker端口映射必须使用54321:54321,KES默认端口54321,不要随意修改宿主机端口造成混淆。

三、Maven依赖(SpringBoot3 + KES V9驱动完整pom.xml)

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

xml 复制代码
<?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开发环境依赖常见问题

  1. 内网仓库缺少kingbase8驱动:前往KES安装包lib目录取出kingbase8-9.1.0.jar,Mac本地执行maven命令手动安装;
  2. SpringBoot3禁止旧版druid druid-spring-boot-starter,必须引入 druid-spring-boot-3-starter,否则启动报错。

四、application.yml 完整配置(Mac本地连接远端Docker KES)

yaml 复制代码
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远程连接高频故障排查

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

五、项目核心代码实战

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

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

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

java 复制代码
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层

java 复制代码
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> {
}
java 复制代码
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专用)

java 复制代码
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 测试接口

java 复制代码
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 自定义函数

sql 复制代码
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 触发器示例

sql 复制代码
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开发环境特有踩坑总结

  1. JDK17模块访问限制 :Java17强封装,极少数场景连接数据库会触发反射警告,可在启动参数添加--add-opens java.base/java.net=ALL-UNNAMED规避;
  2. MacOS网络差异:公司内网、VPN环境容易导致访问远端CentOS服务器54321端口不稳定,开发调试建议优先关闭代理;
  3. Maven仓库缓存 :Mac本地maven旧依赖缓存容易引发冲突,切换SpringBoot3版本前建议执行mvn clean清理;
  4. 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 技术收获

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

8.3 参赛感想

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

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

九、代码仓库

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

相关推荐
杨云龙UP1 小时前
MySQL 数据库常用备份工具对比:mysqldump、mydumper 与 XtraBackup
linux·运维·服务器·数据库·mysql·dba·备份恢复
ZENERGY-众壹1 小时前
500个工商业电站压垮数据库?海量光伏时序数据存储的架构取舍
数据库·架构·influxdb·光伏·光伏运维
PC2005-cloud2 小时前
从零上手 openGauss:Docker 部署 + 全场景连接教程
运维·docker·容器
mubei-1232 小时前
SpringDAO的用法
java·开发语言·数据库
AlfredZhao5 小时前
Docker 查看容器日志:别只记 `docker logs -f`
docker
星蓝_starblue5 小时前
零服务器、零数据库!开源growth-board,利用GitHub自动管理刷题/学习/求职全流程
服务器·数据库·程序人生·系统架构·node.js·github·改行学it
三8447 小时前
sqli-labs1-10通关笔记
数据库
初级炼丹师(爱说实话版)8 小时前
Ubuntu服务器配置docker
服务器·ubuntu·docker
BullSmall8 小时前
Another Redis Desktop Manager(ARDM)下载指南
数据库·redis·缓存