达梦数据库的搭建和 SpringBoot 访问
目前很多项目都采用国产数据库,虽然国产数据库很多,但是我接触过的项目中使用较多的主要是达梦数据库。
本篇博客简单介绍达梦8数据库单机版部署以及 SpringBoot 对其进行增删改查操作,方便后续项目需要时快速搞定。
我的 CentOS7 虚拟机 ip 地址是 192.168.136.128,已经安装了 docker 和 docker-compose
一、达梦数据库快速部署
官网上使用 docker 部署的文档地址:https://eco.dameng.com/document/dm/zh-cn/start/dm-install-docker.html
该文档地址上有达梦数据库最新 docker 镜像的下载地址,自己下载即可。
我下载的官网 docker 镜像文件是:dm8_20241022_x86_rh6_64_single.tar
首先将 dm8_20241022_x86_rh6_64_single.tar 上传到虚拟机,运行 docker load -i dm8_20241022_x86_rh6_64_single.tar
导入镜像,然后使用 docker images
查看镜像导入的结果:
在虚拟机上创建目录 mkdir -p /data/dm8/data
,在 dm8 目录下放置一个 docker-compose.yml 文件,具体结构如下:
编写 docker-compose.yml 文件内容如下:
version: "3.2" services: dm8: container_name: dm8 image: dm8_single:dm8_20241022_rev244896_x86_rh6_64 privileged: true restart: always ports: - "5236:5236" environment: # 动态链接库地址 - LD_LIBRARY_PATH=/opt/dmdbms/bin # 设置字符集为UTF-8 - UNICODE_FLAG=1 # 表名和字段名大小写是否敏感,1 是 0 否,建议设置为 0 - CASE_SENSITIVE=0 # 初始化数据库实例的名字 - INSTANCE_NAME=dm8server # 管理员密码设置(docker版本达梦库不支持特殊字符,密码至少8位) - SYSDBA_PWD=JobsDM888 volumes: # 数据存放目录 - ./data:/opt/dmdbms/data - /etc/localtime:/etc/localtime
我个人感觉需要特别注意的是:设置 CASE_SENSITIVE=0 这个比较重要,也就是设置为大小写字母不敏感,这样表名和字段名就可以使用小写字母;默认情况下是大小写字母敏感的,此时无论是表名,还是字段名,必须使用大写字母,否则在执行 sql 语句时就会提示无法识别表名或字段名;虽然通过给表名或字段名增加上双引号,可以解决问题,但是在编写 sql 时很麻烦。
最后在 docker-compose.yml 文件所在目录,运行 docker-compose up -d
即可启动达梦数据库服务。
二、使用达梦客户端连接数据库
在达梦官网上下载一个 windows 版本的达梦安装包,比如下载开发版 (X86平台)的安装包,我下载的文件名称为 dm8_20241011_x86_win_64.iso
解压缩后进行安装,到下图的界面时,在下拉列表中选择【客户端安装】即可,因为我们没必要再把数据库服务在 windows 上进行安装。
客户端安装完毕后,启动【DM安装工具】即可,填写上 docker 安装的达梦数据库的 ip 端口等信息,然后连接即可。
需要注意的是,把注册信息要填写上,这样保存口令才能生效,否则每次连接达梦库,都得手动输入口令密码。连接成功后如下图所示:
从 SYS.V$LICENSE 表中可以查询到达梦数据库能够免费使用的截止时间,默认情况下可以使用一年,但是并非把你安装日期作为开始日期,而是把官方发布构建的日期作为开始日期;从 SYS.V$VERSION 表中可以查询到达梦数据库的版本信息和构建日期;从 SYS.V$INSTANCE 表中可以查看到我们在 docker 部署时创建的实例信息。
我们使用 DM管理工具创建一个表空间 dmtest。如果你不为每个数据库创建一个新的表空间的话,那么会使用默认表空间,如果多个数据库都使用默认表空间的话,这样会对每个数据库的性能有影响,并且给后续数据库的迁移带来麻烦。
我们再创建一个用户 DMTEST,密码是 Jobs123456,并使用我们上面创建的 dmtest 表空间。
创建一个用户,就会默认为该用户创建一个模式。你可以把模式理解为数据库。
我们在 DMTEST 模式下面,创建一个 Employee 的表,如下图所示:
这里把 sql 语句也提供出来:
CREATE TABLE "DMTEST"."Employee" ( "id" INT NOT NULL, "user_name" VARCHAR(50), "user_phone" VARCHAR(20), "create_time" DATETIME(0), UNIQUE("id"), NOT CLUSTER PRIMARY KEY("id")) STORAGE(ON "dmtest", CLUSTERBTR) ;
三、使用 SpringBoot 程序访问
新建一个名称为 springboot_dameng 的 SpringBoot 工程,结果如下图所示:
首先查看一下 pom 文件引用的依赖包,要想访问达梦数据库,主要引用的是 DmJdbcDriver18 这个依赖包。
<?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 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <groupId>com.jobs</groupId> <artifactId>springboot_dameng</artifactId> <version>1.0</version> <properties> <maven.compiler.source>8</maven.compiler.source> <maven.compiler.target>8</maven.compiler.target> </properties> <parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>2.4.5</version> </parent> <dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter</artifactId> <scope>compile</scope> </dependency> <!--引入达梦数据库连接依赖包--> <dependency> <groupId>com.dameng</groupId> <artifactId>DmJdbcDriver18</artifactId> <version>8.1.3.140</version> </dependency> <dependency> <groupId>com.baomidou</groupId> <artifactId>mybatis-plus-boot-starter</artifactId> <version>3.4.2</version> </dependency> <dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> <version>1.18.20</version> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> </dependency> </dependencies> <build> <plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> <version>2.4.5</version> </plugin> </plugins> </build> </project>
然后查看一下 application.yml 配置文件的内容:
server: port: 9090 spring: datasource: driver-class-name: dm.jdbc.driver.DmDriver url: jdbc:dm://192.168.136.128:5236 username: DMTEST password: Jobs123456 mybatis-plus: configuration: # 打印出 sql 语句,方便开发时进行查看。生产环境不要开启此项配置 log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
为了能够实现分页查询,我们需要对 mybatis plus 进行一下分页配置:
package com.jobs.config; import com.baomidou.mybatisplus.annotation.DbType; import com.baomidou.mybatisplus.extension.plugins.MybatisPlusInterceptor; import com.baomidou.mybatisplus.extension.plugins.inner.PaginationInnerInterceptor; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; @Configuration public class MybatisPlusConfig { @Bean public MybatisPlusInterceptor getMybatisPlusInterceptor() { MybatisPlusInterceptor mpi = new MybatisPlusInterceptor(); PaginationInnerInterceptor paginationInnerInterceptor = new PaginationInnerInterceptor(); //分页的数据库类型,设置为达梦 paginationInnerInterceptor.setDbType(DbType.DM); mpi.addInnerInterceptor(paginationInnerInterceptor); return mpi; } }
然后简单分别看一下 EmployeeEntity 实体类、Mapper 和 Service 的代码内容:
package com.jobs.entity; import com.baomidou.mybatisplus.annotation.TableField; import com.baomidou.mybatisplus.annotation.TableId; import com.baomidou.mybatisplus.annotation.TableName; import lombok.AllArgsConstructor; import lombok.Data; import lombok.NoArgsConstructor; @Data @NoArgsConstructor @AllArgsConstructor //这里配置了模式名称,也就是数据库名称 @TableName(schema = "DMTEST", value = "Employee") public class EmployeeEntity { @TableId @TableField("id") private Long id; @TableField("user_name") private String userName; @TableField("user_phone") private String userPhone; @TableField("create_time") private String createTime; }
package com.jobs.mapper; import com.baomidou.mybatisplus.core.mapper.BaseMapper; import com.jobs.entity.EmployeeEntity; import org.apache.ibatis.annotations.Mapper; @Mapper public interface EmployeeMapper extends BaseMapper<EmployeeEntity> { }
package com.jobs.service; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.jobs.entity.EmployeeEntity; import com.jobs.mapper.EmployeeMapper; import org.springframework.stereotype.Service; @Service public class EmployeeService extends ServiceImpl<EmployeeMapper, EmployeeEntity> { }
最后我们编写一个测试类 EmployeeTest ,使用里面的测试方法,验证对达梦数据库的增删改查以及分页操作。
package com.jobs; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.toolkit.CollectionUtils; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.jobs.entity.EmployeeEntity; import com.jobs.service.EmployeeService; import org.junit.jupiter.api.Test; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.context.SpringBootTest; import java.util.List; import java.util.Objects; @SpringBootTest public class EmployeeTest { @Autowired private EmployeeService employeeService; /** * 需要注意的是:我在达梦数据库 docker 部署时,设置了 CASE_SENSITIVE=0 即大小写不敏感,这样允许表名和字段名使用小写字母。 * 默认情况下,CASE_SENSITIVE=1,此时你在创建【表名】【字段名】时,必须使用大小字母,否则会提示找不到表或字段。 */ @Test void test1() { EmployeeEntity emp1 = new EmployeeEntity(1L, "候胖胖", "1234567", "2024-09-22 19:00:00"); EmployeeEntity emp2 = new EmployeeEntity(2L, "任肥肥", "2345678", "2024-09-22 19:01:12"); EmployeeEntity emp3 = new EmployeeEntity(3L, "李墩墩", "3456789", "2024-09-22 19:02:23"); EmployeeEntity emp4 = new EmployeeEntity(4L, "杨棒棒", "4567890", "2024-09-22 19:03:35"); EmployeeEntity emp5 = new EmployeeEntity(5L, "乔豆豆", "5678901", "2024-09-22 19:05:26"); employeeService.save(emp1); employeeService.save(emp2); employeeService.save(emp3); employeeService.save(emp4); employeeService.save(emp5); System.out.println("添加成功"); } @Test void test2() { Long id = 2L; EmployeeEntity emp = employeeService.getById(id); if (!Objects.isNull(emp)) { System.out.println(emp); } else { System.out.println("未查询到数据"); } } @Test void test3() { List<EmployeeEntity> emplist = employeeService.list(); if (!CollectionUtils.isEmpty(emplist)) { for (EmployeeEntity emp : emplist) { System.out.println(emp); } } else { System.out.println("未查询到数据"); } } @Test void test4() { //页码(从 1 开始) long pageIndex = 2; //每页多少条数据 long pageSize = 2; Page<EmployeeEntity> pc = new Page<>(pageIndex, pageSize); LambdaQueryWrapper<EmployeeEntity> queryWrapper = new LambdaQueryWrapper<>(); queryWrapper.orderByAsc(EmployeeEntity::getId); Page<EmployeeEntity> result = employeeService.page(pc, queryWrapper); List<EmployeeEntity> records = result.getRecords(); if (CollectionUtils.isEmpty(records)) { for (EmployeeEntity record : records) { System.out.println(record); } } } @Test void test5() { Long id = 2L; EmployeeEntity emp = employeeService.getById(id); if (!Objects.isNull(emp)) { emp.setUserName("马壮壮"); emp.setUserPhone("6666777"); employeeService.updateById(emp); System.out.println("修改成功"); } else { System.out.println("未查询到数据,无法修改"); } } @Test void test6() { Long id = 2L; employeeService.removeById(id); System.out.println("删除成功"); } }
以上代码都测试无误,到这里就简单快速的介绍完了达梦数据库的部署和访问。
本篇博客的源代码下载地址为:https://files.cnblogs.com/files/blogs/699532/springboot_dameng.zip
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享4款.NET开源、免费、实用的商城系统
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
· 上周热点回顾(2.24-3.2)