SpringBoot+MP操作DM8

news2024/10/12 14:20:10

1. 达梦数据库介绍

image-20230909080931842

达梦数据库管理系统是达梦公司推出的具有完全自主知识产权的国产高性能数据库管理系统,简称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

image-20230909082633757


2、导入镜像:

docker load -i dm8_20230808_rev197096_x86_rh6_64_single.tar

导入完成后,可以使用 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

参数介绍:

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

image-20230909085930603

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

docker logs -f  dm8_test

image-20230909090146258


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

docker exec -it dm8_01 bash

cd /opt/dmdbms/bin

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

image-20230909093635012

  • 默认账号密码: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
);

image-20230909111216976

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插件生成基础代码:

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;

}

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

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

image-20230909121814130

image-20230909122523755


2、查所有:

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

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 + "毫秒");

}

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

image-20230909142252196

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/992879.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

CLIP | 打破文本图像次元壁

1 贡献 CLIP是文字图片的多模态工作 CLIP的迁移效果非常好。不同风格数据集的ZeroShot推理能力超强 在分类 &#xff0c;物体检测和分割&#xff0c;视频检索都很多视觉下游任务都可以用CLIP取得有监督学习的效果 采用利用自然语音信号的监督信号来进行训练 提出了高质量的…

抖店开通后,新手必须要知道的几个做店技巧,建议认真看完

我是王路飞。 抖店的运营&#xff0c;无非就是围绕【产品】【流量】展开的。 你要是能把这两个点给搞明白&#xff0c;新店快速出单、真是爆单就不再是问题了。 今天就给你们说一下&#xff0c;抖店开通后&#xff0c;作为一个新手商家&#xff0c;你必须要知道的几个做店技…

Java中如何进行加锁??

笔者在上篇文章介绍了线程安全的问题&#xff0c;接下来本篇文章就是来讲解如何避免线程安全问题~~ 前言&#xff1a;创建两个线程&#xff0c;每个线程都实现对同一个变量count各自自增5W次&#xff0c;我们来看一下代码&#xff1a; class Counter{private int count0;publi…

玩转宝塔,持续更新

用了下宝塔是真的比较爽&#xff0c;这里介绍下安装 1.linux安装宝塔 linux服务器直接安装输入就好 yum install -y wget && wget -O install.sh https://download.bt.cn/install/install_6.0.sh && sh install.sh ed8484bec2.部署项目 2.1安装套件 这里直…

datax工具介绍及简单使用

介绍 Datax是一个异构数据源离线同步工具&#xff0c;致力于实现包括关系数据库、HDFS、Hive、ODPS、Hbase等各种异构数据源之间稳定高效的数据同步功能 设计理念 为了解决异构数据源同步问题&#xff0c;DataX将复杂的网状的同步链路变成了星型数据链路&#xff0c;DataX作为…

Java转网络安全渗透测试,挖漏洞真香啊

最近&#xff0c;一个做运维的朋友在学渗透测试。他说&#xff0c;他公司请别人做渗透测试的费用是 2w/人天&#xff0c;一共2周。2周 10w 的收入&#xff0c;好香~ 于是&#xff0c;我也对渗透测试产生了兴趣。开始了探索之路~ 什么是渗透测试 渗透测试这名字听起来有一种…

Java实现自动玩王铲铲的致富之路小程序游戏

文章目录 前言1.调用adb命令截屏并读取到电脑2.打开游戏&#xff0c;提前截几个图&#xff0c;准备好相应的按钮位置颜色3.根据图片路径和x,y坐标&#xff0c;读取图片相应位置的颜色值4.根据颜色值判断如何进行触摸操作5.程序效果分析5.存在的问题6.改进思路7.改进版本&#x…

vue3中通过ref获取子组件实例,取值为undefined

也就是Vue3如何通过 ref 获取子组件实例(子组件中的DOM结构、数据、及方法)&#xff0c;今天写index.vue(父组件&#xff09;时想获取子组件的数据和方法&#xff0c;通过给子组件绑定ref&#xff0c;打印子组件的数据为undefined&#xff1b;百度搜索常用方法为&#xff1a; …

小白参加红队,需要做好哪些准备?

在本文中&#xff0c;我们将为读者介绍要想加入红队&#xff0c;需要掌握哪些方面的技能。 CSDN大礼包&#xff1a;《黑客&网络安全入门&进阶学习资源包》免费分享 护网的定义是以国家组织组织事业单位、国企单位、名企单位等开展攻防两方的网络安全演习。进攻方一个…

【多线程】Thread 类 详解

Thread 类 详解 一. 创建线程1. 继承 Thread 类2. 实现 Runnable 接口3. 其他变形4. 多线程的优势-增加运行速度 二. Thread 类1. 构造方法2. 常见属性3. 启动线程-start()4. 中断线程-interrupt()5. 线程等待-join()6. 线程休眠-sleep()7. 获取当前线程引用 三. 线程的状态1. …

redis主从复制、哨兵、集群模式

redis群集有三种模式 redis群集有三种模式&#xff0c;分别是主从同步/复制、哨兵模式、Cluster&#xff0c;下面会讲解一下三种模式的工作方式&#xff0c;以及如何搭建cluster群集 ●主从复制&#xff1a;主从复制是高可用Redis的基础&#xff0c;哨兵和集群都是在主从复制…

Shell命令管理进程

Shell命令管理进程 列出进程 ps命令 top命令 管理后台进程 启动后台进程 查看后台进程 jobs和ps的区别 停止进程 Linux除了是一种多用户操作系统之外&#xff0c;还是一种多任务系统。多任务意味着可以同时运行多个程序。Linux 提供了相关的工具来列出运行中的进程,监视…

24、DAPlink仿真器-STM32F103C8T6

参考文章&#xff1a; A、https://oshwhub.com/nice0513/daplink-fang-zhen-qi B、https://oshwhub.com/Southerly/daplink-fang-zhen-qi-swd C、https://oshwhub.com/jixin002/stm32f103c8t6_cmsis-dap 串口烧录Hex文件 问题&#xff1a;不支持U盘拖拽&#xff0c;没有识别出U…

Java使用本地浏览器打开网页工具类分享

本文主要分享一个封装工具类&#xff0c;该工具类已实现查找本地可运行的浏览器打开网页。 package com;import java.lang.reflect.Method;/*** browse util** author Roc-xb*/ public class BrowseUtil {public static final String[] BROWSERS {"firefox", "…

UDP协议和报文格式,校验和,CRC的含义

&#x1f496;&#x1f496;&#x1f496;每日一看&#xff0c;学习动力 一、UDP协议及其报文格式 UDP&#xff1a;特点&#xff1a;无连接&#xff0c;不可靠传输 报头里面有啥呢&#xff1f; 那么首先我要先提问一下&#xff1f;2个字节&#xff0c;可以表示的数据范围有多大…

【Sentinel Go】新手指南、流量控制、熔断降级和并发隔离控制

随着微服务的流行&#xff0c;服务和服务之间的稳定性变得越来越重要。Sentinel 是面向分布式、多语言异构化服务架构的流量治理组件&#xff0c;主要以流量为切入点&#xff0c;从流量路由、流量控制、流量整形、熔断降级、系统自适应过载保护、热点流量防护等多个维度来帮助开…

C语言入门Day_17 循环的控制

目录 前言 1.break 2.continue 3.易错点 4.思维导图 前言 我们知道当循环判断的边界条件不成立以后&#xff0c;循环就结束了。除此以外&#xff0c;我们如果想要提前结束循环&#xff0c;或者在循环中跳过某一次循环代码的执行&#xff0c;应该怎么做呢&#xff1f; 假如…

数据治理-数据架构-企业数据架构

是什么 数据架构定义了对组织非常重要元素的标准术语和设计。企业数据架构的设计中包括业务数据描述&#xff0c;如数据的收集、存储、整合、移动和分布。 当数据在组织中通过源或者接口流动时&#xff0c;需要安全、集成、存储、记录、分类、共享的报表和分析&#xff0c;最终…

3D目标检测数据集 KITTI(标签格式解析、点云转图像、点云转BEV)

本文介绍在3D目标检测中&#xff0c;理解和使用KITTI 数据集&#xff0c;包括KITTI 的基本情况、下载数据集、标签格式解析、点云转图像、点云转BEV。 目录 1、KITTI数据集中3D框可视化的效果 2、先看个视频&#xff0c;了解KITTI 的基本情况 3、来到KITTI官网&#xff0c;下…

C++ 11:多线程相关问题

目录 一. 线程类thread 1.1 thread的一些接口函数 2.2 通过thread创建多线程 二. this_thread 三. 互斥锁与原子操作 3.1 多线程中的加锁与解锁 3.1.1 mutex类 3.1.2 lock_guard 类 3.3 原子性操作 四. 条件变量 4.1 线程互斥的缺陷 4.2 condition_variable 实现线程…