基于梧桐数据库的 Spring Boot 应用开发实战

基于梧桐数据库的 Spring Boot 应用开发实战

一、项目背景

随着业务规模的不断扩大,数据量的增长对数据库的性能提出了更高的要求。为了满足高并发、大数据量的需求,我们决定采用梧桐数据库,并结合 Spring Boot 框架快速构建一个稳定高效的应用系统。

本文编写关于如何在 Spring Boot 环境下连接梧桐数据的指引文档。

二、环境配置

  • Java版本:OpenJDK 1.8
  • Spring Boot版本:2.7.18
  • 梧桐数据库版本:WuTongDB 1.x
  • 构建工具:Maven

三、技术栈介绍

梧桐数据库

梧桐数据库是由中移动信息技术有限公司(中国移动集团大数据中心)打造的新一代云原生分布式数据库,能够同时支持公有云与私有云。该产品采用存储和计算分离的架构,具有 MPP 的所有优点,服务层、计算层、存储层均可弹性扩展,支持混合工作负载并具备高扩展性。

Spring Boot

Spring Boot 是一个简化新 Spring 应用的初始搭建以及开发过程的框架。它默认配置了许多框架的使用方式,从而能够让我们不用花费太多时间在解决各种框架集成的难题上。

四、开发步骤

4.1 测试数据准备

postgresql 复制代码
-- DDL,schema_name按实际填写
CREATE TABLE schema_name.test_table(
  table_id text, 
  type text,
  end_time text,
  start_time text  )
FORMAT 'MAGMAAP' TABLESPACE magma_default01;

-- INSERT
INSERT INTO schema_name.test_table (table_id, type, end_time, start_time)
VALUES ('test_id_001', 'A', '2024-07-30 12:00:00', '2024-07-30 09:00:00');
INSERT INTO schema_name.test_table (table_id, type, end_time, start_time)
VALUES ('test_id_002', 'B', '2024-07-30 13:00:00', '2024-07-30 10:00:00');
INSERT INTO schema_name.test_table (table_id, type, end_time, start_time)
VALUES ('test_id_003', 'C', '2024-07-30 14:00:00', '2024-07-30 11:00:00');

4.2 创建 Spring Boot 项目

通过 Spring Initializr 创建一个基本的 Spring Boot 项目,并添加必要的依赖,如 Spring Web , 持久层框架 MyBatis-Plus 和用于连接梧桐数据库的驱动。

从梧桐侧获取驱动jar包:wutong-database-6.0.0.0-SNAPSHOT.jar,并放置于 E:\db 目录下。将 jar 注册到 maven 本地库:

ini 复制代码
mvn install:install-file -Dfile=E:\db\wutong-database-6.0.0.0-SNAPSHOT.jar -DgroupId=com.wutong -DartifactId=wutong -Dversion=6.0 -Dpackaging=jar

驱动注册完成后,我们在 maven 依赖加入以下内容:

xml 复制代码
        <!-- Spring Boot相关依赖 -->
		<dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
            <version>2.7.18</version>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <version>2.7.18</version>
            <scope>test</scope>
        </dependency>
        <!-- bootstrap.yml支持依赖-->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-bootstrap</artifactId>
        </dependency>
		<!-- MyBatis-Plus 相关依赖 -->
        <dependency>
            <groupId>com.baomidou</groupId>
            <artifactId>mybatis-plus-boot-starter</artifactId>
            <version>3.5.3.1</version>
        </dependency>
        <!-- 数据源切换工具 dynamic-datasource -->
        <dependency>
            <groupId>com.baomidou</groupId>
            <artifactId>dynamic-datasource-spring-boot-starter</artifactId>
            <version>3.5.2</version>
        </dependency>
        <!-- 梧桐数据库连接驱动 -->
        <dependency>
            <groupId>com.wutong</groupId>
            <artifactId>wutong</artifactId>
            <version>6.0</version>
        </dependency>

4.3 配置数据库连接

bootstrap.yml 文件中配置数据库连接信息,例如:

yaml 复制代码
spring:
    datasource:
        dynamic:
            strict: false
            primary: wutong_ydy_magma
            datasource:
                wutong_magma:
                	# ip,db_name,schema_name按实际填写
                    url: jdbc:wutongdb://ip:5432/db_name?currentSchema=schema_name
                    # username按实际填写
                    username: username
                    # password按实际填写
                    password: password
                    driver-class_name: org.wutong.Driver

4.4 设计实体类

根据业务需求设计实体类,并使用 Mybatis-plus 注解来映射表结构。

java 复制代码
// schema_name按实际替换
@TableName(value ="schema_name.test_table")
public class TestInfo implements Serializable {
    private String tableId;

    private String type;

    private String endTime;

    private String startTime;

    @TableField(exist = false)
    private static final long serialVersionUID = 1L;

    public String getTableId() {
        return tableId;
    }


    public void setTableId(String tableId) {
        this.tableId = tableId;
    }

    public String getType() {
        return type;
    }

    public void setType(String type) {
        this.type = type;
    }

    public String getEndTime() {
        return endTime;
    }

    public void setEndTime(String endTime) {
        this.endTime = endTime;
    }

    public String getStartTime() {
        return startTime;
    }

    public void setStartTime(String startTime) {
        this.startTime = startTime;
    }

    @Override
    public boolean equals(Object that) {
        if (this == that) {
            return true;
        }
        if (that == null) {
            return false;
        }
        if (getClass() != that.getClass()) {
            return false;
        }
        TestInfo other = (TestInfo) that;
        return (this.getTableId() == null ? other.getTableId() == null : this.getTableId().equals(other.getTableId()))
            && (this.getType() == null ? other.getType() == null : this.getType().equals(other.getType()))
            && (this.getEndTime() == null ? other.getEndTime() == null : this.getEndTime().equals(other.getEndTime()))
            && (this.getStartTime() == null ? other.getStartTime() == null : this.getStartTime().equals(other.getStartTime()));
    }

    @Override
    public int hashCode() {
        final int prime = 31;
        int result = 1;
        result = prime * result + ((getTableId() == null) ? 0 : getTableId().hashCode());
        result = prime * result + ((getType() == null) ? 0 : getType().hashCode());
        result = prime * result + ((getEndTime() == null) ? 0 : getEndTime().hashCode());
        result = prime * result + ((getStartTime() == null) ? 0 : getStartTime().hashCode());
        return result;
    }

    @Override
    public String toString() {
        StringBuilder sb = new StringBuilder();
        sb.append(getClass().getSimpleName());
        sb.append(" [");
        sb.append("Hash = ").append(hashCode());
        sb.append(", tableId=").append(tableId);
        sb.append(", type=").append(type);
        sb.append(", endTime=").append(endTime);
        sb.append(", startTime=").append(startTime);
        sb.append(", serialVersionUID=").append(serialVersionUID);
        sb.append("]");
        return sb.toString();
    }
}

4.5 实现数据访问层

使用 MyBatis Plus 提供的 BaseMapper 接口来实现数据的增删改查操作。

文件内相关路径已做脱敏处理,注意替换。

java 复制代码
@DS("wutong_magma")
public interface TestInfoMapper extends BaseMapper<TestInfo> {}
xml 复制代码
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper
        PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
        "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<!-- 替换成文件实际路径 -->
<mapper namespace="com.**.commons.wutong.mapper.demo.TestInfoMapper">
	<!-- 替换成文件实际路径 -->
    <resultMap id="BaseResultMap" type="com.**.commons.wutong.domain.demo.TestInfo">
            <result property="tableId" column="table_id" jdbcType="VARCHAR"/>
            <result property="type" column="type" jdbcType="VARCHAR"/>
            <result property="endTime" column="end_time" jdbcType="VARCHAR"/>
            <result property="startTime" column="start_time" jdbcType="VARCHAR"/>
    </resultMap>

    <sql id="Base_Column_List">
        table_id,type,end_time,
        start_time
    </sql>
</mapper>

4.6 编写服务层

java 复制代码
public interface TestInfoService extends IService<TestInfo> {
}
java 复制代码
@Service
public class TestInfoServiceImpl extends ServiceImpl<TestInfoMapper, TestInfo>
    implements TestInfoService{
}

4.7 编写控制器

创建 RESTful API,定义 HTTP 请求路径、方法等,处理前端传来的请求并返回相应的响应。

java 复制代码
@RestController
@RequestMapping("/api/test")
@Slf4j
public class TestController {
    
    @Autowired
    private TestInfoService testInfoService;

    @PostMapping(value = "/get")
    public AjaxResult getModel(@RequestBody TestReq req){
        QueryWrapper<TestInfo> queryWrapper = new QueryWrapper<>();
        queryWrapper.lambda()
                .eq(TestInfo::getTableId, req.getId())
                .eq(TestInfo::getEndTime, req.getTime());
        TestInfo one = testInfoService.getOne(queryWrapper,false);
        if (one!=null){
            TestModelResp testModelResp = new TestModelResp();
            testModelResp.setId(one.getTableId());
            testModelResp.setType(one.getType());
            return AjaxResult.success(testModelResp);
        }
        return AjaxResult.error();
    }

}

4.8 部署应用并测试

将应用部署后,请求接口即可获取结果。

五、总结

通过上述步骤,我们成功地构建了一个基于梧桐数据库的 Spring Boot 应用,并通过 API 实现梧桐数据库的数据实时查询。

相关推荐
云和数据.ChenGuang4 小时前
Django 应用安装脚本 – 如何将应用添加到 INSTALLED_APPS 设置中 原创
数据库·django·sqlite
woshilys5 小时前
sql server 查询对象的修改时间
运维·数据库·sqlserver
Hacker_LaoYi5 小时前
SQL注入的那些面试题总结
数据库·sql
建投数据6 小时前
建投数据与腾讯云数据库TDSQL完成产品兼容性互认证
数据库·腾讯云
Hacker_LaoYi7 小时前
【渗透技术总结】SQL手工注入总结
数据库·sql
岁月变迁呀7 小时前
Redis梳理
数据库·redis·缓存
独行soc7 小时前
#渗透测试#漏洞挖掘#红蓝攻防#护网#sql注入介绍06-基于子查询的SQL注入(Subquery-Based SQL Injection)
数据库·sql·安全·web安全·漏洞挖掘·hw
你的微笑,乱了夏天7 小时前
linux centos 7 安装 mongodb7
数据库·mongodb
工业甲酰苯胺7 小时前
分布式系统架构:服务容错
数据库·架构
独行soc8 小时前
#渗透测试#漏洞挖掘#红蓝攻防#护网#sql注入介绍08-基于时间延迟的SQL注入(Time-Based SQL Injection)
数据库·sql·安全·渗透测试·漏洞挖掘