首页 > 数据库 >达梦数据库的搭建和 SpringBoot 访问

达梦数据库的搭建和 SpringBoot 访问

时间:2024-12-15 23:33:04浏览次数:6  
标签:SpringBoot 数据库 org EmployeeEntity import docker com 达梦

目前很多项目都采用国产数据库,虽然国产数据库很多,但是我接触过的项目中使用较多的主要是达梦数据库。

本篇博客简单介绍达梦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 查看镜像导入的结果:

image

在虚拟机上创建目录 mkdir -p /data/dm8/data ,在 dm8 目录下放置一个 docker-compose.yml 文件,具体结构如下:

image

编写 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 上进行安装。

image

客户端安装完毕后,启动【DM安装工具】即可,填写上 docker 安装的达梦数据库的 ip 端口等信息,然后连接即可。

image

需要注意的是,把注册信息要填写上,这样保存口令才能生效,否则每次连接达梦库,都得手动输入口令密码。连接成功后如下图所示:

image

从 SYS.V$LICENSE 表中可以查询到达梦数据库能够免费使用的截止时间,默认情况下可以使用一年,但是并非把你安装日期作为开始日期,而是把官方发布构建的日期作为开始日期;从 SYS.V$VERSION 表中可以查询到达梦数据库的版本信息和构建日期;从 SYS.V$INSTANCE 表中可以查看到我们在 docker 部署时创建的实例信息。

我们使用 DM管理工具创建一个表空间 dmtest。如果你不为每个数据库创建一个新的表空间的话,那么会使用默认表空间,如果多个数据库都使用默认表空间的话,这样会对每个数据库的性能有影响,并且给后续数据库的迁移带来麻烦。

image

我们再创建一个用户 DMTEST,密码是 Jobs123456,并使用我们上面创建的 dmtest 表空间。

创建一个用户,就会默认为该用户创建一个模式。你可以把模式理解为数据库。

image

我们在 DMTEST 模式下面,创建一个 Employee 的表,如下图所示:

image

这里把 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 工程,结果如下图所示:

image

首先查看一下 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

标签:SpringBoot,数据库,org,EmployeeEntity,import,docker,com,达梦
From: https://www.cnblogs.com/studyjobs/p/18608898

相关文章

  • SpringBoot+Vue供应商管理系统源码+论文
    SpringBoot+Vue供应商管理系统源码+论文代码可以查看文章末尾⬇️联系方式获取,记得注明来意哦~......
  • 基于SpringBoot的摄影社团管理系统
    引言  随着社团活动的日益丰富,如何高效地管理社团事务成为各类组织关注的重点。传统的管理方式多依赖于线下或简单的表格管理,效率较低且易出错,尤其是摄影社团,这种需频繁组织活动和资源分享的群体,更需要一套系统化的管理工具。基于SpringBoot+Vue+MySQL+MyBatis技术......
  • 基于SpringBoot的宠物医院管理系统
    引言  随着人们生活水平的提高,养宠物已成为越来越多家庭的选择。宠物医院作为宠物健康保障的重要场所,其管理效率直接影响到宠物就诊的质量与体验。然而,传统的宠物医院管理模式存在纸质化流程繁琐、预约难、信息查询不便等问题。基于SpringBoot+Vue+MySQL+MyBatis的......
  • Day32-JavaEE应用&Servlet路由技术&UDBC&Mybatis数据库&生命周期
    一,Servlet&路由&周期1,Servlet的含义:Servlet是运行在web服务器或应用服务器上的程序,它是作为来自web浏览器或其他HTTP客户端请求和HTTP服务器上的数据库或应用程序的中间件。使用Servlet可以收集来自网页表单的用户输入,呈现来自数据库或者其他源的记录,还可以动态创建网页2.Servl......
  • DataGrip: MySQL数据库图形化开发工具
    一、DataGrip介绍DataGrip是JetBrains公司推出的管理数据库的产品,功能非常强大,可以兼容各种数据库,另外,JetBrains公司还有一款知名的IDE开发工具IDEA,用户体验非常不错。下载地址https://www.jetbrains.com/datagrip/download/#section=windows二、DataGrip安装下载完成后打......
  • 【毕业设计】基于SpringBoot的果蔬作物疾病防治系统的设计与实现
    1.研究背景信息数据从传统到当代,是一直在变革当中,突如其来的互联网让传统的信息管理看到了革命性的曙光,因为传统信息管理从时效性,还是安全性,还是可操作性等各个方面来讲,遇到了互联网时代才发现能补上自古以来的短板,有效的提升管理的效率和业务水平。传统的管理模式,时间越久管......
  • MySQL基础 数据库表的增删改
    文章目录Mysql一、原理定义概念定义安装Mysql.......二、数据库管理2.1内置客户端操作三、数据表管理3.1内置客户端操作四、SQL-DQL概念scott用例表DQL语句Mysql一、原理定义概念定义数据库(Database)是按照数据结构来组织、存储和管理数据的建立在计算......
  • 基于SpringBoot+vue的商城停车场管理系统(2024-2025年最新,原创项目)
    文章目录系统演示录像系统实际运行效果图技术框架SpringBoot-后端开发框架Vue-前端开发框架前后端分离的开发流程可行性分析系统测试系统测试的目的系统功能测试数据库表设计(供参考)1.用户表(t_user)2.角色表(t_role)3.权限表(t_permission)4.用户-角色关联表(t_user_r......
  • 基于SpringBoot + Vue的超市外卖系统的设计与实现(精选计算机毕业设计-源码+文档+部署)
    文章目录系统演示录像系统实际运行效果图技术框架SpringBoot-后端开发框架Vue-前端开发框架前后端分离的开发流程可行性分析系统测试系统测试的目的系统功能测试数据库表设计(供参考)1.用户表(t_user)2.角色表(t_role)3.权限表(t_permission)4.用户-角色关联表(t_user_r......
  • 超大规模数据库集群保稳系列:数据库攻防演练建设实践11
     01背景1.1初识混沌工程首先我们先了解一下什么是混沌工程?简单而言,混沌工程是在系统上进行实验的技术手段,目的是建立对系统抵御生产环境中失控条件的能力以及信心。这主要体现在两个方面,从系统角度来讲,混沌工程可以提升我们架构的容错能力和韧性,降低故障发生率和复发率,提......