当前位置: 首页 > news >正文

Spring Boot 2.x + MyBatis 连接 Doris 数据库保姆级教程(附完整项目源码)

Spring Boot 2.x + MyBatis 连接 Doris 数据库实战指南

在当今数据驱动的时代,企业级应用对实时分析能力的需求日益增长。Apache Doris作为一款高性能的MPP分析型数据库,凭借其出色的实时分析能力和与MySQL协议的兼容性,正成为越来越多Java开发者的选择。本文将带你从零开始,在Spring Boot 2.2.0项目中整合Doris数据库,构建一个完整的RESTful数据查询服务。

1. 环境准备与项目初始化

1.1 Doris数据库基础配置

在开始Spring Boot项目之前,我们需要确保Doris集群已正确部署并运行。Doris采用FE(Frontend)和BE(Backend)的架构设计,至少需要配置一个FE节点和一个BE节点。

-- 创建测试数据库 CREATE DATABASE demo_db; -- 创建测试表 CREATE TABLE `user_behavior` ( `user_id` BIGINT NULL COMMENT "用户ID", `item_id` BIGINT NULL COMMENT "商品ID", `behavior_type` VARCHAR(20) NULL COMMENT "行为类型", `timestamp` DATETIME NULL COMMENT "时间戳" ) ENGINE=OLAP DUPLICATE KEY(`user_id`, `item_id`) COMMENT "用户行为分析表" DISTRIBUTED BY HASH(`user_id`) BUCKETS 8 PROPERTIES ( "replication_num" = "3", "storage_format" = "V2" );

1.2 Spring Boot项目初始化

使用Spring Initializr创建一个基础项目,选择以下依赖:

  • Spring Web
  • MyBatis Framework
  • Lombok

或者手动在pom.xml中添加以下核心依赖:

<dependencies> <!-- Spring Boot Starter Web --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <!-- MyBatis Spring Boot Starter --> <dependency> <groupId>org.mybatis.spring.boot</groupId> <artifactId>mybatis-spring-boot-starter</artifactId> <version>2.1.4</version> </dependency> <!-- MySQL Connector --> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>8.0.23</version> </dependency> <!-- Druid连接池 --> <dependency> <groupId>com.alibaba</groupId> <artifactId>druid-spring-boot-starter</artifactId> <version>1.2.6</version> </dependency> <!-- Lombok --> <dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> <optional>true</optional> </dependency> </dependencies>

2. 数据源配置与MyBatis集成

2.1 配置Doris数据源

Doris兼容MySQL协议,这使得我们可以直接使用MySQL的JDBC驱动来连接Doris。在application.yml中配置数据源:

spring: datasource: type: com.alibaba.druid.pool.DruidDataSource driver-class-name: com.mysql.cj.jdbc.Driver url: jdbc:mysql://your-doris-fe-host:9030/demo_db?useSSL=false&serverTimezone=UTC username: root password: druid: initial-size: 5 min-idle: 5 max-active: 20 max-wait: 60000 time-between-eviction-runs-millis: 60000 min-evictable-idle-time-millis: 300000 validation-query: SELECT 1 test-while-idle: true test-on-borrow: false test-on-return: false mybatis: mapper-locations: classpath:mapper/*.xml type-aliases-package: com.example.doris.model configuration: map-underscore-to-camel-case: true

2.2 实体类与Mapper接口设计

创建对应的实体类和Mapper接口:

@Data @NoArgsConstructor @AllArgsConstructor public class UserBehavior { private Long userId; private Long itemId; private String behaviorType; private LocalDateTime timestamp; }

Mapper接口定义:

@Mapper public interface UserBehaviorMapper { List<UserBehavior> selectByTimeRange(@Param("startTime") LocalDateTime startTime, @Param("endTime") LocalDateTime endTime); @Select("SELECT behavior_type, COUNT(*) as count FROM user_behavior " + "WHERE timestamp BETWEEN #{startTime} AND #{endTime} " + "GROUP BY behavior_type") List<BehaviorCount> countByBehaviorType(@Param("startTime") LocalDateTime startTime, @Param("endTime") LocalDateTime endTime); }

3. MyBatis XML映射文件编写

在resources/mapper目录下创建UserBehaviorMapper.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.example.doris.mapper.UserBehaviorMapper"> <resultMap id="BaseResultMap" type="UserBehavior"> <result column="user_id" property="userId" /> <result column="item_id" property="itemId" /> <result column="behavior_type" property="behaviorType" /> <result column="timestamp" property="timestamp" /> </resultMap> <select id="selectByTimeRange" resultMap="BaseResultMap"> SELECT user_id, item_id, behavior_type, timestamp FROM user_behavior WHERE timestamp BETWEEN #{startTime} AND #{endTime} ORDER BY timestamp DESC </select> </mapper>

4. 业务层与控制器实现

4.1 服务层实现

@Service @RequiredArgsConstructor public class UserBehaviorService { private final UserBehaviorMapper userBehaviorMapper; public List<UserBehavior> getUserBehaviors(LocalDateTime startTime, LocalDateTime endTime) { return userBehaviorMapper.selectByTimeRange(startTime, endTime); } public List<BehaviorCount> getBehaviorStatistics(LocalDateTime startTime, LocalDateTime endTime) { return userBehaviorMapper.countByBehaviorType(startTime, endTime); } }

4.2 RESTful API控制器

@RestController @RequestMapping("/api/behavior") @RequiredArgsConstructor public class UserBehaviorController { private final UserBehaviorService userBehaviorService; @GetMapping("/list") public ResponseEntity<List<UserBehavior>> listBehaviors( @RequestParam @DateTimeFormat(iso = DateTimeFormat.ISO.DATE_TIME) LocalDateTime start, @RequestParam @DateTimeFormat(iso = DateTimeFormat.ISO.DATE_TIME) LocalDateTime end) { return ResponseEntity.ok(userBehaviorService.getUserBehaviors(start, end)); } @GetMapping("/stats") public ResponseEntity<List<BehaviorCount>> getBehaviorStats( @RequestParam @DateTimeFormat(iso = DateTimeFormat.ISO.DATE_TIME) LocalDateTime start, @RequestParam @DateTimeFormat(iso = DateTimeFormat.ISO.DATE_TIME) LocalDateTime end) { return ResponseEntity.ok(userBehaviorService.getBehaviorStatistics(start, end)); } }

5. 高级配置与性能优化

5.1 Doris特有的JDBC参数优化

为了获得更好的性能,可以在JDBC URL中添加Doris特有的参数:

spring: datasource: url: jdbc:mysql://your-doris-fe-host:9030/demo_db?useSSL=false&serverTimezone=UTC&doris.query.timeout=300&doris.request.retries=3

5.2 MyBatis批量操作优化

Doris支持高效的批量插入操作,可以通过MyBatis的批量模式来提升性能:

@Mapper public interface UserBehaviorMapper { @Insert("<script>" + "INSERT INTO user_behavior (user_id, item_id, behavior_type, timestamp) VALUES " + "<foreach collection='list' item='item' separator=','>" + "(#{item.userId}, #{item.itemId}, #{item.behaviorType}, #{item.timestamp})" + "</foreach>" + "</script>") int batchInsert(@Param("list") List<UserBehavior> behaviors); }

5.3 连接池监控配置

启用Druid连接池的监控功能:

spring: datasource: druid: stat-view-servlet: enabled: true url-pattern: /druid/* login-username: admin login-password: admin web-stat-filter: enabled: true url-pattern: /* exclusions: "*.js,*.gif,*.jpg,*.png,*.css,*.ico,/druid/*"

6. 常见问题排查

6.1 连接超时问题

如果遇到连接超时,可以检查以下几点:

  • 确认FE节点的9030端口是否开放
  • 检查Doris的FE日志是否有异常
  • 适当增加JDBC连接超时参数

6.2 查询性能优化

对于复杂查询,可以考虑:

  • 在Doris中合理设计分区和分桶策略
  • 使用物化视图预计算常用查询
  • 为常用查询条件创建合适的索引

6.3 数据类型映射

Doris与MySQL数据类型存在一些差异,需要注意:

  • Doris的DECIMAL精度与MySQL有所不同
  • 日期时间类型的处理需要特别注意时区设置
  • VARCHAR长度限制在Doris中更为严格

7. 完整项目结构与部署

一个典型的Spring Boot集成Doris的项目结构如下:

src/main/java ├── com.example.doris │ ├── config │ ├── controller │ ├── model │ ├── mapper │ ├── service │ └── DorisApplication.java src/main/resources ├── application.yml ├── mapper │ └── UserBehaviorMapper.xml

部署时需要注意:

  • 确保生产环境的Doris连接信息正确配置
  • 合理设置连接池大小以适应并发需求
  • 监控Doris集群的健康状态

在实际项目中,Doris与Spring Boot的集成可以为企业级数据分析应用提供强大的实时查询能力。通过合理的设计和优化,这种组合能够处理TB级数据的实时分析需求,同时保持开发人员熟悉的MySQL协议和MyBatis操作方式。

http://www.jsqmd.com/news/669380/

相关文章:

  • Vue3 + Element Plus 侧边栏折叠实战:从布局适配到图标切换的完整避坑指南
  • 用PYNQ-Z2开发板从零实现HDMI彩条显示:Vivado 18.3实战教程(附完整源码)
  • 用Java手把手教你实现PCA权重计算:从Excel数据到最终权重的完整流程
  • 告别手动配置!保姆级教程:在Windows 10/11上安装STM32CubeMX 6.9.0及HAL库支持包
  • Keil C51安装避坑指南:从下载到破解的完整流程(附最新注册机)
  • 房地产行业的 AI 变革:房产带看与估值 Agent
  • 2026年南宁高压清洗管道生产厂家推荐 - 品牌宣传支持者
  • 告别网格限制:用原子范数最小化(ANM)在MATLAB/Python中实现超分辨DOA估计
  • 华为设备SSH远程登录实战:从零配置到安全连接
  • E9:泛微OA系统API接口分类解析与应用指南
  • VLLM/SGLang服务上线后,如何用lm_eval快速做个‘体检’?附完整API评测命令
  • openvslam (1) 运行和增大跟踪效果 - MKT
  • Matlab R2023a绘图避坑:xlabel设置后不显示?教你排查字体、坐标区与对象句柄问题
  • AI赋能供应链:从SCM、SRM到MDM,智能技术如何重塑核心概念与协同
  • 宝塔面板日志文件过大_配置日志轮转与定时清理
  • 保姆级教程:用Abaqus搞定气动软体抓手的仿真建模(从材料设置到结果提取)
  • 法规标准-UN R157:自动驾驶L3级认证的“安全基石”与测试挑战
  • 从‘MOVED’错误到丝滑重定向:深入理解Redis集群客户端如何与16384个Slot打交道
  • 别再为通信失败头疼!手把手调试FR336 RFID读写器与三菱PLC的Modbus RTU连接
  • JumpServer自动化运维避坑手册:Ansible作业调度那些容易踩的5个雷(含容器权限隔离最佳实践)
  • 工业肌肉:08 伺服最容易坏在哪里?工程师最怕的 10 个坑
  • STM32实战 | 基于AD7606并行接口的高效多通道数据采集方案
  • 别再只测本地了!手把手教你配置Mosquitto MQTT代理,让外网设备也能连上
  • 轨道角动量OAM超表面设计:自旋到轨道角动量转换与几何相位调控的FDTD仿真研究
  • 从理论到实践:拆解TFT模型在业务时序预测中的核心优势与落地指南
  • 从Attention U-Net到UCTransNet:深入拆解通道Transformer(CCT/CCA)如何革新医学影像分割的‘特征融合’逻辑
  • python tilt
  • 【AGI自主学习底层逻辑】:20年AI架构师首度公开7大探索策略与3个致命误区
  • 硕飞SP328烧录器联机vs脱机模式选择指南:1G/2G/4G Flash实测对比
  • 教授专栏205| 胡文琪:开发全球首个仿生人工纤毛系统,为未来医疗及工程微型机械人应用开创新方向