Floodlight源码阅读之内存数据库(二)

2024-05-10 18:18

本文主要是介绍Floodlight源码阅读之内存数据库(二),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

上一篇文章介绍内存数据的最基础结构但那远远不能满足需求,需要再次封装一下。首先看看一个创建数据库的方法

        Set<String> indexedColumnNames = new HashSet<String>();//初始化表列map
indexedColumnNames.add(PERSON_FIRST_NAME);
indexedColumnNames.add(PERSON_LAST_NAME);//添加表列
storageSource.setExceptionHandler(null);//添加异常处理方法
storageSource.setDebugCounterService(new MockDebugCounterService());
storageSource.createTable(PERSON_TABLE_NAME, indexedColumnNames);//创建表
上面的方法创建了一个table。然后就往表里面添加数据

  <span style="white-space:pre">	</span>Map<String,Object> rowValues = createPersonRowValues(personData);storageSource.insertRow(PERSON_TABLE_NAME, rowValues);//表添加行

每行都是一个map,插入数据过后就可以查询数据了

下面第一个是简单查询

String[] columnList = {PERSON_FIRST_NAME,PERSON_LAST_NAME};Object[][] expectedResults = {{"Lisa", "Jones"},{"Susan", "Jones"}};IPredicate predicate = new OperatorPredicate(PERSON_LAST_NAME, OperatorPredicate.Operator.EQ, "Jones");IQuery query = storageSource.createQuery(PERSON_TABLE_NAME, columnList, predicate, new RowOrdering(PERSON_SSN));IResultSet resultSet = storageSource.executeQuery(query);
当然也支持复杂查询

        String[] columnList = {PERSON_FIRST_NAME,PERSON_LAST_NAME};Object[][] expectedResults = {{"Lisa", "Jones"}};IResultSet resultSet = storageSource.executeQuery(PERSON_TABLE_NAME, columnList,new CompoundPredicate(CompoundPredicate.Operator.AND, false,new OperatorPredicate(PERSON_LAST_NAME, OperatorPredicate.Operator.EQ, "Jones"),new OperatorPredicate(PERSON_FIRST_NAME, OperatorPredicate.Operator.EQ, "Lisa")),new RowOrdering(PERSON_SSN));

查询支持AND查询和OR组合查询,上面的例子展示了AND查询,OR的就不演示了

如果查询需要传参

        String[] columnList = {PERSON_FIRST_NAME,PERSON_LAST_NAME, PERSON_AGE};        Object[][] expectedResults = {{"John", "Smith", 40},{"Bjorn", "Borg", 55},{"John", "McEnroe", 53}};IPredicate predicate = new OperatorPredicate(PERSON_AGE, OperatorPredicate.Operator.GTE, "?MinimumAge?");IQuery query = storageSource.createQuery(PERSON_TABLE_NAME, columnList, predicate, new RowOrdering(PERSON_SSN));query.setParameter("MinimumAge", 40);IResultSet resultSet = storageSource.executeQuery(query);
这样就可以实现参数传递了刚才创建的表是有主键的那么通过主机删除是很简单的

<span style="white-space:pre">	</span>storageSource.deleteRow(PERSON_TABLE_NAME, "111-11-1111");
简单高效,如果你想通过查询再删除也是可以的

        // Query once to delete the rowsIResultSet resultSet = storageSource.executeQuery(PERSON_TABLE_NAME, PERSON_COLUMN_LIST, null, new RowOrdering(PERSON_SSN));for (int i = 0; i < 4; i++) {resultSet.next();resultSet.deleteRow();}resultSet.save();resultSet.close();
还有更牛的是删除匹配行

storageSource.deleteMatchingRows(PERSON_TABLE_NAME, new OperatorPredicate(PERSON_AGE, OperatorPredicate.Operator.LT, 40));
实现删除年龄大于40岁的person删除,CURD剩下UPDATE了

 <span style="white-space:pre">	</span>Map<String,Object> updateValues = new HashMap<String,Object>();updateValues.put(PERSON_FIRST_NAME, "Tennis");updateValues.put(PERSON_AGE, 60);IPredicate predicate = new OperatorPredicate(PERSON_AGE, OperatorPredicate.Operator.GT, 50);IResultSet resultSet = storageSource.executeQuery(PERSON_TABLE_NAME, null, predicate, new RowOrdering(PERSON_SSN));while (resultSet.next()) {String key = resultSet.getString(PERSON_SSN);storageSource.updateRow(PERSON_TABLE_NAME, key, updateValues);}resultSet.close();

先构造一个更新对象,然后通过主键更新,和上面查询删除例子一样查询更新也可以

        IPredicate predicate = new OperatorPredicate(PERSON_AGE, OperatorPredicate.Operator.GT, 50);IResultSet resultSet = storageSource.executeQuery(PERSON_TABLE_NAME, null, predicate, null);while (resultSet.next()) {resultSet.setString(PERSON_FIRST_NAME, "Tennis");resultSet.setInt(PERSON_AGE, 60);}resultSet.save();resultSet.close();

ok,一个简单NQSQL数据的API封装就介绍到这里








这篇关于Floodlight源码阅读之内存数据库(二)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/977192

相关文章

SQL Server修改数据库名及物理数据文件名操作步骤

《SQLServer修改数据库名及物理数据文件名操作步骤》在SQLServer中重命名数据库是一个常见的操作,但需要确保用户具有足够的权限来执行此操作,:本文主要介绍SQLServer修改数据... 目录一、背景介绍二、操作步骤2.1 设置为单用户模式(断开连接)2.2 修改数据库名称2.3 查找逻辑文件名

SQL Server数据库死锁处理超详细攻略

《SQLServer数据库死锁处理超详细攻略》SQLServer作为主流数据库管理系统,在高并发场景下可能面临死锁问题,影响系统性能和稳定性,这篇文章主要给大家介绍了关于SQLServer数据库死... 目录一、引言二、查询 Sqlserver 中造成死锁的 SPID三、用内置函数查询执行信息1. sp_w

C++高效内存池实现减少动态分配开销的解决方案

《C++高效内存池实现减少动态分配开销的解决方案》C++动态内存分配存在系统调用开销、碎片化和锁竞争等性能问题,内存池通过预分配、分块管理和缓存复用解决这些问题,下面就来了解一下... 目录一、C++内存分配的性能挑战二、内存池技术的核心原理三、主流内存池实现:TCMalloc与Jemalloc1. TCM

Redis过期删除机制与内存淘汰策略的解析指南

《Redis过期删除机制与内存淘汰策略的解析指南》在使用Redis构建缓存系统时,很多开发者只设置了EXPIRE但却忽略了背后Redis的过期删除机制与内存淘汰策略,下面小编就来和大家详细介绍一下... 目录1、简述2、Redis http://www.chinasem.cn的过期删除策略(Key Expir

Druid连接池实现自定义数据库密码加解密功能

《Druid连接池实现自定义数据库密码加解密功能》在现代应用开发中,数据安全是至关重要的,本文将介绍如何在​​Druid​​连接池中实现自定义的数据库密码加解密功能,有需要的小伙伴可以参考一下... 目录1. 环境准备2. 密码加密算法的选择3. 自定义 ​​DruidDataSource​​ 的密码解密3

Maven项目中集成数据库文档生成工具的操作步骤

《Maven项目中集成数据库文档生成工具的操作步骤》在Maven项目中,可以通过集成数据库文档生成工具来自动生成数据库文档,本文为大家整理了使用screw-maven-plugin(推荐)的完... 目录1. 添加插件配置到 pom.XML2. 配置数据库信息3. 执行生成命令4. 高级配置选项5. 注意事

在Java中基于Geotools对PostGIS数据库的空间查询实践教程

《在Java中基于Geotools对PostGIS数据库的空间查询实践教程》本文将深入探讨这一实践,从连接配置到复杂空间查询操作,包括点查询、区域范围查询以及空间关系判断等,全方位展示如何在Java环... 目录前言一、相关技术背景介绍1、评价对象AOI2、数据处理流程二、对AOI空间范围查询实践1、空间查

Python+PyQt5实现MySQL数据库备份神器

《Python+PyQt5实现MySQL数据库备份神器》在数据库管理工作中,定期备份是确保数据安全的重要措施,本文将介绍如何使用Python+PyQt5开发一个高颜值,多功能的MySQL数据库备份工具... 目录概述功能特性核心功能矩阵特色功能界面展示主界面设计动态效果演示使用教程环境准备操作流程代码深度解

MySQL数据库实现批量表分区完整示例

《MySQL数据库实现批量表分区完整示例》通俗地讲表分区是将一大表,根据条件分割成若干个小表,:本文主要介绍MySQL数据库实现批量表分区的相关资料,文中通过代码介绍的非常详细,需要的朋友可以参考... 目录一、表分区条件二、常规表和分区表的区别三、表分区的创建四、将既有表转换分区表脚本五、批量转换表为分区

8种快速易用的Python Matplotlib数据可视化方法汇总(附源码)

《8种快速易用的PythonMatplotlib数据可视化方法汇总(附源码)》你是否曾经面对一堆复杂的数据,却不知道如何让它们变得直观易懂?别慌,Python的Matplotlib库是你数据可视化的... 目录引言1. 折线图(Line Plot)——趋势分析2. 柱状图(Bar Chart)——对比分析3