Nop入门:极简数据访问层实现

Nop平台的数据访问层使用NopORM引擎,它的功能相当于JPA + MyBatis + SpringData,并且内置了多租户、逻辑删除、动态扩展字段、字段加密等业务常用功能。
NopGraphQL服务框架会自动自动识别ORM的实体对象,自动使用ORM引擎去实现实体关联属性的批量加载。

Nop平台的标准开发模式是先设计数据模型,然后再根据数据模型生成Java实体代码,但是这只是简化开发的一种方式。NopORM支持动态数据模型,我们可以跳过代码生成的步骤
直接手工编写数据模型文件,从而实现数据库访问层。

最简单的数据访问层开发步骤如下:

一. 编写app.orm.xml文件

Nop平台启动时会自动加载所有模块的orm目录下的app.orm.xml文件。

例如/_vfs/nop/demo/orm/app.orm.xml。 nop/orm目录下具有文件_module,表示它是一个Nop模块。

<orm x:schema="/nop/schema/orm/orm.xdef" xmlns:x="/nop/schema/xdsl.xdef"><entities><entity name="app.demo.DemoEntity" tableName="demo_entity"className="io.nop.orm.support.DynamicOrmEntity" registerShortName="true"><columns><column name="sid" code="SID" propId="1" stdSqlType="VARCHAR" precision="32" tagSet="seq" mandatory="true"primary="true"/><column name="name" code="NAME" propId="2" stdSqlType="VARCHAR" precision="100" mandatory="true"/><column name="status" code="STATUS" propId="3" stdSqlType="INTEGER"/></columns></entity></entities>
</orm>
  1. 如果不生成特定的Java实体类,可以使用系统内置的动态实体类DynamicEntity
  2. 每个字段都必须指定propId属性,不要求连续,但是不能重复。
  3. 主键字段需要标注primary=true。指定tagSet=seq表示为它增加seq标签,从而在保存的时候自动生成随机值
  4. 如果application.yaml中配置了nop.orm.init-database-schema: true,则系统启动的时候会自动根据模型配置创建数据库表

二. 通过IDaoProvider获取IEntityDao

我们可以增加一个DemoEntityBizModel,在其中通过@Inject自动注入IDaoProvider。一般情况下实现增删改查的BizModel会从CrudBizModel继承,它已经实现了
大量标准的CRUD操作。这里为了演示功能,我们选择不继承已有的CrudBizModel,完全手工编写。

@BizModel("DemoEntity")
public class DemoEntityBizModel {// 注意,字段不能声明为private。NopIoC无法注入私有成员变量@InjectIDaoProvider daoProvider;@BizQuery@GraphQLReturn(bizObjName = "DemoEntity")public IOrmEntity getEntity(@Name("id") String id) {IEntityDao<IOrmEntity> dao = daoProvider.dao("app.demo.DemoEntity");return dao.getEntityById(id);}@BizMutation@GraphQLReturn(bizObjName = "DemoEntity")public IOrmEntity saveEntity(@Name("data") Map<String, Object> data) {IEntityDao<IOrmEntity> dao = daoProvider.dao("app.demo.DemoEntity");OrmEntity entity = dao.newEntity();BeanTool.instance().setProperties(entity, data);dao.saveEntity(entity);return entity;}@BizQuery@GraphQLReturn(bizObjName = "DemoEntity")public List<IOrmEntity> findByName(@Name("name") String name) {IEntityDao<IOrmEntity> dao = daoProvider.dao("app.demo.DemoEntity");QueryBean query = new QueryBean();query.addFilter(FilterBeans.contains("name", name));return dao.findAllByQuery(query);}
}
  • 一般情况下@BizModel注解指定的对象名与实体对象名相同,便于代码定位。

  • 通过daoProvider.dao(entityName)可以获取到指定实体类对应的Dao对象。在Nop平台中我们只会使用平台内置的IEntityDao接口,它已经提供了足够丰富的方法,
    不需要业务开发人员再去扩展Dao接口。如果有些功能IEntityDao接口无法满足需求,可以使用IOrmTemplate或者SqlLibMapper机制。

  • 服务函数可以返回实体对象。这一点与SpringMVC的Controller不同。Controller一般只能返回可以自动序列化为JSON的DTO对象,否则无法控制哪些字段可以返回到前台。
    当我们不是直接返回字段,而是返回某种动态处理结果的时候,在Spring框架中也需要通过DTO进行适配。但是在使用NopGraphQL框架时,我们可以直接返回实体,然后通过xmeta元数据来控制返回
    字段,并且增加额外的转换逻辑。
    需要注意的是,我们现在使用的是动态实体对象,因此无法根据类名来确定是哪个实体类型,所以需要通过@GraphQLReturn注解来指明返回的对象类型是什么。

  • /_vfs/nop/demo/model/目录下需要增加一个DemoEntity/DemoEntity.xmeta元数据文件。当GraphQL服务函数返回的类型为指定对象类型时,会加载这里的元数据文件来获取对象信息。
    在这个文件中我们也可以增加实体上没有的字段,通过getter等配置实现动态计算。

三. 通过SqlLibMapper接口调用SQL语句

1. 声明接口DemoMapper, 通过@SqlLibMapper注解与sql文件关联

@SqlLibMapper("/nop/demo/sql/demo.sql-lib.xml")
public interface DemoMapper {IOrmEntity findFirstByName(@Name("name") String name);
}

2. 在beans.xml中注册Mapper接口类

因为NopIoC并不使用类扫描机制,所以我们需要手动在app-simple-demo.beans.xml中增加bean的定义。

    <bean id="io.nop.auth.dao.mapper.NopAuthRoleMapper" class="io.nop.orm.sql_lib.proxy.SqlLibProxyFactoryBean"ioc:type="@bean:id" ioc:bean-method="build"><property name="mapperClass" value="@bean:type"/></bean>

3. 在demo.sql-lib.xml增加SQL语句或者EQL对象查询语句

<sql-lib x:scheme="/nop/schema/orm/sql-lib.xdef" xmlns:x="/nop/schema/xdsl.xdef"><sqls><eql name="findFirstByName" sqlMethod="findFirst"><source>select o from DemoEntity o where o.name like ${'%' + name + '%'}</source></eql></sqls>
</sql-lib>

4. 在BizModel中调用SqlLibMapper

class DemoEntityBizModel{@InjectDemoMapper demoMapper;@BizQuery@GraphQLReturn(bizObjName = "DemoEntity")public IOrmEntity findBySql(@Name("name") String name) {return demoMapper.findFirstByName(name);}
}

基于可逆计算理论设计的低代码平台NopPlatform已开源:

  • gitee: canonical-entropy/nop-entropy
  • github: entropy-cloud/nop-entropy
  • 开发示例:docs/tutorial/tutorial.md
  • 可逆计算原理和Nop平台介绍及答疑_哔哩哔哩_bilibili

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

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

相关文章

大端存储和小端存储

大端存储和小端存储 在计算机系统中&#xff0c;数据在内存中的存储方式并不是唯一的。对于多字节的数据类型&#xff08;如 int、float 等&#xff09;&#xff0c;计算机可以以不同的方式在内存中存储它们。这些存储方式通常分为两种&#xff1a;大端存储&#xff08;Big-En…

如何使用RabbitMQ和Python实现广播消息

使用 RabbitMQ 和 Python 实现广播消息的过程涉及设置一个消息队列和多个消费者&#xff0c;以便接收相同的消息。RabbitMQ 的 “fanout” 交换机允许你将消息广播到所有绑定的队列。以下是如何实现这一过程的详细步骤。 1、问题背景 在将系统从Morbid迁移到RabbitMQ时&#x…

C#-类:成员变量

声明在类语句块中&#xff0c;描述对象的特征&#xff0c;可为任意变量类型 可包含&#xff1a;枚举、结构体、类、其他 1. 类成员的详细定义 特征->成员变量&#xff1a;包括类的数据&#xff1a;变量、常量、事件的成员行为->成员方法&#xff1a;普通方法、属性、构…

PAT甲级-1133 Splitting A Linked List

题目 题目大意 给定一个链表的首节点地址和节点个数&#xff0c;以及一个数k。要求重新排列该链表&#xff0c;使其按<0 &#xff0c;> 0 && < k&#xff0c;>k 的顺序排序。但是不改变原有顺序&#xff0c;比如-4 -> -6 -> -2&#xff0c;不需要再…

【spark的集群模式搭建】spark集群之Yarn集群模式搭建(清晰明了的搭建流程)

文章目录 1、使用Anaconda部署Python2、上传、解压、重命名3、创建软连接&#xff08;如果在Standalone模式中创建有就删除&#xff09;4、配置spark环境变量5、修改spark-env.sh配置文件6、修改spark-defaults.conf 配置文件7、修改log4j.properties配置文件8、上传spark jar包…

Android IPC机制(三)进程间通信方式

在Android中有以下几种进程间通信方式: 目录 1.Bundle 2.文件共享 3.Messenger 4.ContentProvider 5.AIDL 1.Bundle Bundle是Android中用于存储一组键值对的类&#xff0c;它实现了Parcelable接口。这使得Bundle能够在不同的进程之间传递数据。当我们通过Intent启动其他应…

ubuntu系统安装升级jdk到17

百度安全验证 https://blog.csdn.net/qq_44866828/article/details/130557027 然后修改一下配置路径 试下java --version命令

GEE数据集:全球天然林和人工林数据集提供了一张高分辨率(30 米)地图,用于区分截至 2021 年全球的天然林和人工林

目录 简介 全球天然林和人工林 数据生成和分类 代码 引用 License 网址推荐 知识星球 机器学习 GEE数据集&#xff1a;全球天然林和人工林数据集提供了一张高分辨率&#xff08;30 米&#xff09;地图&#xff0c;用于区分截至 2021 年全球的天然林和人工林 简介 全球…

20241031 Apache2修改日志里面的时间格式

问题背景,Apache2里面日志输出,关于时间这一块,看着难受,所以有了如下需求,修改日志里面的时间格式 案例日志 127.0.0.1 - - [31/Oct/2024:19:20:34 0800] "GET /index.php/vod/search/actor/XimenadelSolar.html HTTP/1.1" 200 4233 "-" "Mozilla/5…

基于SpringBoot司机信用评价的货运管理系统【附源码】

基于SpringBoot司机信用评价的货运管理系统 效果如下&#xff1a; 系统主页面 系统注册页面 司机注册页面 管理员主页面 订单评价页面 货物信息页面 个人信息页面 研究背景 随着我国物流行业的迅猛发展&#xff0c;货运管理系统的效率与安全性日益受到重视。在货运过程中&am…

11.4OpenCV_图像预处理习题02

1.身份证号码识别&#xff08;结果&#xff1a;身份证号识别结果为&#xff1a;911124198108030024&#xff09; import cv2 import numpy as np import paddlehub as hubdef get_text():img cv2.imread("images1/images/shenfen03.jpg")# 灰度化gray_img cv2.cvt…

推荐:自然语言处理方向的一些创新点

以下是自然语言处理研究方向的一些创新点&#xff1a; 一、预训练模型的改进与优化 模型架构创新 融合多模态信息&#xff1a; 传统的自然语言处理模型主要处理文本信息。创新点在于将图像、音频等多模态信息融合到预训练模型中。例如&#xff0c;对于描述一幅画的文本&#x…

<项目代码>YOLOv8 煤矸石识别<目标检测>

YOLOv8是一种单阶段&#xff08;one-stage&#xff09;检测算法&#xff0c;它将目标检测问题转化为一个回归问题&#xff0c;能够在一次前向传播过程中同时完成目标的分类和定位任务。相较于两阶段检测算法&#xff08;如Faster R-CNN&#xff09;&#xff0c;YOLOv8具有更高的…

netty之实现一个redis的客户端

写在前面 本文看下如何使用redis来实现一个类似于redis官方提供的redis-cli.exe的客户端工具。 1&#xff1a;用到的模块 主要需要用到netty针对redis的编解码模块&#xff0c;可以解析redis的协议&#xff0c;从而可以实现和redis交互的功能。 2&#xff1a;正文 首先来…

防重方案-订单防重方案笔记

订单防重设计 订单重复提交概念解决方案前端防重机制后端防重机制利用Token机制基于数据库的唯一索引 Token机制方案介绍 其他 订单重复提交概念 重复提交指&#xff0c;连点按钮进行重复提交操作&#xff0c;不包括刷新后的重新下单&#xff0c;重新下单已非同一订单的概念。…

Vision - 开源视觉分割算法框架 Grounded SAM2 配置与推理 教程 (1)

欢迎关注我的CSDN&#xff1a;https://spike.blog.csdn.net/ 本文地址&#xff1a;https://spike.blog.csdn.net/article/details/143388189 免责声明&#xff1a;本文来源于个人知识与公开资料&#xff0c;仅用于学术交流&#xff0c;欢迎讨论&#xff0c;不支持转载。 Ground…

【C++刷题】力扣-#697-数组的度

题目描述 给定一个非空且只包含非负数的整数数组 nums&#xff0c;数组的 度 的定义是指数组里任一元素出现频数的最大值。 你的任务是在 nums 中找到与 nums 拥有相同大小的度的最短连续子数组&#xff0c;返回其长度。 示例 示例 1 输入&#xff1a;nums [1,2,2,3,1] 输出…

LocalDate 类常用方法详解(日期时间类)

LocalDate 类常用方法详解 LocalDate 是 Java 8 引入的日期时间API中的一个类&#xff0c;用于表示不含时间和时区的日期&#xff08;年、月、日&#xff09;。以下是一些常用的 LocalDate 方法&#xff1a; 创建 LocalDate 实例 now()&#xff1a;获取当前日期 LocalDate t…

一些常用的react hooks以及各自的作用

一些常用的react hooks以及各自的作用 一、React Hooks是什么二、一些常用的Hooks以及各自的作用1、useState2、useEffect3、useContext4、useMemo5、useCallback6、useReducer7、useRef 一、React Hooks是什么 Hook 是 React 16.8 的新增特性。它可以让你在不编写 class 的情…

不用买PSP,画质甚至更好,这款免费神器让你玩遍经典游戏

作为掌机游戏爱好者的福音&#xff0c;PPSSPP模拟器为玩家带来了前所未有的PSP游戏体验&#xff0c;彻底改变了掌机游戏的体验方式。这款精湛的软件不仅完美复刻了PSP主机的游戏体验&#xff0c;更通过先进的模拟技术&#xff0c;将经典游戏提升到了全新的高度。对于那些珍藏PS…