第二十一节 Spring Boot 集成达梦数据库实现增删改查

亮子 | 2026-03-18 14:41:20 | 44 | 0 | 0 | 0

Spring Boot 集成达梦数据库实现增删改查

达梦(DM)是国产关系型数据库,Spring Boot 集成达梦的方式和 MySQL 基本一致,核心差异在于**驱动依赖**、**连接配置**和少量 SQL 语法(达梦兼容大部分 MySQL/Oracle 语法)。下面我会一步步带你实现完整的增删改查(CRUD)。


一、前置准备

  1. 达梦数据库环境
  • 安装达梦数据库(DM8 为例),创建数据库实例、用户(如 TEST_USER)和待操作的表(示例用 user_info 表)。
  • 示例表结构(达梦 SQL):
    sql CREATE TABLE user_info ( id BIGINT PRIMARY KEY AUTO_INCREMENT, -- 达梦支持AUTO_INCREMENT,也可用IDENTITY username VARCHAR(50) NOT NULL, age INT, create_time DATETIME DEFAULT CURRENT_TIMESTAMP );
  1. 开发环境:JDK 8+、Maven/Gradle、Spring Boot 2.x/3.x。

二、核心步骤(完整代码实现)

1. 引入依赖(pom.xml)

需引入达梦驱动、Spring Data JPA/MyBatis(二选一,这里以更通用的 MyBatis-Plus 为例,简化 CRUD 代码):

<?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.18</version> <!-- 适配达梦驱动,2.x 更稳定 -->
        <relativePath/>
    </parent>
    <groupId>com.example</groupId>
    <artifactId>dm-demo</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <name>dm-demo</name>
    
    <dependencies>
        <!-- Spring Boot Web 核心 -->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        
        <!-- 达梦数据库驱动(DM8) -->
        <dependency>
            <groupId>com.dameng</groupId>
            <artifactId>Dm8JdbcDriver18</artifactId>
            <version>8.1.2.193</version> <!-- 版本需与达梦数据库匹配 -->
        </dependency>
        
        <!-- MyBatis-Plus(简化CRUD,无需手写SQL) -->
        <dependency>
            <groupId>com.baomidou</groupId>
            <artifactId>mybatis-plus-boot-starter</artifactId>
            <version>3.5.3.1</version>
        </dependency>
        
        <!-- 数据库连接池(HikariCP,Spring Boot 默认) -->
        <dependency>
            <groupId>com.zaxxer</groupId>
            <artifactId>HikariCP</artifactId>
        </dependency>
        
        <!-- Lombok(简化实体类) -->
        <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>

2. 配置数据库连接(application.yml)

src/main/resources 下创建 application.yml,配置达梦连接信息:

spring:
  # 数据库连接配置
  datasource:
    driver-class-name: dm.jdbc.driver.DmDriver  # 达梦驱动类名(固定)
    url: jdbc:dm://127.0.0.1:5236/TEST_DB?characterEncoding=utf8&useUnicode=true  # 连接串
    # 说明:127.0.0.1(达梦IP)、5236(默认端口)、TEST_DB(数据库名)
    username: TEST_USER  # 达梦用户名
    password: 123456789  # 达梦密码
    # 连接池配置(可选,优化性能)
    hikari:
      maximum-pool-size: 10
      minimum-idle: 5
      connection-timeout: 30000

# MyBatis-Plus 配置
mybatis-plus:
  mapper-locations: classpath:mapper/**/*.xml  # 若手写XML,指定路径
  type-aliases-package: com.example.dmdemo.entity  # 实体类包路径
  configuration:
    map-underscore-to-camel-case: true  # 下划线转驼峰(达梦表字段建议用下划线)
    log-impl: org.apache.ibatis.logging.stdout.StdOutImpl  # 打印SQL日志(调试用)

3. 编写实体类(Entity)

对应 user_info 表,创建 UserInfo.java

package com.example.dmdemo.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;

/**
 * 用户信息实体类(对应达梦user_info表)
 */
@Data  // Lombok自动生成get/set/toString等
@TableName("user_info")  // 指定达梦表名(大小写不敏感,达梦默认大写)
public class UserInfo {
    /**
     * 主键(自增)
     */
    @TableId(type = IdType.AUTO)  // 达梦支持AUTO_INCREMENT,对应IdType.AUTO
    private Long id;

    /**
     * 用户名
     */
    private String username;

    /**
     * 年龄
     */
    private Integer age;

    /**
     * 创建时间
     */
    private LocalDateTime createTime;
}

4. 编写 Mapper 接口(MyBatis-Plus 简化版)

创建 UserInfoMapper.java,继承 MyBatis-Plus 的 BaseMapper,无需手写 CRUD SQL:

package com.example.dmdemo.mapper;

import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.example.dmdemo.entity.UserInfo;
import org.apache.ibatis.annotations.Mapper;

/**
 * 用户信息Mapper(MyBatis-Plus自动实现CRUD)
 */
@Mapper  // 标记为MyBatis Mapper接口
public interface UserInfoMapper extends BaseMapper<UserInfo> {
    // 无需写任何方法,BaseMapper已包含:insert/delete/update/select等
}

5. 编写 Service 层(业务逻辑)

创建 UserInfoService.java 接口和实现类:

// 接口
package com.example.dmdemo.service;

import com.baomidou.mybatisplus.extension.service.IService;
import com.example.dmdemo.entity.UserInfo;

public interface UserInfoService extends IService<UserInfo> {
}

// 实现类
package com.example.dmdemo.service.impl;

import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.example.dmdemo.entity.UserInfo;
import com.example.dmdemo.mapper.UserInfoMapper;
import com.example.dmdemo.service.UserInfoService;
import org.springframework.stereotype.Service;

@Service
public class UserInfoServiceImpl extends ServiceImpl<UserInfoMapper, UserInfo> implements UserInfoService {
    // IService已封装:新增、删除、修改、分页查询等方法,无需手写
}

6. 编写 Controller 层(接口暴露)

创建 UserInfoController.java,实现 RESTful 风格的增删改查接口:

package com.example.dmdemo.controller;

import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.example.dmdemo.entity.UserInfo;
import com.example.dmdemo.service.UserInfoService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.*;

import java.util.List;

/**
 * 用户信息CRUD接口
 */
@RestController
@RequestMapping("/user")
public class UserInfoController {

    @Autowired
    private UserInfoService userInfoService;

    /**
     * 新增用户(POST)
     */
    @PostMapping
    public ResponseEntity<String> addUser(@RequestBody UserInfo userInfo) {
        boolean save = userInfoService.save(userInfo);
        return save ? ResponseEntity.ok("新增成功") : ResponseEntity.badRequest().body("新增失败");
    }

    /**
     * 删除用户(DELETE)
     */
    @DeleteMapping("/{id}")
    public ResponseEntity<String> deleteUser(@PathVariable Long id) {
        boolean remove = userInfoService.removeById(id);
        return remove ? ResponseEntity.ok("删除成功") : ResponseEntity.badRequest().body("删除失败");
    }

    /**
     * 修改用户(PUT)
     */
    @PutMapping
    public ResponseEntity<String> updateUser(@RequestBody UserInfo userInfo) {
        boolean update = userInfoService.updateById(userInfo);
        return update ? ResponseEntity.ok("修改成功") : ResponseEntity.badRequest().body("修改失败");
    }

    /**
     * 根据ID查询单个用户(GET)
     */
    @GetMapping("/{id}")
    public ResponseEntity<UserInfo> getUserById(@PathVariable Long id) {
        UserInfo userInfo = userInfoService.getById(id);
        return ResponseEntity.ok(userInfo);
    }

    /**
     * 查询所有用户(GET)
     */
    @GetMapping
    public ResponseEntity<List<UserInfo>> getAllUsers() {
        List<UserInfo> list = userInfoService.list();
        return ResponseEntity.ok(list);
    }

    /**
     * 条件查询(如按用户名模糊查询)
     */
    @GetMapping("/search")
    public ResponseEntity<List<UserInfo>> searchUser(@RequestParam String username) {
        LambdaQueryWrapper<UserInfo> wrapper = new LambdaQueryWrapper<>();
        wrapper.like(UserInfo::getUsername, username);  // 模糊查询
        List<UserInfo> list = userInfoService.list(wrapper);
        return ResponseEntity.ok(list);
    }
}

7. 启动类(主程序)

package com.example.dmdemo;

import org.mybatis.spring.annotation.MapperScan;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

/**
 * 启动类
 * @MapperScan 扫描Mapper接口包
 */
@SpringBootApplication
@MapperScan("com.example.dmdemo.mapper")  // 扫描Mapper接口
public class DmDemoApplication {
    public static void main(String[] args) {
        SpringApplication.run(DmDemoApplication.class, args);
    }
}

三、测试验证

  1. 启动项目:运行 DmDemoApplication,控制台无报错即启动成功(可看到 MyBatis 打印的 SQL 日志)。
  2. 接口测试(用 Postman/ApiPost 等工具):
  • 新增用户:POST http://localhost:8080/user,请求体:
    json { "username": "张三", "age": 25 }
  • 查询所有用户:GET http://localhost:8080/user,返回新增的用户数据。
  • 修改用户:PUT http://localhost:8080/user,请求体:
    json { "id": 1, "username": "张三_修改", "age": 26 }
  • 删除用户:DELETE http://localhost:8080/user/1

四、关键注意事项

  1. 达梦驱动版本:必须与达梦数据库版本匹配(如 DM8 用 Dm8JdbcDriver18,DM7 用 Dm7JdbcDriver18)。
  2. 连接串格式
  • 基础格式:jdbc:dm://IP:端口/数据库名
  • 若达梦配置了实例名:jdbc:dm://IP:端口?Schema=实例名
  • 若需兼容 Oracle 语法:jdbc:dm://IP:端口/数据库名?compatibleMode=oracle
  1. 表/字段名大小写:达梦默认表名、字段名大写,MyBatis-Plus 的 @TableName 建议显式指定(或配置全局小写)。
  2. 自增主键:达梦支持 AUTO_INCREMENT(兼容 MySQL)和 IDENTITY(兼容 Oracle),MyBatis-Plus 中 IdType.AUTO 均可适配。

总结

  1. 核心配置:Spring Boot 集成达梦的关键是引入正确的驱动依赖、配置达梦专属的 JDBC 连接串和驱动类名。
  2. CRUD 实现:基于 MyBatis-Plus 可大幅简化代码,无需手写基础 CRUD SQL,仅需定义实体类和 Mapper 接口。
  3. 兼容性:达梦兼容大部分 MySQL/Oracle 语法,现有 Spring Boot 项目迁移到达梦时,仅需修改连接配置和驱动,少量 SQL 需适配(如分页、函数)。

如果需要手写 SQL(不用 MyBatis-Plus),只需在 Mapper 接口中定义注解式 SQL(如 @Select("SELECT * FROM user_info WHERE id = #{id}")),逻辑与 MySQL 完全一致。