1. 达梦数据库介绍

达梦数据库管理系统是达梦公司推出的具有完全自主知识产权的国产高性能数据库管理系统,简称DM。当前最新版本是8.0版本,简称DM8。(同时也是一款RDBMS,关系型数据库管理系统,和oracle比较像)
DM8采用全新的体系架构,在保证大型通用的基础上,针对可靠性、高性能、海量数据处理和安全性做了大量的研发和改进工作,极大提升了达梦数据库产品的性能、可靠性、可扩展性,能同时兼顾OLAP和OLTP请求,从根本上提升了DM8产品的品质。
-  达梦数据库官网:https://www.dameng.com/ 
-  下载地址:https://eco.dameng.com/download/ 
-  技术文档:https://eco.dameng.com/document/dm/zh-cn/start/index.html 
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

2、导入镜像:
docker load -i dm8_20230808_rev197096_x86_rh6_64_single.tar
导入完成后,可以使用 docker images 查看导入的镜像,结果显示如下:

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
参数介绍:
-  -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}}"

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

4、进入容器,登录数据库:
docker exec -it dm8_01 bash
cd /opt/dmdbms/bin
# 执行登录命令
./disql SYSDBA/SYSDBA001

-  默认账号密码:SYSDBA/SYSDBA001 
-  达梦数据库常用命令:https://blog.csdn.net/wangguoqing_it/article/details/126400007 
-  达梦数据库常规数据类型:https://betheme.net/a/20657314.html?action=onClick 
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
);

2、创建springboot工程
3、导入相关依赖:
<?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>cn.z3inc</groupId>
    <artifactId>springboot-dm8</artifactId>
    <version>1.0-SNAPSHOT</version>
    <description>SpringBoot+MP操作DM8</description>
    <!-- springboot工程 -->
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.7.13</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>
    <properties>
        <maven.compiler.source>11</maven.compiler.source>
        <maven.compiler.target>11</maven.compiler.target>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    </properties>
    <dependencies>
        <!--springmvc-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <!-- junit-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
        </dependency>
        <!--mybatisplus-->
        <dependency>
            <groupId>com.baomidou</groupId>
            <artifactId>mybatis-plus-boot-starter</artifactId>
            <version>3.5.2</version>
        </dependency>
        <!--达梦数据库驱动-->
        <dependency>
            <groupId>com.dameng</groupId>
            <artifactId>Dm8JdbcDriver18</artifactId>
            <version>8.1.1.49</version>
        </dependency>
        <!--hutool-->
        <dependency>
            <groupId>cn.hutool</groupId>
            <artifactId>hutool-all</artifactId>
            <version>5.8.18</version>
        </dependency>
        <!--lombok-->
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
        </dependency>
        <!-- 参数校验框架-->
        <dependency>
            <groupId>org.hibernate.validator</groupId>
            <artifactId>hibernate-validator</artifactId>
        </dependency>
    </dependencies>
    <build>
        <plugins>
            <!--打包插件-->
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
                <!--打包时排除lombok-->
                <configuration>
                    <excludes>
                        <exclude>
                            <groupId>org.projectlombok</groupId>
                            <artifactId>lombok</artifactId>
                        </exclude>
                    </excludes>
                </configuration>
            </plugin>
        </plugins>
    </build>
</project>
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_`开头的表名
5、使用mybatisx插件生成基础代码:




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;
}

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;
    }
}
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;
}
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";
    }
}
启动项目,测试:http://localhost:8778/dm/save


2、查所有:
@GetMapping("list")
public String list() {
    return JSONUtil.toJsonStr(studentService.list());
}

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 + "毫秒");
}
4、分页
@GetMapping("page")
public /*List<Student>*/ 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);
}




















