SpringBoot快速接入金倉數(shù)據(jù)庫的完整步驟
一個真實的故事
去年接手一個項目,團隊用Spring Boot + MySQL開發(fā)了一套內(nèi)部管理系統(tǒng),眼看要上線了,客戶突然提出要換成國產(chǎn)數(shù)據(jù)庫。
開發(fā)負責人當場就懵了:“代碼要不要大改?驅(qū)動支不支持?事務(wù)會不會出問題?”
我當時正好在做金倉數(shù)據(jù)庫的技術(shù)調(diào)研,就主動接了這個任務(wù)。結(jié)果從修改配置到跑通測試,前后不到一個小時。今天就把這次實戰(zhàn)經(jīng)驗整理出來,給遇到同樣需求的團隊做個參考。
一、準備工作:連接信息從哪里拿
在開始寫代碼之前,先要拿到金倉數(shù)據(jù)庫的連接信息。如果你不是DBA,可以找運維或DBA要以下信息:
# 典型連接命令示例 ./ksql -U system -d test -h 192.168.1.100 -p 54321
參數(shù)說明:
-U system:用戶名,管理員默認是system-d test:要連接的數(shù)據(jù)庫名-h 192.168.1.100:數(shù)據(jù)庫服務(wù)器IP-p 54321:端口號,默認是54321
拿到這些信息后,整理成JDBC URL格式:
jdbc:kingbase8://host:port/database
比如:
jdbc:kingbase8://192.168.1.100:54321/test
二、項目搭建:從零開始
2.1 創(chuàng)建Spring Boot項目
用IDEA新建Spring Boot項目,或者用Spring Initializr生成。我習慣用IDEA直接創(chuàng)建,方便管理。
項目結(jié)構(gòu)如下:
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中最關(guān)鍵的是金倉數(shù)據(jù)庫驅(qū)動的依賴:
<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連接金倉數(shù)據(jù)庫示例</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>
<!-- 金倉數(shù)據(jù)庫驅(qū)動,最關(guān)鍵的一步 -->
<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>踩坑提醒:金倉驅(qū)動groupId是cn.com.kingbase,不是com.kingbase8,寫錯了會拉不到依賴。
2.3 配置文件application.properties
在src/main/resources/application.properties中配置數(shù)據(jù)源:
# 金倉數(shù)據(jù)庫驅(qū)動 spring.datasource.driverClassName=com.kingbase8.Driver # 連接URL:jdbc:kingbase8://IP:端口/數(shù)據(jù)庫名 spring.datasource.url=jdbc:kingbase8://localhost:54321/test # 用戶名和密碼 spring.datasource.username=system spring.datasource.password=你的密碼
三、代碼實現(xiàn):三層結(jié)構(gòu)
3.1 實體類:User.java
package com.kingbase.testspringboot.entity;
public class User {
private Long id;
private String name;
// 無參構(gòu)造方法(必須)
public User() {
}
// 帶參構(gòu)造方法
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);
// 根據(jù)ID刪除
boolean deleteById(Long id);
// 更新用戶
boolean updateUser(User user);
// 根據(jù)ID查詢
User selectUserById(Long id);
// 查詢所有用戶
List<User> selectAllUsers();
}3.3 DAO實現(xiàn):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要求數(shù)據(jù)庫字段名和Java屬性名保持一致,或者用下劃線轉(zhuǎn)駝峰的映射規(guī)則。這里表字段是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. 創(chuàng)建新表
jdbcTemplate.execute("create table test_springboot (" +
"id int primary key, " +
"name varchar(50))");
System.out.println("test_springboot create successfully!");
// 3. 插入10條數(shù)據(jù)
for (int i = 1; i <= 10; i++) {
userDao.insertUser(new User((long) i, "insert" + i));
}
// 4. 刪除id=1的數(shù)據(jù)
userDao.deleteById(1L);
// 5. 更新id=2的數(shù)據(jù)
userDao.updateUser(new User(2L, "update"));
// 6. 查詢id=2的數(shù)據(jù)
User user = userDao.selectUserById(2L);
System.out.println("user = " + user);
// 7. 查詢所有數(shù)據(jù)
List<User> userList = userDao.selectAllUsers();
userList.forEach(System.out::println);
}
}
4.2 運行結(jié)果
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條數(shù)據(jù)成功
- 刪除id=1成功
- 更新id=2成功
- 查詢結(jié)果正確
五、常見問題與解決方案
5.1 驅(qū)動類找不到
報錯:java.lang.ClassNotFoundException: com.kingbase8.Driver
原因:pom.xml中沒有正確引入金倉驅(qū)動,或者scope設(shè)置不當
解決:檢查pom.xml中是否有kingbase8依賴,確保沒有設(shè)置scope=test
5.2 連接被拒絕
報錯:Connection refused
原因:IP、端口、數(shù)據(jù)庫名填錯了,或者金倉服務(wù)沒啟動
解決:
- 先用
ksql命令行測試能否連接 - 檢查防火墻是否開放了端口
- 確認數(shù)據(jù)庫名是否正確(區(qū)分大小寫)
5.3 表名或字段名大小寫問題
金倉默認是大小寫不敏感的,但如果建表時用了雙引號,就會變成大小寫敏感。建議統(tǒng)一用小寫,避免麻煩。
-- 推薦寫法
CREATE TABLE test_springboot (id INT, name VARCHAR(50));
-- 避免這種寫法,會帶來困擾
CREATE TABLE "Test_SpringBoot" ("Id" INT, "Name" VARCHAR(50));六、生產(chǎn)環(huán)境建議
示例代碼跑通后,在實際項目中還需要注意幾點:
1. 使用連接池
Spring Boot默認使用HikariCP,配置如下:
spring.datasource.hikari.maximum-pool-size=20 spring.datasource.hikari.minimum-idle=5 spring.datasource.hikari.connection-timeout=30000
2. 密碼不要硬編碼
# 使用環(huán)境變量
spring.datasource.password=${KINGBASE_PASSWORD}
# 或使用配置中心3. 事務(wù)管理
在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加驅(qū)動、application.properties改URL。如果代碼里沒有用數(shù)據(jù)庫特有的方言,基本能做到零修改遷移。
這次實戰(zhàn)經(jīng)歷也讓我對金倉的JDBC驅(qū)動有了更多信心——兼容性不錯,性能也穩(wěn)定。如果你的團隊正在做技術(shù)選型或國產(chǎn)化改造,不妨動手試試。
以上就是SpringBoot快速接入金倉數(shù)據(jù)庫的完整步驟的詳細內(nèi)容,更多關(guān)于SpringBoot接入金倉數(shù)據(jù)庫的資料請關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
java中循環(huán)刪除list中元素的方法總結(jié)
下面小編就為大家?guī)硪黄猨ava中循環(huán)刪除list中元素的方法總結(jié)。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2016-12-12
Java使用easyExcel實現(xiàn)Excel文件解析
這篇文章主要為大家詳細介紹了Java如何使用easyExcel實現(xiàn)Excel文件解析,文中的示例代碼講解詳細,感興趣的小伙伴可以跟隨小編一起學(xué)習一下2025-02-02
如何使用Collections.reverse對list集合進行降序排序
這篇文章主要介紹了Java使用Collections.reverse對list集合進行降序排序,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2021-11-11
Spring?Boot中的JdbcClient與JdbcTemplate使用對比分析
這篇文章主要介紹了Spring Boot中的JdbcClient與JdbcTemplate使用對比分析,一起看看Spring Boot 中 JdbcClient 和 JdbcTemplate 之間的差異2024-01-01
使用Java快速將Web中表格轉(zhuǎn)換成Excel的方法
在平時做系統(tǒng)項目時,經(jīng)常會需要做導(dǎo)出功能,下面這篇文章主要給大家介紹了關(guān)于使用Java快速將Web中表格轉(zhuǎn)換成Excel的相關(guān)資料,需要的朋友可以參考下2023-06-06
mybatis 插件: 打印 sql 及其執(zhí)行時間實現(xiàn)方法
下面小編就為大家?guī)硪黄猰ybatis 插件: 打印 sql 及其執(zhí)行時間實現(xiàn)方法。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2017-06-06

