• SpringBoot+MP操作DM8


    1. 达梦数据库介绍

    image-20230909080931842

    达梦数据库管理系统是达梦公司推出的具有完全自主知识产权的国产高性能数据库管理系统,简称DM。当前最新版本是8.0版本,简称DM8。(同时也是一款RDBMS,关系型数据库管理系统,和oracle比较像)

    DM8采用全新的体系架构,在保证大型通用的基础上,针对可靠性、高性能、海量数据处理和安全性做了大量的研发和改进工作,极大提升了达梦数据库产品的性能、可靠性、可扩展性,能同时兼顾OLAP和OLTP请求,从根本上提升了DM8产品的品质。


    2. 基于dokcer安装dm8

    文档地址:https://eco.dameng.com/document/dm/zh-cn/start/dm-install-docker.html

    1、下载dm8安装包:

    wget https://download.dameng.com/eco/dm8/dm8_20230808_rev197096_x86_rh6_64_single.tar
    
    • 1

    image-20230909082633757


    2、导入镜像:

    docker load -i dm8_20230808_rev197096_x86_rh6_64_single.tar
    
    • 1

    导入完成后,可以使用 docker images 查看导入的镜像,结果显示如下:

    image-20230909082258066


    3、启动容器:

    docker run -d -p 30236:5236 \
    --restart=always \
    --name dm8_test \
    --privileged=true \
    -e CASE_SENSITIVE=0 \
    -e PAGE_SIZE=16 \
    -e LD_LIBRARY_PATH=/opt/dmdbms/bin \
    -e  EXTENT_SIZE=32 \
    -e BLANK_PAD_MODE=1 \
    -e LOG_SIZE=1024 \
    -e UNICODE_FLAG=1 \
    -e LENGTH_IN_CHAR=1 \
    -e INSTANCE_NAME=dm8_test \
    -v /data/dm8_test:/opt/dmdbms/data \
    dm8_single:dm8_20230808_rev197096_x86_rh6_64
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15

    参数介绍:

    • -d: 表示容器以后台(detached)模式运行,意味着容器会在后台运行,而不会占用你的终端。

    • -p 30236:5236: 端口映射,将主机的端口30236映射到容器内部的端口5236。用于容器内部的应用程序与外部进行网络通信。

    • --restart=always:设置Docker在容器停止或崩溃时自动重新启动容器。

    • --name dm8_test: 给容器起个名字。

    • --privileged=true: 表示授予容器特权访问,允许容器执行更多的系统操作。

    • 环境变量参数(-e参数):

      • -e CASE_SENSITIVE=0 :设置大小写不敏感。

      • PAGE_SIZE=16: 页大小。

      • LD_LIBRARY_PATH=/opt/dmdbms/bin: 用于指定动态链接库的搜索路径, 一般设置为容器内部数据库的文件目录。

      • EXTENT_SIZE=32: 簇大小。

      • BLANK_PAD_MODE=1: 设置字符串比较时, 结尾空格填充模式是否兼容 ORACLE。 取值: 1 兼容; 0 不兼容。默认为 0。

      • LOG_SIZE=1024: 日志大小。

      • UNICODE_FLAG=1: 表示使用utf-8字符集。

      • LENGTH_IN_CHAR=1: VARCHAR 类型对象的长度是否以字符为单位。取值:1/Y表示是,0/N表示否,默认为0。

      • INSTANCE_NAME=dm8_test: 实例名称。

    • -v /data/dm8_test:/opt/dmdbms/data: 挂载数据卷,将主机上的/data/dm8_test目录映射到容器内部的/opt/dmdbms/data目录。用于在容器内部持久化存储数据。

    • dm8_single:dm8_20230808_rev197096_x86_rh6_64: 容器镜像名称。


    容器启动完成后,使用 docker ps 查看镜像的启动情况,结果显示如下:

    docker ps --format "table{{.ID}}\t{{.Names}}\t{{.Status}}\t{{.Ports}}"
    
    • 1

    image-20230909085930603

    容器启动完成后,可通过日志检查容器启动情况,命令如下:

    docker logs -f  dm8_test
    
    • 1

    image-20230909090146258


    4、进入容器,登录数据库:

    docker exec -it dm8_01 bash
    
    cd /opt/dmdbms/bin
    
    # 执行登录命令
    ./disql SYSDBA/SYSDBA001
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    image-20230909093635012


    5、启动、停止、重启容器相关命令:

    • 启动容器:docker start dm8_test
    • 停止容器:docker stop dm8_test
    • 重启容器:docker restart dm8_test

    3. 基础环境准备

    环境:

    • JDK8

    • IDEA 2023.2

    • Maven 3.6.1

    • SpringBoot 2.7.13

    • Mybatis-Plus 3.5.2

    • Dm8JdbcDriver18 8.1.1.49

    1、创建数据库表:

    IDEA连接达梦数据库:https://blog.csdn.net/lps12345666/article/details/131745048

    create schema dmdemo;
    
    create table dmdemo.tb_stu
    (
        id BIGINT primary key ,
        name VARCHAR(20) not null,
        age INT not null
    );
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    image-20230909111216976

    2、创建springboot工程

    3、导入相关依赖:

    
    <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.0modelVersion>
    
        <groupId>cn.z3incgroupId>
        <artifactId>springboot-dm8artifactId>
        <version>1.0-SNAPSHOTversion>
        <description>SpringBoot+MP操作DM8description>
    
        
        <parent>
            <groupId>org.springframework.bootgroupId>
            <artifactId>spring-boot-starter-parentartifactId>
            <version>2.7.13version>
            <relativePath/> 
        parent>
    
        <properties>
            <maven.compiler.source>11maven.compiler.source>
            <maven.compiler.target>11maven.compiler.target>
            <project.build.sourceEncoding>UTF-8project.build.sourceEncoding>
        properties>
    
        <dependencies>
            
            <dependency>
                <groupId>org.springframework.bootgroupId>
                <artifactId>spring-boot-starter-webartifactId>
            dependency>
            
            <dependency>
                <groupId>org.springframework.bootgroupId>
                <artifactId>spring-boot-starter-testartifactId>
            dependency>
            
            <dependency>
                <groupId>com.baomidougroupId>
                <artifactId>mybatis-plus-boot-starterartifactId>
                <version>3.5.2version>
            dependency>
            
            <dependency>
                <groupId>com.damenggroupId>
                <artifactId>Dm8JdbcDriver18artifactId>
                <version>8.1.1.49version>
            dependency>
            
            <dependency>
                <groupId>cn.hutoolgroupId>
                <artifactId>hutool-allartifactId>
                <version>5.8.18version>
            dependency>
            
            <dependency>
                <groupId>org.projectlombokgroupId>
                <artifactId>lombokartifactId>
            dependency>
            
            <dependency>
                <groupId>org.hibernate.validatorgroupId>
                <artifactId>hibernate-validatorartifactId>
            dependency>
    
        dependencies>
    
        <build>
            <plugins>
                
                <plugin>
                    <groupId>org.springframework.bootgroupId>
                    <artifactId>spring-boot-maven-pluginartifactId>
                    
                    <configuration>
                        <excludes>
                            <exclude>
                                <groupId>org.projectlombokgroupId>
                                <artifactId>lombokartifactId>
                            exclude>
                        excludes>
                    configuration>
                plugin>
            plugins>
        build>
    
    project>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61
    • 62
    • 63
    • 64
    • 65
    • 66
    • 67
    • 68
    • 69
    • 70
    • 71
    • 72
    • 73
    • 74
    • 75
    • 76
    • 77
    • 78
    • 79
    • 80
    • 81
    • 82
    • 83
    • 84
    • 85
    • 86
    • 87

    4、修改application.yml配置:

    server:
      port: 8778 #项目端口号
      servlet:
        context-path: /dm #项目访问路径
    
    spring:
      # 达梦数据库配置
      datasource:
        driver-class-name: dm.jdbc.driver.DmDriver
        url: jdbc:dm://192.168.159.103:30236/dmdemo
        username: SYSDBA
        password: SYSDBA001
    
    # mp配置
    mybatis-plus:
      mmapper-locations: classpath:mapper/*.xml #mapper配置文件存放目录
      type-aliases-package: cn.z3inc.pojo # 类型别名(实体类)
      configuration:
        log-impl: org.apache.ibatis.logging.stdout.StdOutImpl  #配置标准sql输出
        map-underscore-to-camel-case: true #开启驼峰映射
      #全局配置
      global-config:
        db-config:
          schema: dmdemo #达梦需要加上这个,这是mybatis-plus的配置,如果不加,则查询不到该模式下的数据
          id-type: assign_id #主键生成策略:雪花算法
          table-prefix: tb_  #表名前缀全局配置,表示加载以`tb_`开头的表名
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27

    5、使用mybatisx插件生成基础代码:

    image-20230909111646086

    image-20230909111622458

    image-20230909112517730

    image-20230909112430688


    6、为实体类配置参数校验:

    package cn.z3inc.pojo;
    
    import com.baomidou.mybatisplus.annotation.TableId;
    import com.baomidou.mybatisplus.annotation.TableName;
    import lombok.AllArgsConstructor;
    import lombok.Data;
    import lombok.EqualsAndHashCode;
    import lombok.NoArgsConstructor;
    
    import javax.validation.constraints.*;
    import java.io.Serializable;
    
    
    @Data
    @EqualsAndHashCode(callSuper = false) //它的equals()和hashCode()方法只比较当前类的字段,而不比较任何从父类继承来的字段。
    @NoArgsConstructor
    @AllArgsConstructor
    @TableName(value = "TB_STU")  // 实体类与表名绑定
    public class Student implements Serializable {
        private static final long serialVersionUID = 1L;
        /**
         *
         */
        @TableId
        private Long id;
    
        /**
         * 姓名
         */
        @NotBlank(message = "姓名不能为空")
        private String name;
    
        /**
         * 年龄
         */
        @NotNull
        @Min(0)
        @Max(120)
        private Integer age;
    
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41

    image-20230909120332942


    7、在启动类上配置mapper扫描和分页插件:

    package cn.z3inc;
    
    import com.baomidou.mybatisplus.annotation.DbType;
    import com.baomidou.mybatisplus.extension.plugins.MybatisPlusInterceptor;
    import com.baomidou.mybatisplus.extension.plugins.inner.PaginationInnerInterceptor;
    import org.mybatis.spring.annotation.MapperScan;
    import org.springframework.boot.SpringApplication;
    import org.springframework.boot.autoconfigure.SpringBootApplication;
    import org.springframework.context.annotation.Bean;
    
    @MapperScan("cn.z3inc.mapper") //包扫描配置
    @SpringBootApplication
    public class Application {
        public static void main(String[] args) {
            SpringApplication.run(Application.class, args);
        }
    
        // 注册分页插件
        @Bean
        public MybatisPlusInterceptor mybatisPlusInterceptor(){
            //1 创建MP拦截器对象
            MybatisPlusInterceptor mpInterceptor=new MybatisPlusInterceptor();
            //2 添加分页拦截器
            mpInterceptor.addInnerInterceptor(new PaginationInnerInterceptor());
            //注意:不同的数据库在开启分页功能的时候,需要设置成对应的数据库类型,默认支持mysql (个别数据库的方言不太一样)
            mpInterceptor.addInnerInterceptor(new PaginationInnerInterceptor(DbType.DM));//达梦
            return mpInterceptor;
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29

    8、创建Controller:

    package cn.z3inc.controller;
    
    import cn.z3inc.service.StudentService;
    import lombok.RequiredArgsConstructor;
    import lombok.extern.slf4j.Slf4j;
    import org.springframework.web.bind.annotation.RequestMapping;
    import org.springframework.web.bind.annotation.RestController;
    
    /**
     * 学生相关接口
     *
     * @author 白豆五
     * @date 2023/9/9
     * @since JDK8
     */
    @RestController
    @RequestMapping("/stu")
    @Slf4j
    @RequiredArgsConstructor // 简化构造方法注入的注解
    public class StuController {
        private final StudentService studentService;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22

    4. 测试

    1、添加数据:

    package cn.z3inc.controller;
    
    import cn.z3inc.pojo.Student;
    import cn.z3inc.service.StudentService;
    import lombok.RequiredArgsConstructor;
    import lombok.extern.slf4j.Slf4j;
    import org.springframework.validation.annotation.Validated;
    import org.springframework.web.bind.annotation.PostMapping;
    import org.springframework.web.bind.annotation.RequestBody;
    import org.springframework.web.bind.annotation.RequestMapping;
    import org.springframework.web.bind.annotation.RestController;
    
    import javax.validation.Valid;
    
    /**
     * 学生相关接口
     *
     * @author 白豆五
     * @date 2023/9/9
     * @since JDK8
     */
    @RestController
    @RequestMapping
    @Slf4j
    @RequiredArgsConstructor // 简化构造方法注入的注解
    @Validated //开启参数校验
    public class StuController {
        private final StudentService studentService;
    
        @PostMapping("/save")
        public String save(@Valid @RequestBody Student student) {
            boolean flag = this.studentService.save(student);
            return flag ? "ok": "error";
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35

    启动项目,测试:http://localhost:8778/dm/save

    image-20230909121814130

    image-20230909122523755


    2、查所有:

    @GetMapping("list")
    public String list() {
        return JSONUtil.toJsonStr(studentService.list());
    }
    
    • 1
    • 2
    • 3
    • 4

    image-20230909135546040


    2、批量添加:

    @PostMapping("/bulkSave")
    public void bulkSave() {
        // 离职小技巧:
        List<Student> studentList = new ArrayList<>();
        for (int i = 1; i <= 100000; i++) {
            Student stu = new Student();
            stu.setName("白豆" + i);
            stu.setAge(RandomUtil.randomInt(15, 30));
            studentList.add(stu);
        }
        System.out.println(studentList.size());
        long beginTime = System.currentTimeMillis();
        for (Student student : studentList) {
            studentService.save(student);
        }
        long endTime = System.currentTimeMillis();
        long spendTime = endTime - beginTime;
        System.out.println("用时:" + spendTime + "毫秒");
    
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20

    4、分页

    @GetMapping("page")
    public /*List*/ String page(
        @RequestParam(name = "pageNum", defaultValue = "1") Integer pageNum,
        @RequestParam(name = "pageSize", defaultValue = "5") Integer pageSize) {
        // 0.参数校验
        if (pageNum <= 0 || pageNum > 100) {
            pageNum = 1;
        }
        if (pageSize <= 0 || pageSize > 30) {
            pageSize = 5;
        }
        // 1.创建分页对象,设置分页参数
        IPage<Student> page = new Page(pageNum, pageSize);
        // 2.执行分页查询
        studentService.page(page, null);
        // 3.转成json字符串,返回
        return JSONUtil.toJsonStr(page);
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18

    image-20230909142252196

  • 相关阅读:
    2分钟快速批量部署node_exporter
    C++ 左值引用与一级指针
    vite vue3配置axios
    跨平台UI组件DevExpress XAF v22.1 - 程序集默认面向 .NET 6
    【算法与数据结构】108、LeetCode将有序数组转换为二叉搜索树
    Spring面试题:(七)Spring AOP思想及实现
    跨平台应用开发进阶(二十五) :uni-app实现IOS云打包解决IOS提交审核相册等隐私描述语导致审核失败问题
    基因组坐标系统的 0-based 和 1-based(图文详解)
    【python】OpenCV GUI——Trackbar(14.2)
    SpringBoot项目启动后访问网页显示“Please sign in“
  • 原文地址:https://blog.csdn.net/qq_46921028/article/details/132777121