一个真实的故事
去年接手一个项目,团队用spring boot + mysql开发了一套内部管理系统,眼看要上线了,客户突然提出要换成国产数据库。
开发负责人当场就懵了:“代码要不要大改?驱动支不支持?事务会不会出问题?”
我当时正好在做金仓数据库的技术调研,就主动接了这个任务。结果从修改配置到跑通测试,前后不到一个小时。今天就把这次实战经验整理出来,给遇到同样需求的团队做个参考。
一、准备工作:连接信息从哪里拿
在开始写代码之前,先要拿到金仓数据库的连接信息。如果你不是dba,可以找运维或dba要以下信息:
# 典型连接命令示例 ./ksql -u system -d test -h 192.168.1.100 -p 54321
参数说明:
-u system:用户名,管理员默认是system-d test:要连接的数据库名-h 192.168.1.100:数据库服务器ip-p 54321:端口号,默认是54321
拿到这些信息后,整理成jdbc url格式:
jdbc:kingbase8://host:port/database
比如:
jdbc:kingbase8://192.168.1.100:54321/test
二、项目搭建:从零开始
2.1 创建spring boot项目
用idea新建spring boot项目,或者用spring initializr生成。我习惯用idea直接创建,方便管理。
项目结构如下:
java-kingbase-springboot/ ├── pom.xml ├── src/ │ ├── main/ │ │ ├── java/com/kingbase/testspringboot/ │ │ │ ├── testspringbootapplication.java │ │ │ ├── dao/ │ │ │ │ ├── userdao.java │ │ │ │ └── impl/userdaoimpl.java │ │ │ └── entity/user.java │ │ └── resources/application.properties │ └── test/java/com/kingbase/testspringboot/ │ └── testspringbootapplicationtests.java └── target/
2.2 配置pom.xml:依赖是重点
pom.xml中最关键的是金仓数据库驱动的依赖:
<dependency>
<groupid>cn.com.kingbase</groupid>
<artifactid>kingbase8</artifactid>
<version>9.0.0</version>
</dependency>完整的pom.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
https://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>2.7.11</version>
<relativepath/>
</parent>
<groupid>com.kingbase</groupid>
<artifactid>java-kingbase-springboot</artifactid>
<version>0.0.1-snapshot</version>
<name>java-kingbase-springboot</name>
<description>spring boot连接金仓数据库示例</description>
<properties>
<java.version>1.8</java.version>
</properties>
<dependencies>
<!-- spring boot核心依赖 -->
<dependency>
<groupid>org.springframework.boot</groupid>
<artifactid>spring-boot-starter</artifactid>
</dependency>
<!-- spring boot jdbc支持 -->
<dependency>
<groupid>org.springframework.boot</groupid>
<artifactid>spring-boot-starter-jdbc</artifactid>
</dependency>
<!-- 金仓数据库驱动,最关键的一步 -->
<dependency>
<groupid>cn.com.kingbase</groupid>
<artifactid>kingbase8</artifactid>
<version>9.0.0</version>
</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>
</plugin>
</plugins>
</build>
</project>踩坑提醒:金仓驱动groupid是cn.com.kingbase,不是com.kingbase8,写错了会拉不到依赖。
2.3 配置文件application.properties
在src/main/resources/application.properties中配置数据源:
# 金仓数据库驱动 spring.datasource.driverclassname=com.kingbase8.driver # 连接url:jdbc:kingbase8://ip:端口/数据库名 spring.datasource.url=jdbc:kingbase8://localhost:54321/test # 用户名和密码 spring.datasource.username=system spring.datasource.password=你的密码
三、代码实现:三层结构
3.1 实体类:user.java
package com.kingbase.testspringboot.entity;
public class user {
private long id;
private string name;
// 无参构造方法(必须)
public user() {
}
// 带参构造方法
public user(long id, string name) {
this.id = id;
this.name = name;
}
// getter和setter
public long getid() {
return id;
}
public void setid(long id) {
this.id = id;
}
public string getname() {
return name;
}
public void setname(string name) {
this.name = name;
}
@override
public string tostring() {
return "user{id=" + id + ", name='" + name + "'}";
}
}3.2 dao接口:userdao.java
package com.kingbase.testspringboot.dao;
import com.kingbase.testspringboot.entity.user;
import java.util.list;
public interface userdao {
// 插入用户
boolean insertuser(user user);
// 根据id删除
boolean deletebyid(long id);
// 更新用户
boolean updateuser(user user);
// 根据id查询
user selectuserbyid(long id);
// 查询所有用户
list<user> selectallusers();
}3.3 dao实现:userdaoimpl.java
package com.kingbase.testspringboot.dao.impl;
import com.kingbase.testspringboot.dao.userdao;
import com.kingbase.testspringboot.entity.user;
import org.springframework.beans.factory.annotation.autowired;
import org.springframework.jdbc.core.beanpropertyrowmapper;
import org.springframework.jdbc.core.jdbctemplate;
import org.springframework.stereotype.repository;
import java.util.list;
@repository("userdao")
public class userdaoimpl implements userdao {
@autowired
private jdbctemplate jdbctemplate;
@override
public boolean insertuser(user user) {
string sql = "insert into test_springboot(id, name) values(?, ?)";
object[] params = {user.getid(), user.getname()};
return jdbctemplate.update(sql, params) > 0;
}
@override
public boolean deletebyid(long id) {
string sql = "delete from test_springboot where id = ?";
object[] params = {id};
return jdbctemplate.update(sql, params) > 0;
}
@override
public boolean updateuser(user user) {
string sql = "update test_springboot set name = ? where id = ?";
object[] params = {user.getname(), user.getid()};
return jdbctemplate.update(sql, params) > 0;
}
@override
public user selectuserbyid(long id) {
string sql = "select * from test_springboot where id = ?";
object[] params = {id};
return jdbctemplate.queryforobject(
sql,
params,
new beanpropertyrowmapper<>(user.class)
);
}
@override
public list<user> selectallusers() {
string sql = "select * from test_springboot";
return jdbctemplate.query(sql, new beanpropertyrowmapper<>(user.class));
}
}
注意点:beanpropertyrowmapper要求数据库字段名和java属性名保持一致,或者用下划线转驼峰的映射规则。这里表字段是id和name,和user类的属性名一致,所以能自动映射。
3.4 启动类:testspringbootapplication.java
package com.kingbase.testspringboot;
import org.springframework.boot.springapplication;
import org.springframework.boot.autoconfigure.springbootapplication;
@springbootapplication
public class testspringbootapplication {
public static void main(string[] args) {
springapplication.run(testspringbootapplication.class, args);
}
}
四、测试验证:跑通整个流程
4.1 测试类:testspringbootapplicationtests.java
package com.kingbase.testspringboot;
import com.kingbase.testspringboot.dao.userdao;
import com.kingbase.testspringboot.entity.user;
import org.junit.jupiter.api.test;
import org.springframework.beans.factory.annotation.autowired;
import org.springframework.boot.test.context.springboottest;
import org.springframework.jdbc.core.jdbctemplate;
import java.util.list;
@springboottest
public class testspringbootapplicationtests {
@autowired
private userdao userdao;
@autowired
private jdbctemplate jdbctemplate;
@test
public void contextloads() {
// 1. 删除旧表(如果存在)
try {
jdbctemplate.execute("drop table test_springboot");
system.out.println("test_springboot delete successfully!");
} catch (exception ignore) {
// 表不存在时忽略异常
}
// 2. 创建新表
jdbctemplate.execute("create table test_springboot (" +
"id int primary key, " +
"name varchar(50))");
system.out.println("test_springboot create successfully!");
// 3. 插入10条数据
for (int i = 1; i <= 10; i++) {
userdao.insertuser(new user((long) i, "insert" + i));
}
// 4. 删除id=1的数据
userdao.deletebyid(1l);
// 5. 更新id=2的数据
userdao.updateuser(new user(2l, "update"));
// 6. 查询id=2的数据
user user = userdao.selectuserbyid(2l);
system.out.println("user = " + user);
// 7. 查询所有数据
list<user> userlist = userdao.selectallusers();
userlist.foreach(system.out::println);
}
}
4.2 运行结果
test_springboot delete successfully!
test_springboot create successfully!
user = user{id=2, name='update'}
user{id=2, name='update'}
user{id=3, name='insert3'}
user{id=4, name='insert4'}
user{id=5, name='insert5'}
user{id=6, name='insert6'}
user{id=7, name='insert7'}
user{id=8, name='insert8'}
user{id=9, name='insert9'}
user{id=10, name='insert10'}
从输出可以看到:
- 建表、删表成功
- 插入10条数据成功
- 删除id=1成功
- 更新id=2成功
- 查询结果正确
五、常见问题与解决方案
5.1 驱动类找不到
报错:java.lang.classnotfoundexception: com.kingbase8.driver
原因:pom.xml中没有正确引入金仓驱动,或者scope设置不当
解决:检查pom.xml中是否有kingbase8依赖,确保没有设置scope=test
5.2 连接被拒绝
报错:connection refused
原因:ip、端口、数据库名填错了,或者金仓服务没启动
解决:
- 先用
ksql命令行测试能否连接 - 检查防火墙是否开放了端口
- 确认数据库名是否正确(区分大小写)
5.3 表名或字段名大小写问题
金仓默认是大小写不敏感的,但如果建表时用了双引号,就会变成大小写敏感。建议统一用小写,避免麻烦。
-- 推荐写法
create table test_springboot (id int, name varchar(50));
-- 避免这种写法,会带来困扰
create table "test_springboot" ("id" int, "name" varchar(50));六、生产环境建议
示例代码跑通后,在实际项目中还需要注意几点:
1. 使用连接池
spring boot默认使用hikaricp,配置如下:
spring.datasource.hikari.maximum-pool-size=20 spring.datasource.hikari.minimum-idle=5 spring.datasource.hikari.connection-timeout=30000
2. 密码不要硬编码
# 使用环境变量
spring.datasource.password=${kingbase_password}
# 或使用配置中心3. 事务管理
在service层使用@transactional注解:
@service
public class userservice {
@autowired
private userdao userdao;
@transactional
public void updateuserwithlog(user user, string log) {
userdao.updateuser(user);
// 记录日志等其他操作
}
}写在最后
从mysql切换到金仓,spring boot项目需要改动的其实就两处:pom.xml加驱动、application.properties改url。如果代码里没有用数据库特有的方言,基本能做到零修改迁移。
这次实战经历也让我对金仓的jdbc驱动有了更多信心——兼容性不错,性能也稳定。如果你的团队正在做技术选型或国产化改造,不妨动手试试。
以上就是springboot快速接入金仓数据库的完整步骤的详细内容,更多关于springboot接入金仓数据库的资料请关注代码网其它相关文章!
发表评论