【SpringBoot应用篇】SpringBoot+MybatisPlus集成国产DM8(达梦)数据库

news2024/12/24 21:32:07

【SpringBoot应用篇】SpringBoot+MybatisPlus集成国产DM8(达梦)数据库

  • 简介和安装
  • 基本概念介绍
  • SpringBoot+MP整合DM8
    • pom
    • yml
    • Address
    • AddressMapper
    • 启动类
    • 测试类
  • yml配置与实体类@TableName表映射问题

简介和安装

DM8 是达梦数据库有限公司推出的新一代高性能数据库产品。它具有开放的、可扩展的体系结构,易于使用的事务处理系统,以及低廉的维护成本,是达梦公司完全自主开发的产品。DM8 以 RDBMS 为核心,以 SQL 为标准,是一个能跨越多种软硬件平台、具有大型数据综合管理能力的、高效稳定的通用数据库管理系统。

连接达梦数据库实例安装文档

连接工具,安装达梦数据库已经自带了客户端可视化工具
在这里插入图片描述

在这里插入图片描述

基本概念介绍

这里主要简单介绍以下几个简单但重要的概念:数据库、实例、用户、表空间、模式、表、角色、数据文件。

数据库:数据存储的物理介质。广义上讲任何存储数据的物理介质都可叫着数据库,例如一个word文档。但实际上,我们说数据库一般是指像MySQL,ORACLE, HBASE等之类的软件系统。这些系统除了提供数据的存储外,还提供一整套相关的工具或接口对存储的数据进行管理。达梦数据库就是这样的一种系统。

数据库实例:已实例化可存储数据的仓库。达梦数据库与MySQL数据库有一个很大的差别就是:MySQL服务启动后通过create database语句创建N个数据库(数据库实例);而达梦数据库一个实例就只能挂一个数据库(即一个实例就是一个数据库),如果想建多个数据库,则需配置启动相应数量的实例。达梦的每个实例有一系列的后台进程和内存结构,这些是相互独立的。

用户:达梦数据库用户是建在实例下的,因为实例相互独立,所有达梦数据库不同的实例下可以有相同的用户名。另外,在达梦数据库中通过create user语句创建用户时,会同时创建一个同名的“模式”。也可以通过create schema语句单独创建模式(特别注意:在Oracle中,用户与schema是一一对应的,不能单独创建模式,要想创建模式得需通过创建一个同名用户来实现),并授权给某个已存在的用户,因此在达梦数据库中用户与模式是1:N的关系。(注:如果先通过create schema创建了模式,再通过create user创建同名用户,不能创建成功。)

表空间:是一个用来管理数据存储的概念,表空间只是和数据文件(ORA或者DBF文件)发生关系,数据文件是物理的,一个表空间可以包含多个数据文件,而一个数据文件只能隶属一个表空间。可以将表空间理解为对应一块物理存储区,专门用来存储数据文件。实例化达梦数据库时,默认会创建MAIN、ROLL、SYSTEM、TEAM及HMAIN五个表空间。ROLL、SYSTEM、TEAM表空间系统自行维护,用户所建表(如果未指定存放表空间的话)默认放在MAIN表空间。用户也可自定义表空间,然后在创建用户时指定为默认表空间;也可以在建表时通过加"tablespace SpaceName"语句动态指定该表的存储表空间。

模式(schema):如果仅使用过MySQL,而没有ORACLE数据库使用经验,这个概念比较难理解。

关于模式,需要记住一下几点:

  • 一个用户一般对应一个schema,该用户的schema名等于用户名,并作为该用户缺省schema;

  • 一个用户还可以使用其他的schema(Oracle数据库也可通过权限管理实现访问其他schema);

  • 创建模式不指定用户时,该模式默认为SYSDBA拥有;

  • 在同一模式下不能存在同名对象,但在不同模式中的对象名称可以相同;

  • 用户可以直接访问同名模式对象,但如果要要访问其他模式对象,则必须具有对象权限;

  • 当用户要访问其他模式对象时,必须附加模式名作后缀(schema.table);

  • 用户是用来连接数据库对象,而模式是用来创建及管理对象的。

:这个就不用说了吧,但要说明的一点是一个表只能属于一个表空间。

角色:在达梦数据库中,每个用户都有角色。它决定了该用户有什么权限,比如DBA,拥有最高权限。补充说明一点是,实例化的达梦数据库默认有3种角色:DBA, PUBLIC,RESOURCE。新建的用户只拥有PUBLIC角色,该角色几乎做不了撒,因此一般新建用户后,需要单独对他(她)进行授权。

数据文件:数据的物理载体。

这里是帮助理解的一段类比说明:

“我们可以把Database看作是一个大仓库,仓库分了很多很多的房间,Schema就是其中的房间,一个Schema代表一个房间,Table可以看作是每个Schema中的床,Table(床)被放入每个房间中,不能放置在房间之外,那岂不是晚上睡觉无家可归了,然后床上可以放置很多物品,就好比 Table上可以放置很多列和行一样,数据库中存储数据的基本单元是Table,现实中每个仓库放置物品的基本单位就是床, User就是每个Schema的主人,(所以Schema包含的是Object,而不是User),user和schema是一一对应的,每个user在没有特别指定下只能使用自己schema(房间)的东西,如果一个user想使用其他schema(房间)的东西,那就要看那个schema(房间)的user(主人)有没有给你这个权限了,或者看这个仓库的老大(DBA)有没有给你这个权限了。换句话说,如果你是某个仓库的主人,那么这个仓库的使用权和仓库中的所有东西都是你的(包括房间),你有完全的操作权,可以扔掉不用的东西从每个房间,也可以放置一些有用的东西到某一个房间,你还可以给每个User分配具体的权限,也就是他到某一个房间能做些什么,是只能看(Read-Only),还是可以像主人一样有所有的控制权(R/W),这个就要看这个User所对应的角色Role了。”—摘自网络

SpringBoot+MP整合DM8

测试使用的是初始化达梦数据库实例为我们创建的一个schema:PERSON,表:ADDRESS
在这里插入图片描述

CREATE TABLE "PERSON"."ADDRESS"
(
"ADDRESSID" INT IDENTITY(1, 1) NOT NULL,
"ADDRESS1" VARCHAR(60) NOT NULL,
"ADDRESS2" VARCHAR(60),
"CITY" VARCHAR(30) NOT NULL,
"POSTALCODE" VARCHAR(15) NOT NULL,
NOT CLUSTER PRIMARY KEY("ADDRESSID")) STORAGE(ON "BOOKSHOP", CLUSTERBTR) ;

pom

<parent>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-parent</artifactId>
     <version>2.3.2.RELEASE</version>
</parent>

<dependencies>
      <!-- 达梦数据库依赖 -->
      <dependency>
          <groupId>com.dameng</groupId>
          <artifactId>DmJdbcDriver18</artifactId>
          <version>8.1.1.193</version>
      </dependency>

      <!-- Mybatis-Plus依赖 -->
      <dependency>
          <groupId>com.baomidou</groupId>
          <artifactId>mybatis-plus-boot-starter</artifactId>
          <version>3.1.0</version>
      </dependency>

      <dependency>
          <groupId>org.apache.commons</groupId>
          <artifactId>commons-lang3</artifactId>
      </dependency>

      <dependency>
          <groupId>org.projectlombok</groupId>
          <artifactId>lombok</artifactId>
          <optional>true</optional>
      </dependency>

      <dependency>
          <groupId>org.springframework.boot</groupId>
          <artifactId>spring-boot-starter-test</artifactId>
      </dependency>
  </dependencies>

yml

spring:
  datasource:
    driver-class-name: dm.jdbc.driver.DmDriver
    # 达梦 模式名就相当于库名
    url: jdbc:dm://localhost:5236?schema=PERSON&compatibleMode=mysql&characterEncoding=UTF-8&useUnicode=true&useSSL=false&tinyInt1isBit=false&allowPublicKeyRetrieval=true&serverTimezone=Asia/Shanghai
    #写法二
    #url: jdbc:dm://localhost:5236/PERSON&compatibleMode=mysql&characterEncoding=UTF-8&useUnicode=true&useSSL=false&tinyInt1isBit=false&allowPublicKeyRetrieval=true&serverTimezone=Asia/Shanghai
    username: SYSDBA
    password: 123456789
mybatis-plus:
  configuration:
    # 驼峰转换 从数据库列名到Java属性驼峰命名的类似映射
    map-underscore-to-camel-case: false
    # 是否开启缓存
    cache-enable: false
    # 如果查询结果中包含空值的列,则 MyBatis 在映射的时候,不会映射这个字段
    #call-setters-on-nulls: true
    # 打印sql
    log-impl: org.apache.ibatis.logging.stdout.StdOutImpl

Address

@Data
@TableName(value = "PERSON.ADDRESS")
public class Address {

    @TableId(value = "ADDRESSID", type = IdType.AUTO)
    private Integer addressId;

    @TableField("ADDRESS1")
    private String address1;

    @TableField("ADDRESS2")
    private String address2;

    @TableField("CITY")
    private String city;

    @TableField("POSTALCODE")
    private String postaLoCode;
}

AddressMapper

public interface AddressMapper extends BaseMapper<Address> {
}

启动类

@MapperScan(basePackages = "cn.zysheep.mapper")
@SpringBootApplication
public class DmApplication {
    public static void main(String[] args) {
        SpringApplication.run(DmApplication.class, args);
    }
}

测试类

@SpringBootTest(classes = DmApplication.class)
public class AddressMapperTest{

    @Autowired
    DataSource dataSource;

    @Autowired(required = false)
    AddressMapper addressMapper;

    @Test
    public void test() throws SQLException {
        System.out.println(dataSource.getConnection());
    }
}

@Test
public void testSave() {
    Address address = new Address();
    address.setAddress1("长沙");
    address.setCity("长沙市天心区");
    address.setPostaLoCode("430001");
    addressMapper.insert(address);
}

在这里插入图片描述

@Test
public void testDeleteById() {
    addressMapper.deleteById("17");
}

@Test
public void testDelete() {
    Address address = new Address();
    address.setAddressId(14);
    address.setCity("长沙");
    detele(address);
}

public void detele(Address address) {

    //  eq(boolean condition, R column, Object val)
    //  第一个参数条件满足才拼接条件
    LambdaQueryWrapper<Address> queryWrapper = Wrappers.<Address>lambdaQuery()
            .eq(Objects.nonNull(address.getAddressId()), Address::getAddressId, address.getAddressId())
            .eq(StringUtils.isNotBlank(address.getCity()), Address::getCity, address.getCity());


    addressMapper.delete(queryWrapper);
}

在这里插入图片描述

@Test
public void testUpdateById() {
    Address address = new Address();
    address.setAddressId(17);
    address.setCity("长沙市芙蓉区");
    address.setPostaLoCode("430002");
    addressMapper.updateById(address);
}

@Test
public void testUpdate() {
    LambdaUpdateWrapper<Address> wrapper = Wrappers.<Address>lambdaUpdate()
            .set(Address::getCity, "长沙市岳麓区")
            .set(Address::getPostaLoCode,"430001")
            .eq(Address::getAddressId,"1");

    addressMapper.update(null,wrapper);
}

在这里插入图片描述

@Test
public void testSelect() {
    List<Address> selectList = addressMapper.selectList(Wrappers.emptyWrapper());
    System.out.println(selectList);
}

在这里插入图片描述

yml配置与实体类@TableName表映射问题

写法一: application.yml

# 写法一
spring:
  datasource:
   url: jdbc:dm://localhost:5236?schema=PERSON

实体类,@TableName可以不指定schema

@Data
@TableName(value = "ADDRESS")
public class Address {
	
}

写法二: application.yml

# 写法二
spring:
  datasource:
   url: jdbc:dm://localhost:5236/PERSON

实体类,@TableName必须指定schema,否则会找不到表

@Data
@TableName(value = "PERSON.ADDRESS")
public class Address {
	
}

在这里插入图片描述

实际开发中不管yml配置使用什么方式,都强烈建议@TableName(value = "PERSON.ADDRESS")指定schema。

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

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

相关文章

AI加速游戏开发 亚马逊云科技适配3大场景,打造下一代游戏体验

随着疫情的消散&#xff0c;中国游戏产业正在快速前进。在伴随着游戏产业升级的同时&#xff0c;整个行业都在面临着新的挑战与新的诉求。亚马逊云科技游戏研发解决方案和服务&#xff0c;覆盖端到端3大场景&#xff0c;为游戏公司与游戏开发人员赋能。 场景1&#xff1a;AI辅助…

memcached最大的优势是什么?

在Java中使用Memcached的最大优势之一是它提供了高性能的分布式缓存解决方案。Memcached是一个简单、快速、开源的内存缓存系统&#xff0c;可以帮助加速应用程序的访问速度&#xff0c;减轻数据库的负担&#xff0c;提高应用的扩展性和吞吐量。它常用于缓存频繁读取的数据&…

仿微信开发

介绍 一款仿微信界面的即时通讯APP, 采用uniapp开发(uview1.x版本),后端采用java.(springbootwebsocket) ####功能支持 1:添加好友,单聊,群聊群组的发起 2:支持文字,表情,语音,图片,文件信息的收发,离线消息推送仅限安卓(ios没证书,安卓需要自行申请unipush) 3:支持发送红包…

高压开关柜无线测温系统设计与实现 安科瑞 许敏

摘要&#xff1a;文章提出了一种用于小车式开关柜的无线测温系统&#xff0c;包括设于小车动触头套管上的温度传感器、环绕设于小车动触头上的电流传感器&#xff0c;温度传感器及电流传感器均分别连接有数据接收处理器&#xff0c;数据接收处理器电连接有设于小车式开关柜上的…

04 - 慎重使用正则表达式

在讲 String 对象优化时&#xff0c;提到了 Split() 方法&#xff0c;该方法使用的正则表达式可能引起回溯问题&#xff0c;今天就来深入了解下&#xff0c;这究竟是怎么回事&#xff1f; 开始之前&#xff0c;我们先来看一个案例&#xff0c;可以帮助你更好地理解内容。 在一…

uniapp兼容微信小程序和支付宝小程序遇到的坑

1、支付宝不支持v-show 改为v-if。 2、v-html App端和H5端支持 v-html &#xff0c;微信小程序会被转为 rich-text&#xff0c;其他端不支持 v-html。 解决方法&#xff1a;去插件市场找一个支持跨端的富文本组件。 3、导航栏处有背景色延伸至导航栏外 兼容微信小程序和支…

【装饰器设计模式详解】C/Java/JS/Go/Python/TS不同语言实现

简介 装饰器模式&#xff08;Decorator Pattern&#xff09;是一种结构型设计模式。将对象放入到一个特殊封装的对象中&#xff0c;为这个对象绑定新的行为&#xff0c;具备新的能力&#xff0c;同时又不改变其原有结构。 如果你希望在无需修改代码的情况下即可使用对象&…

《水经注地图服务》发布的卫星影像数据在OpenLayers中调用

OpenLayers是一个用于开发WebGIS客户端的JavaScript包。 OpenLayers 支持的地图来源包括Google Maps、Yahoo、 Map、微软Virtual Earth 等&#xff0c;用户还可以用简单的图片地图作为背景图&#xff0c;与其他的图层在OpenLayers 中进行叠加&#xff0c;在这一方面OpenLayers…

Linux6.15 Docker 私有仓库(harbor)

文章目录 计算机系统5G云计算第四章 LINUX Docker 私有仓库&#xff08;harbor&#xff09;一、搭建本地私有仓库二、Docker--harbor私有仓库部署与管理1.Harbor 简介1&#xff09;什么是Harbor2&#xff09;Harbor的特性3&#xff09;Harbor的构成 2.Harbor 部署1&#xff09;…

〔扩〕C# 调用Python

C# 调用Python 一、安装类库 pythonnet 谨慎使用IronPython&#xff0c;好像默认是2.7&#xff0c;运行部分外部引入的第三方包会报错 二、创建pyd 文件供c#调用 2.1 安装cython pip install cython2.2 准备自己的python文件 HtmlToMD.py import sys import html2text as ht…

电脑微信空间占用简便清理

1、打开电脑版微信、点击左下角的三根横线 2、点击左侧的“设置” 3、弹出层左侧点击“通用设置”->“存储空间管理” 4、点击清理缓存&#xff0c;或者管理 5、点击“管理”后&#xff0c;根据选择的筛选条件&#xff0c;勾线需要清理的&#xff0c;最后点击清理

TextClamp for Vue3.0(Vue3.0的文本展开收起组件)

呦&#xff01;大家好&#xff0c;好久没有更新博客了&#xff0c;最近实现了一个一直想自己完成的一个东西&#xff0c;就是文本的展开收起组件&#xff0c;以前项目需要用到&#xff0c;自己实现一个又太繁琐&#xff0c;所以那个时候都是用的别人的轮子&#xff0c;现在自己…

两种接入微信小程序智能客服对话的方式

微信小程序 此处提供两种接入微信小程序的方式。 方式一&#xff1a;扫码将机器人绑定至指定小程序&#xff0c;通过小程序内的客服组件开启智能对话功能&#xff1b; 方式二&#xff1a;通过小程序插件接入。 方式一&#xff1a;后台扫码绑定 流程示意 效果展示 使用页面…

RPA界面元素定位与操控技术详解-达观数据

RPA 入门介绍 什么是 RPA&#xff1f;RPA 是机器人流程自动化 Robotic Process Automation 的简写。在《智能RPA实战》中&#xff0c;我们这样定义&#xff1a;通过特定的、可模拟人类在计算机界面上进行操作的技术&#xff0c;按照规则自动执行相应的流程任务&#xff0c;代替…

代码随想录额外题目| 数组03 ●34排序数组查首尾位置 ●922按奇偶排序数组II●35搜索插入位置

#34排序数组查首尾位置 medium&#xff0c;我写的:1 暴力 vector<int> searchRange(vector<int>& nums, int target) {int start-1;int end-1;for(int i0;i<nums.size();i){if(nums[i]target && start-1) starti;if(nums[i]target && sta…

Photoshop-Beta智能版ps安装教程

Photoshop-Beta智能版ps安装教程 获取方式 安装包工具&#xff0c;关注公众号搜索 荷逸云&#xff0c;发送关键词&#xff1a;ps&#xff0c;即可获得 安装教程 0&#xff1a;注意事项 注意&#xff1a;安装此工具需要魔法上网&#xff0c;获取魔法方式&#xff1a; http…

工业以太网的发展历程与应用前景

工业以太网是在工业自动化和物联网领域广泛使用的通信网络&#xff0c;它具有应用广泛、价格低廉、通信速率高、软硬件产品丰富、应用支持技术成熟等优点&#xff0c;目前它已经在工业企业综合自动化系统中的资源管理层、执行制造层得到了广泛应用&#xff0c;并呈现向下延伸直…

数据结构和算法二(基础查找问题)

一、列表查找&#xff1a; index()&#xff0c;是线性查找&#xff0c;因为二分查找需要进行排序 1、顺序查找 def linear_search(data_set,value):for ind,val in enumerate(data_set):if valvalue:return indelse:return时间复杂度O(n)&#xff0c;从头到尾循环一遍 2、二分…

LED像素间距是什么?

像素间距是指LED显示屏上像素&#xff08;LED晶元&#xff09;之间的距离&#xff0c;也称为点间距&#xff0c;它与显示屏的分辨率相关。具体来说&#xff0c;它描述的是从某一像素的中心到相邻像素中心的距离&#xff0c;单位通常为毫米。像素间距的大小反映了两个像素之间的…

Rancher 加入集群

一、设置rancher为中文界面 1、点击右上角图标--》preferences 2、切换语言&#xff1a;默认为英文&#xff0c;切换成简体中文即可 3、切换成中文后的界面 二、导入K3S集群 1、点击导入已有集群 2、选择集群--》通用 3、输入集群的名字--》创建 4、根据下面的提示&#xff0…