自己本地模拟内存数据库增删改查

目录

    • 学习初衷
    • 准备
    • 代码实现
    • 结果
    • 感谢阅读

学习初衷

  • 用于满足自己的测试要求,不连接数据库,也不在意数据丢失

准备

  1. maven依赖

    org.springframework.boot
    spring-boot-starter-test
    test

代码实现

  1. 内存数据库(InMemoryDatabase)
  • 使用了单例模式,程序启动就创建
package com.kwan.springbootkwan.test.lykj;import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.ObjectMapper;import java.util.HashMap;
import java.util.Map;
import java.util.Set;public class InMemoryDatabase {private static InMemoryDatabase instance;public final Map<String, HashMap<String, String>> database;private InMemoryDatabase() {this.database = new HashMap<>();}public static synchronized InMemoryDatabase getInstance() {if (instance == null) {instance = new InMemoryDatabase();}return instance;}public void insert(String tableName, String primaryKey, String data) throws JsonProcessingException {if (!database.containsKey(tableName)) {database.put(tableName, new HashMap<String,String>());}database.get(tableName).put(primaryKey, data);}public Object query(String tableName, String primaryKey, Class<?> clazz) throws JsonProcessingException {Set<String> tableSet = database.keySet();if (!tableSet.contains(tableName)) {return null;}String jsonData = database.get(tableName).get(primaryKey);if (jsonData == null) {return null;}ObjectMapper mapper = new ObjectMapper();return mapper.readValue(jsonData, clazz);}public String delete(String tableName, String primaryKey) {return database.get(tableName).remove(primaryKey);}public void update(String tableName, String primaryKey, String updatedJsonData) {Map<String, String> table = database.get(tableName);if (table != null) {table.put(primaryKey, updatedJsonData);} else {throw new IllegalArgumentException("Table " + tableName + " does not exist.");}}
}
  1. 测试增删改查方法
package com.kwan.springbootkwan.test.lykj.memorydb;import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.ObjectMapper;import java.util.HashMap;
import java.util.Map;
import java.util.Set;public class InMemoryDatabase {private static InMemoryDatabase instance;public final Map<String, HashMap<String, String>> database;private InMemoryDatabase() {this.database = new HashMap<>();}public static synchronized InMemoryDatabase getInstance() {if (instance == null) {instance = new InMemoryDatabase();}return instance;}public void insert(String tableName, String primaryKey, String data) throws JsonProcessingException {if (!database.containsKey(tableName)) {database.put(tableName, new HashMap<String,String>());}database.get(tableName).put(primaryKey, data);}public Object query(String tableName, String primaryKey, Class<?> clazz) throws JsonProcessingException {Set<String> tableSet = database.keySet();if (!tableSet.contains(tableName)) {return null;}String jsonData = database.get(tableName).get(primaryKey);if (jsonData == null) {return null;}ObjectMapper mapper = new ObjectMapper();return mapper.readValue(jsonData, clazz);}public String delete(String tableName, String primaryKey) {return database.get(tableName).remove(primaryKey);}public void update(String tableName, String primaryKey, String updatedJsonData) {Map<String, String> table = database.get(tableName);if (table != null) {table.put(primaryKey, updatedJsonData);} else {throw new IllegalArgumentException("Table " + tableName + " does not exist.");}}
}

结果

在这里插入图片描述

感谢阅读

感谢您阅读 这篇文章,我们探索了自己本地模拟内存数据库增删改查
谢谢您的陪伴! 如果您有任何问题、建议或想要了解的特定主题,请随时在评论中告诉我们。我们期待与您共同探索java,共同提升我们的Java开发技能!

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

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

相关文章

[AutoSar]BSW_Com08 CAN driver 模块介绍及参数配置说明 (二)

目录 关键词平台说明一、CanControllers二、CanTxProcessing三、CanFilterMask四、CanHardwareObjects五、CanGeneral 关键词 嵌入式、C语言、autosar、OS、BSW 平台说明 项目ValueOSautosar OSautosar厂商vector &#xff0c;芯片厂商TI 英飞凌编程语言C&#xff0c;C编译器…

游戏引擎分层简介

游戏引擎分层架构&#xff08;自上而下&#xff09; 工具层&#xff08;Tool Layer&#xff09; 在一个现代游戏引擎中&#xff0c;我们最先看到的可能不是复杂的代码&#xff0c;而是各种各样的编辑器&#xff0c;利用这些编辑器&#xff0c;我们可以制作设计关卡、角色、动画…

数据类型和变量

1.数据类型 在Java中数据类型主要分为两类&#xff1a;基本数据类型和引用数据类型。 基本数据类型有四类八种&#xff1a; 1. 四类&#xff1a;整型、浮点型、字符型以及布尔型 2.八种&#xff1a; 整形是分为如上四种 byte short int long 浮点型分为 float 和double …

Docker Compose系列--搭建halo与mysql

原文网址&#xff1a;使用Docker Compose系列--搭建halo与mysql_IT利刃出鞘的博客-CSDN博客 简介 说明 本文介绍如何使用Docker Compose搭建halo与mysql。 官网网址 使用 Docker 部署 Halo 和 MySQL | Halo Documents Docker Compose搭建mysql 见&#xff1a;Docker Com…

【大厂AI课学习笔记NO.64】机器学习开发框架

机器学习开发框架本质上是一种编程库或工具&#xff0c;目的是能够让开发人员更容易、更快速地构建机器学习模型。 机器学习开发框架封装了大量的可重用代码&#xff0c;可以直接调用&#xff0c;目的是避免“重复造轮子’大幅降低开发人员的开发难度&#xff0c;提高开发效率…

软考高级:候选码、主码、全码、外码、主属性、主键、主关键字、非主属性概念和例题

一、AI 讲解 候选码、主码、全码、外码、主属性、主键、主关键字、非主属性是数据库设计和数据建模中的基本概念&#xff0c;特别是在关系数据库模型中。下面将对这些概念进行简单讲解&#xff0c;并给出相应的例子。 概念讲解 候选码&#xff08;Candidate Key&#xff09;…

Spring框架精髓:带你手写IoC

个人名片&#xff1a; &#x1f43c;作者简介&#xff1a;一名大三在校生&#xff0c;喜欢AI编程&#x1f38b; &#x1f43b;‍❄️个人主页&#x1f947;&#xff1a;落798. &#x1f43c;个人WeChat&#xff1a;hmmwx53 &#x1f54a;️系列专栏&#xff1a;&#x1f5bc;️…

足球青训俱乐部|基于Springboot的足球青训俱乐部管理系统设计与实现(源码+数据库+文档)

足球青训俱乐部管理系统目录 目录 基于Springboot的足球青训俱乐部管理系统设计与实现 一、前言 二、系统设计 1、系统架构设计 三、系统功能设计 1、管理员登录界面 2、公告信息管理界面 3、学员管理界面 4、商品信息管理界面 5、课程安排管理界面 四、数据库设计…

ArcGIS Runtime For Android开发之符号化和图层渲染

一、用Symbol对要素进行符号化 首先我们看一下Symbol 接口关系&#xff1a; 1、SimpleFillSymbol 他是用来进行简单的Graphic面要素填充符号化的&#xff0c;它可以设置要素的填充颜色&#xff0c;边线颜色、线宽&#xff0c;其用法如下&#xff1a; Polygon polygonnew Po…

常用的电阻、电容的种类和应用场合?

电阻的 a.按阻值特性:固定电阻、可调电阻、特种电阻(敏感电阻)&#xff0c;不能调节的,我们称之为固定电阻,而可以调节的,我们称之为可调电阻.常见的例如收音机音量调节的,主要应用于电压分配的,我们称之为电位器. b.按制造材料:碳膜电阻、金属膜电阻、线绕电阻&#xff0c;捷…

Go切片特点笔记

特点 1.只有append操作2.支持子切片3.内存共享问题 1.只有append操作 不支持随机增删 2.支持子切片 数组和切片都可以通过[start:end] 的形式 来获取子切片: 1.arr[start:end],获得[start,end)之间的元素。 2.arr[:end],获得[0,end)之间的元素。 3.arr[start:],获得[start,l…

二叉树叶节点个数,根节点个数,树的深度,查找数据为x的节点

文章目录 一、计算二叉树叶节点个数二、叶节点的个数 引言&#xff1a;补充树的概念 节点的度&#xff1a;一个节点含有的子树的个数称为节点的度 叶节点或终端节点&#xff1a;度为0的节点称为叶节点 节点的层次&#xff1a;从根开始为第一层&#xff0c;以此类推 树的度&…

Leetcode150二刷总结

滑动窗口&#xff08;ok&#xff09; 题号&#xff1a;3、209、76 定义好窗口的左边界left和右边界right一般是只需要遍历right&#xff0c;满足条件后调整left 链表 题号&#xff1a;206、92、146、25、21 反转链表主要是设置好pre&#xff08;初始为null&#xff09;和c…

【Godot 4.2】Tree控件与TreeItem完全解析

概述 本篇是控件完全解析系列之一&#xff0c;主要总结一下Tree控件与TreeItem的使用。 Tree控件是一个非常强大的控件&#xff0c;尤其是在编写一些相关的程序或编辑器插件时&#xff0c;非常适合展示树形组织的节点型数据。 本篇将从简单的添加根节点&#xff0c;根节点子…

uniapp和vue项目配置多语言,实现前端切换语言

在uniapp中配置多语言功能&#xff0c;实现前端切换语言&#xff0c;可以按照以下步骤进行&#xff1a; 1. 创建语言包 首先&#xff0c;创建一个名为 lang 的目录&#xff0c;并在该目录下为每种支持的语言创建对应的JSON或JS文件。例如&#xff1a; lang/en.js&#xff08…

Threejs之场景标注标签信息CSS2DRenderer

参考资料 CSS2DRenderer(HTML标签)…单击按钮关闭HTML标签 知识点 注&#xff1a;基于Three.jsv0.155.0 CSS2DRenderer(HTML标签) HTML标签遮挡Canvas画布事件Canvas尺寸变化(HTML标签)标签位置不同设置方式标签位置(标注工厂设备)标签指示线或箭头指向标注点鼠标选中模型…

Microsoft PyRIT能自动化完成AI红队的任务

每周跟踪AI热点新闻动向和震撼发展 想要探索生成式人工智能的前沿进展吗&#xff1f;订阅我们的简报&#xff0c;深入解析最新的技术突破、实际应用案例和未来的趋势。与全球数同行一同&#xff0c;从行业内部的深度分析和实用指南中受益。不要错过这个机会&#xff0c;成为AI领…

两数相加的问题

题目是&#xff1a;给两个非空的链表&#xff0c;表示两个非负整数。它们每位数都是按照逆序的方式存储&#xff0c;并且每一个节点只能存储一位数字。现在两个数相加&#xff0c;并且以相同的形式返回一个表示和的链表。 首先回顾一下&#xff0c;什么是链表&#xff1f;链表…

《异常检测——从经典算法到深度学习》26 Time-LLM:基于大语言模型的时间序列预测

《异常检测——从经典算法到深度学习》 0 概论1 基于隔离森林的异常检测算法 2 基于LOF的异常检测算法3 基于One-Class SVM的异常检测算法4 基于高斯概率密度异常检测算法5 Opprentice——异常检测经典算法最终篇6 基于重构概率的 VAE 异常检测7 基于条件VAE异常检测8 Donut: …

使用递归方法和类数组两种方法计算斐波那契数列

菲波纳契数列又称"菲波纳契神奇数列"&#xff0c;是由13世纪的意大利数学家菲波纳契提出的&#xff0c;当时是和兔子的繁殖问题有关的&#xff0c;它是一个很重要的数学模型。这个问题是:有小兔一对&#xff0c;若第二个月它们成年&#xff0c;第三个月生下小兔一对&…