Java SpringBoot测试OceanBase

对上篇mysql导入到OceanBase中的数据库进行代码测试,写了个demo包含测试方法,在原mysql库中成功执行,迁移到OceanBase时看是否能不修改业务代码而成功执行测试方法:

  • 代码基于SpringBoot + MyBastis
  • 测试增删改查、批量新增、多表联查、事务

只修改pom依赖和连接配置

<!-- OceanBase驱动包 -->
<dependency>
    <groupId>com.oceanbase</groupId>
    <artifactId>oceanbase-client</artifactId>
    <version>2.4.3</version>
</dependency>
# oceanbase连接信息
spring.datasource.driverClassName=com.oceanbase.jdbc.Driver
spring.datasource.url=jdbc:oceanbase://192.168.113.161:2883/employees?useSSL=false&useUnicode=true&characterEncoding=utf-8&useServerPrepStmts=true&rewriteBatchedStatements=true
spring.datasource.username=root@mq_t1#zycluster
spring.datasource.password=/aVi*H8(0%FS_YwZ-|dmo&[hjlT7pe@E

Java测试类代码

package com.zypcy.ob_demo;

import com.alibaba.fastjson2.JSON;
import com.zypcy.ob_demo.dto.EmployeesSalariesDto;
import com.zypcy.ob_demo.entity.Employees;
import com.zypcy.ob_demo.service.EmployeesService;
import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.Assertions;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.Date;
import java.util.List;

@SpringBootTest
class ObDemoApplicationTests {

    @Autowired
    EmployeesService employeesService;

    @Test
    void contextLoads() {
    }

    public Employees initEmployees(int empNo) {
        Employees employees = new Employees();
        employees.setEmpNo(empNo);
        employees.setBirthDate(new Date());
        employees.setFirstName("zhu");
        employees.setLastName("yu");
        employees.setGender("M");
        employees.setHireDate(new Date());
        return employees;
    }

    @Test
    public void testEmployees() {
        //测试单条数据的插入、更新、删除、查询
        Employees employees = initEmployees(500000);
        //新增一条记录
        boolean flag = employeesService.insert(employees);
        Assertions.assertTrue(flag, "插入操作失败");

        //查询新增但记录
        Employees insertedEmployee = employeesService.selectByPrimaryKey(employees.getEmpNo());
        System.out.println("插入后的记录: " + JSON.toJSONString(insertedEmployee));

        //更新记录
        employees.setLastName("yu2");
        flag = employeesService.updateByPrimaryKey(employees);
        Assertions.assertTrue(flag, "更新操作失败");

        // 查询更新后的记录
        Employees employees2 = employeesService.selectByPrimaryKey(employees.getEmpNo());
        System.out.println("更新后的记录: " + JSON.toJSONString(employees2));

        flag = employeesService.deleteByPrimaryKey(employees.getEmpNo());
        Assertions.assertTrue(flag, "删除操作失败");
    }

    @Test
    public void testBatchInsert() {
        //测试批量插入,测试三次,看下耗时
        int length = 200;
        Long d1 = System.currentTimeMillis();
        List<Employees> employeesList = new ArrayList<>(length);
        for (int i = 1; i <= length; i++) {
            Employees model = new Employees();
            int empNo = 610000 + i;
            model.setEmpNo(empNo);
            model.setBirthDate(new Date());
            model.setFirstName("zhu" + empNo);
            model.setLastName("yu" + empNo);
            model.setGender("M");
            model.setHireDate(new Date());
            employeesList.add(model);
        }
        boolean flag = employeesService.batchInsert(employeesList);
        Assertions.assertTrue(flag);

        Long d2 = System.currentTimeMillis();
        System.out.println("批量插入耗时=" + (d2 - d1) + "ms");
    }

    @Test
    public void selectEmployeesSalariesByEmpNos() {
        //测试多表关联查询
        List<EmployeesSalariesDto> list = employeesService.selectEmployeesSalariesByEmpNos(Arrays.asList(10001, 10002, 10003));
        System.out.println("list.size=" + list.size());
        Assertions.assertTrue(list.size() > 0);
    }

    @Test
    public void testTransaction() {
        //测试事务,往3张表分别插入一条记录,在第三张表插入时主动抛出异常,查看前两张表的数据是否回滚
        Employees employees = initEmployees(650000);
        boolean flag = employeesService.testTransaction(employees);
        Assertions.assertTrue(flag);
    }

}

以上代码先在mysql环境中全部执行一遍
然后连接OceanBase库,对每个(增、删、改、查、批量新增、多表关联查询、事务)方法进行测试,贴几张截图
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

下面这张图片时测试事物的,往3张表新增数据(插入一条编号为65000的员工),在第3张表新增前写一个错误来抛出异常,被@Transactional 捕获到而回滚,右边是数据库去查询编号=650000的员工是否存在,验证事务是否回滚了
在这里插入图片描述
经测试得出,在mysql中能执行的sql能照常在OceanBase中执行,只要修改OceanBase客户端和数据库连接字符串即可运行,无需修改业务sql代码

源码下载:https://download.csdn.net/download/zhuyu19911016520/88869926

用了Spring @Transactional(rollbackFor = Exception.class)声明式事务,需要依赖

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-aop</artifactId>
</dependency>
<dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-tx</artifactId>
</dependency>

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

onnx 1.16 doc学习笔记一:ONNX概念

onnx作为一个通用格式&#xff0c;很少有中文教程&#xff0c;因此开一篇文章对onnx 1.16文档进行翻译与进一步解释&#xff0c; onnx 1.16官方文档&#xff1a;https://onnx.ai/onnx/intro/index.html](https://onnx.ai/onnx/intro/index.html)&#xff0c; 如果觉得有收获&am…

【Redis服务搭建】

目录 Redis的修改配置启动以及参数调优Redis的常用基本操作Redis运维监控命令Redis的配置的动态更新和写入Redis的多用户管理Redis的慢日志Redis禁用危险命令和压测工具Redis持久化存储1.Redis的RDB持久化存储2.Redis的AOF持久化存储 Redis的主从复制redis的哨兵实现主从自动切…

信号信号槽

三、信号槽 概念 信号和槽是两种函数&#xff0c;这是Qt在C基础上新增的特性&#xff0c;类似于其他技术中的回调的概念。 信号槽通过程序员提前设定的“约定”&#xff0c;可以实现对象之间的通信&#xff0c;有两个先决条件。 通信的对象都是在QOBject类中派生出来的。 QOBje…

提升App推广效果,从优化落地页开始

在App推广过程中&#xff0c;落地页的转化率一直是推广运营者关注的重点。然而&#xff0c;很多运营者发现&#xff0c;即使使用了相同的工具和模板&#xff0c;别人的效果却远远超出自己。那么&#xff0c;问题到底出在哪里呢&#xff1f;今天&#xff0c;我们就来聊聊如何提升…

便携式气象站的安装注意事项

型号推荐&#xff1a;云境天合TH-BQX9】便携式气象站的安装注意事项包括以下几点&#xff1a; 安装前检查&#xff1a;在安装前&#xff0c;应对便携式气象站进行检查&#xff0c;确保设备的包装完好无损&#xff0c;配件齐全&#xff0c;如气象站传感器、支架、采集器和传输模…

链表和顺序表的优劣分析及其时间、空间复杂度分析

链表和顺序表的优劣分析及其时间、空间复杂度分析 一、链表和顺序表的优劣分析二、算法复杂度<font face "楷体" size 5 color blue>//上面算法的执行次数大致为&#xff1a;F&#xff08;N&#xff09; N^22*N10;   N 10,F(10) 1002010 130次   N 1…

提高学习效率和速度的方法

如下是一些策略和方法来帮助提高学习效率和速度&#xff1a; 1. **主动学习**&#xff1a;主动寻找信息并提出问题&#xff0c;而不是被动接受。这样可以提高您的学习动力和效率。 2. **分块学习**&#xff1a;将复杂的知识点分解成小块&#xff0c;逐一理解和掌握。这种方法可…

unity屏幕受伤特效

//使用用途&#xff1a;同于屏幕掉血的后处理特效 //请结合和脚本&#xff1a;BloodScreen 挂载至摄像机使用本特效 //本特效设计之初未考虑兼容移动设备&#xff0c;请注意//使用说明&#xff1a; //掉血获取此脚本&#xff0c;将showBlood设置为true&#xff0c;如果您需要更…

Js的 Promise的 then catch 笔记240222

Js的 Promise的 then catch 笔记240222 基本用法 new Promise(f>{setTimeout(ev>{f("一秒后输出控制台");},1000); }).then(f的参数>{console.log(f的参数); }); // 控制台输出: 一秒后输出控制台上面代码中, f 的标准名叫做 resolve , 所以应该写成 new …

函数栈帧的创建及销毁(超详解)

目录 1.预备知识 1.1内存区的划分 1.2认识相关寄存器和汇编指令 1.2.1寄存器 1.2.2相关汇编指令 2.测试前 2.1测试代码及环境 2.2 main函数也是被其他函数调用的 3.函数栈帧的创建 4.进入函数内部 5.形参与实参 6.call/jump add函数 7.函数栈帧的销毁 7.1保存…

使用python查看官网是否发布新的内容

目录 前言 第一章、python介绍和使用pip install下载包 1.python介绍 2.使用vscode编写python 3.pip install的使用 第二章、查看官网是否发布新的内容 第三章、代码实现 目录结构 代码实现 check_new_news.py files.py news.py main.py file.txt 运行演示 前言 也…

【已解决】@tableid can‘t more than one

实体里面不能有两个TableId&#xff0c;只留一个就好了

SpringBoot对于SpringMVC的支持

创建项目 版本说明这里使用的 SpringBoot 2.0.0.Release SpringBoot对于SpringMVC的支持 在之前的开发中很多场景下使用的是基于xml配置文件或者是Java配置类的方式来进行SpringMVC的配置。一般来讲&#xff0c;初始的步骤如下所示 1、初始化SpringMVC的DispatcherServlet2、…

[OpenAI]继ChatGPT后发布的Sora模型原理与体验通道

前言 前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家&#xff1a;https://www.captainbed.cn/z ChatGPT体验地址 文章目录 前言OpenAI体验通道Spacetime Latent Patches 潜变量时空碎片, 建构视觉语言系统…

kettle计算增长率

kettle计算增长率 问题描述处理方法 问题描述 读取一段时间内的数据记录&#xff0c;计算相邻记录的比率 iddatevalue12024-01-0110012024-01-0211012024-01-0312012024-01-0490 处理方法 1.使用统计中的分析查询节点能在每一行中添加前后行的数据 2.使用计算器节点计算比…

音视频基础概念笔记

RGB 色彩空间更适合图像采集和显示&#xff0c; YUV 空间用于编码和存储则比较好。 无论是 RGB 还是 YUV &#xff0c;他们都是 表达 色彩信息的一种方式。 &#xff08;Human Visual System&#xff09;人类视觉系统 色度感知 包含两个维度&#xff1a;色调&#xff08;Hue&…

ELK入门(四)-logstash

Logstash Logstash 是开源的服务器端数据处理管道&#xff0c;能够同时从多个来源采集数据&#xff0c;转换数据&#xff0c;然后将数据发送到您最喜欢的存储库中。 Logstash 能够动态地采集、转换和传输数据&#xff0c;不受格式或复杂度的影响。利用 Grok 从非结构化数据中…

WebService学习,wsdl文件详解

目录 第一章、起因1.1&#xff09;学习原因1.2&#xff09;提问的过程&#xff08;逐步提出问题&#xff09;1、&#xff1f;wsdl链接的含义&#xff0c;有什么作用&#xff1f;2、什么是wsdl文档&#xff1f;3、如何阅读wsdl文件&#xff1f;4、wsdl文件有什么作用&#xff1f…

Linux编译器---gcc/g++使用详解

目录 前言 gcc/g介绍 gcc/g的编译指令&#xff08;以gcc为例&#xff09; ​编辑 gcc选项 预处理(进行宏替换) 编译&#xff08;生成汇编&#xff09; 汇编&#xff08;生成机器可识别代码&#xff09; 链接&#xff08;生成可执行文件或库文件&#xff09; 函数库 概念 …

Vue单文件学习项目综合案例Demo,黑马vue教程

文章目录 前言一、小黑记事本二、购物车三、小黑记账清单 前言 bilibili视频地址 一、小黑记事本 效果图 主代码 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"/><meta http-equiv"X-UA-Compatible&…