# elegent-data 优雅的NoSQL持久层框架 **Repository Path**: myelegent/elegent-data ## Basic Information - **Project Name**: elegent-data 优雅的NoSQL持久层框架 - **Description**: Elegent Data是一个优雅的NoSQL数据持久层框架。使用这个组件可以让你更轻松、更优雅地在项目中操作 Elasticsearch 等NoSQL数据库,风格类似于MyBatisPlus,让你更专注业务代码的开发。 - **Primary Language**: Java - **License**: Apache-2.0 - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 17 - **Forks**: 0 - **Created**: 2023-10-18 - **Last Updated**: 2023-12-06 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README ![](doc/images/logob.png) # Elegent Data【优雅NoSQL数据持久层框架】 ## 介绍 Elegent Data是Elegent团队开发的一款优雅的NoSQL数据持久层框架。 特点: (1)使用这个组件可以让你更轻松、更优雅地在项目中操作 Elasticsearch 等NoSQL数据库,风格类似于MyBatisPlus,让你更专注业务代码的开发。 (2)支持用户自行扩展。 我们看一下Elegent Data框架的系统架构图: ![](doc/images/system.png) ## 使用说明(ES) ### 准备工作 (1)在项目中按需要引入依赖 ```xml cn.elegent.data elegent-data-elasticsearch7 1.0.0 ``` (2)在项目配置文件添加配置,如果是elastiacsearch 7 示例如下: ```yaml spring: elasticsearch: rest: uris: http://127.0.0.1:9201 ``` (3)创建ES实体类,参考以下形式。属性与数据库字段对应即可,可以使用驼峰。 ```java @Data public class OrderDTO { private Long id;//id private String orderNo;//订单 private String addr; private Integer status;//订单状态:0-创建;1-支付完成;2-出货成功;3-出货失败; private Integer amount;//支付金额 private String payType;//支付类型,1支付宝 2微信 private Integer payStatus;//支付状态,0-未支付;1-支付完成;2-退款中;3-退款完成 private String openId; } ``` (4)编写服务类,继承自Elasticsearch7DataService类,并指定泛型类型 ```java @Component public class OrderEsService extends Elasticsearch7DataService { } ``` (5)在需要操作ES数据库的类,注入我们的服务类 ```java @Autowired private OrderEsService orderEsService; ``` 然后调用orderEsService的方法实现对数据库的操作。 ### API方法说明 #### 构建查询条件 无论是分页查询、列表查询,还是聚合查询,我们先构建ElegentQueryWapper,它的功能就是封装查询条件. 以下是分页查询的示例: ```java ElegentQueryWapper elegentQueryWapper=new ElegentQueryWapper(); elegentQueryWapper.from("order") .eq("status","1") .eq("sku_name","统一奶茶"); return orderEsService.page(elegentQueryWapper,1,10); ``` ElegentQueryWapper方法列表如下: | 方法名 | 含义 | 参数说明 | | ------- | ------------- | ---------------------------------------- | | from | 指定表名(索引库名) | 表名(索引库名) | | eq | 指定查询条件: 等于 | 参数1:查询字段 参数2:查询值 | | lt | 指定查询条件: 小于 | 参数1:查询字段 参数2:查询值 | | le | 指定查询条件: 小于等于 | 参数1:查询字段 参数2:查询值 | | gt | 指定查询条件: 大于 | 参数1:查询字段 参数2:查询值 | | ge | 指定查询条件: 大于等于 | 参数1:查询字段 参数2:查询值 | | like | 指定查询条件: 模糊查询 | 参数1:查询字段 参数2:查询值 | | between | 指定查询条件: 范围值查询 | 参数1:查询字段 参数2:范围开始值 参数3:范围截至值 | | geo | 指定查询条件:地理位置搜索 | 参数1:查询字段 参数2:圆点经度 参数3:圆点维度 参数4:半径(米) | | count | 聚合函数:统计记录个数 | 参数1:统计字段 | | sum | 聚合函数:求和 | 参数1:统计字段 | | avg | 聚合函数:求平均值 | 参数1:统计字段 | | max | 聚合函数:求最大值 | 参数1:统计字段 | | min | 聚合函数:求最小值 | 参数1:统计字段 | | groupBy | 指定分组聚合字段 | 参数1:分组字段 | | size | 指定查询条数 | 参数1:查询条数 | #### 查询方法 Elasticsearch7DataService定义的查询方法如下: | 方法名 | 含义 | 参数说明 | | ---------- | ------ | --------------------------------------- | | page | 分页查询 | 参数1:ElegentQueryWapper 参数2:页码 参数3:页大小 | | list | 列表查询 | 参数1:ElegentQueryWapper | | statistics | 聚合查询 | 参数1:ElegentQueryWapper | | findById | 根据id查询 | 参数1:表名(索引库名) 参数2:主键值 | 代码示例如下: ```java @GetMapping("/page") public Pager findPage(){ ElegentQueryWapper elegentQueryWapper=new ElegentQueryWapper(); elegentQueryWapper.from("order") .eq("status","1") .eq("sku_name","统一奶茶"); return orderEsService.page(elegentQueryWapper,1,10); } @GetMapping("/list") public List findList(){ ElegentQueryWapper elegentQueryWapper=new ElegentQueryWapper(); elegentQueryWapper.from("order"); return orderEsService.list(elegentQueryWapper); } @GetMapping("/statistics") public List findStatistics(){ ElegentQueryWapper queryWapper=new ElegentQueryWapper(); queryWapper.from("order") .eq("status","1") .count("price").groupBy("sku_id"); return orderEsService.statistics(queryWapper); } @GetMapping("/findById/{id}") public OrderDTO findById( @PathVariable("id") String id){ OrderDTO order = orderEsService.findById("order", id); return order; } ``` #### 增删改方法 Elasticsearch7DataService定义的增删改方法如下: | 方法名 | 含义 | 参数说明 | | ------ | ---- | -------------------------------- | | save | 新增数据 | 参数1:表名(索引库名) 参数2:主键值 参数3:保存对象 | | update | 修改数据 | 参数1:表名(索引库名) 参数2:主键值 参数3:保存对象 | | delete | 删除数据 | 参数1:表名(索引库名) 参数2:主键值 | 方法示例如下: ```java @GetMapping("/save") public void save(){ OrderDTO orderDTO=new OrderDTO(); orderDTO.setId(200L); orderDTO.setAddr("测试地址"); orderDTO.setStatus(1); orderEsService.save("order",orderDTO.getId()+"",orderDTO); } @GetMapping("/update") public void update(){ OrderDTO orderDTO=new OrderDTO(); orderDTO.setId(200L); orderDTO.setAddr("地址测试"); orderDTO.setStatus(2); orderEsService.update("order",orderDTO.getId()+"",orderDTO); } @GetMapping("/delete") public void delete(){ orderEsService.delete("order","200"); } ``` ## 用户扩展 用户可以自行扩展NoSQL 的实现 (1)创建新模块,pom文件引入elegent-data-core依赖 ```xml cn.elegent.data elegent-data-core 1.0.0 ``` 以及操作NoSQL数据库原生的持久化技术的依赖。 (2)编写服务实现类,实现ElegentDataService接口,示例代码如下: ```java @Component("XXXXXXX") public class XXXXXXDataService implements ElegentDataService { //TODO:实现里面的方法 } ``` ## 参与贡献 1. 从 `master` 分支 `checkout` 一个新分支(**注**:*请务必保证 master 代码是最新的*) 2. 新分支命名格式:`docs/username_description`,例如:`docs/tom_新增分布式锁配置项` 3. 在新分支上编辑文档、代码,并提交代码 4. 最后 `PR` 合并到 `develop` 分支,等待作者合并即可