1. 大蒙データベースの概要
Dameng データベース管理システムは、Dameng 社が立ち上げた完全に独立した知的財産権を持つ国産の高性能データベース管理システム (DM と呼ばれます) です。最新バージョンはバージョン 8.0 (DM8 と呼ばれます) です。(これは RDBMS、リレーショナル データベース管理システムでもあり、Oracle によく似ています)
DM8 は、まったく新しいシステム アーキテクチャを採用しており、大規模な汎用性の確保に基づいて、信頼性、高性能、大量データ処理、セキュリティに関して多くの研究開発と改善作業を行い、パフォーマンスとパフォーマンスを大幅に向上させました。 Dameng データベース製品の信頼性、スケーラビリティ、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
: コンテナーがバックグラウンド (デタッチ) モードで実行されていることを示します。これは、コンテナーが端末を占有せずにバックグラウンドで実行されることを意味します。 -
-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
-
Dameng データベースの共通コマンド: https://blog.csdn.net/wangguoqing_it/article/details/126400007
-
Dameng データベースの一般的なデータ型: https://betheme.net/a/20657314.html?action=onClick
5. コンテナーを開始、停止、再起動するための関連コマンド:
- コンテナーを開始します: docker start dm8_test
- コンテナを停止します: docker stop dm8_test
- コンテナーを再起動します: docker restart dm8_test
3. 基本的な環境準備
環境:
JDK8
アイデア 2023.2
メイブン 3.6.1
スプリングブート 2.7.13
Mybatis-Plus 3.5.2
Dm8Jdbcドライバー18 8.1.1.49
1. データベーステーブルを作成します。
IDEA が Damen データベースに接続: 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.スプリングブートプロジェクトを作成する
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. スタートアップ クラスでマッパー スキャンおよびページング プラグインを構成します。
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. コントローラーを作成します。
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);
}