SpringBoot+MP opera DM8

1. Introducción a la base de datos Dameng

imagen-20230909080931842

El sistema de gestión de bases de datos Dameng es un sistema de gestión de bases de datos nacional de alto rendimiento con derechos de propiedad intelectual completamente independientes lanzado por la empresa Dameng, denominada DM. La última versión es la 8.0, denominada DM8. (También es un RDBMS, un sistema de gestión de bases de datos relacionales, más parecido a Oracle)

DM8 adopta una arquitectura de sistema completamente nueva. Sobre la base de garantizar la universalidad a gran escala, ha realizado una gran cantidad de investigación, desarrollo y trabajo de mejora en confiabilidad, alto rendimiento, procesamiento masivo de datos y seguridad, lo que ha mejorado enormemente el rendimiento y confiabilidad de los productos de base de datos Dameng, escalabilidad y puede tener en cuenta solicitudes OLAP y OLTP, mejorando fundamentalmente la calidad de los productos DM8.


2. Instale dm8 basado en dokcer

Dirección del documento: https://eco.dameng.com/document/dm/zh-cn/start/dm-install-docker.html

1. Descargue el paquete de instalación de dm8:

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

imagen-20230909082633757


2. Importa la imagen:

docker load -i dm8_20230808_rev197096_x86_rh6_64_single.tar

Una vez completada la importación, puede utilizar docker imagespara ver la imagen importada. Los resultados se muestran de la siguiente manera:

imagen-20230909082258066


3. Inicie el contenedor:

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

Introducción de parámetros:

  • -d: Indica que el contenedor se está ejecutando en modo de fondo (separado), lo que significa que el contenedor se ejecutará en segundo plano sin ocupar su terminal.

  • -p 30236:5236: Mapeo de puertos, mapeando el puerto 30236 del host al puerto 5236 dentro del contenedor. Se utiliza para la comunicación de red entre aplicaciones dentro del contenedor y el exterior.

  • --restart=always: Configure Docker para que reinicie automáticamente los contenedores cuando se detengan o bloqueen.

  • --name dm8_test: Asigne un nombre al contenedor.

  • --privileged=true: Indica otorgar acceso privilegiado al contenedor, lo que permite que el contenedor realice más operaciones del sistema.

  • Parámetros de variables de entorno (parámetro -e):

    • -e CASE_SENSITIVE=0 : establece la no distinción entre mayúsculas y minúsculas.

    • PAGE_SIZE=16: Tamaño de página.

    • LD_LIBRARY_PATH=/opt/dmdbms/bin: Se utiliza para especificar la ruta de búsqueda de la biblioteca de enlaces dinámicos, generalmente configurada en el directorio de archivos de la base de datos interna del contenedor.

    • EXTENT_SIZE=32: tamaño de cluster.

    • BLANK_PAD_MODE=1: establece si el modo de llenado del espacio final es compatible con ORACLE al comparar cadenas. Valor: 1 es compatible; 0 no es compatible. El valor predeterminado es 0.

    • LOG_SIZE=1024: Tamaño del registro.

    • UNICODE_FLAG=1: Indica el uso del juego de caracteres utf-8.

    • LENGTH_IN_CHAR=1: Si la longitud del objeto de tipo VARCHAR está en caracteres. Valor: 1/Y significa sí, 0/N significa no, el valor predeterminado es 0.

    • INSTANCE_NAME=dm8_test: Nombre de instancia.

  • -v /data/dm8_test:/opt/dmdbms/data: Monte el volumen de datos y asigne el directorio en el host /data/dm8_testal directorio dentro del contenedor /opt/dmdbms/data. Se utiliza para almacenar datos de forma persistente dentro del contenedor.

  • dm8_single:dm8_20230808_rev197096_x86_rh6_64: Nombre de la imagen del contenedor.


Una vez iniciado el contenedor, utilícelo docker pspara ver el estado de inicio de la imagen. Los resultados son los siguientes:

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

imagen-20230909085930603

Una vez completado el inicio del contenedor, puede verificar el estado de inicio del contenedor a través del registro. El comando es el siguiente:

docker logs -f  dm8_test

imagen-20230909090146258


4. Ingrese al contenedor e inicie sesión en la base de datos:

docker exec -it dm8_01 bash

cd /opt/dmdbms/bin

# 执行登录命令
./disql SYSDBA/SYSDBA001

imagen-20230909093635012


5. Comandos relacionados para iniciar, detener y reiniciar contenedores:

  • Inicie el contenedor: docker start dm8_test
  • Detener el contenedor: docker stop dm8_test
  • Reinicie el contenedor: Docker reinicia dm8_test

3. Preparación básica del entorno

ambiente:

  • JDK8

  • IDEA 2023.2

  • Maven 3.6.1

  • SpringBoot 2.7.13

  • Mybatis-Plus 3.5.2

  • Dm8JdbcDriver18 8.1.1.49

1. Cree una tabla de base de datos:

IDEA se conecta a la base de datos de Dameng: 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
);

imagen-20230909111216976

2. Crear proyecto Springboot

3. Importar dependencias relacionadas:

<?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. Modifique la configuración de 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. Utilice el complemento mybatisx para generar código básico:

imagen-20230909111646086

imagen-20230909111622458

imagen-20230909112517730

imagen-20230909112430688


6. Configure la verificación de parámetros para la clase de entidad:

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;

}

imagen-20230909120332942


7. Configure el complemento de escaneo y paginación del mapeador en la clase de inicio:

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. Crear controlador:

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. Prueba

1. Agregar datos:

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

Inicie el proyecto y pruebe: http://localhost:8778/dm/save

imagen-20230909121814130

imagen-20230909122523755


2. Marque todo:

@GetMapping("list")
public String list() {
    
    
    return JSONUtil.toJsonStr(studentService.list());
}

imagen-20230909135546040


2. Agregue en lotes:

@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. Paginación

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

imagen-20230909142252196

Supongo que te gusta

Origin blog.csdn.net/qq_46921028/article/details/132777121
Recomendado
Clasificación