【金仓数据库征文】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远程访问必看踩坑点)
- 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
<?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)
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远程连接高频故障排查
- 报错:连接超时/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(远端数据库执行)
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开发环境特有踩坑总结
- 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时少走弯路。