# 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

# Elegent Data【优雅NoSQL数据持久层框架】
## 介绍
Elegent Data是Elegent团队开发的一款优雅的NoSQL数据持久层框架。
特点:
(1)使用这个组件可以让你更轻松、更优雅地在项目中操作 Elasticsearch 等NoSQL数据库,风格类似于MyBatisPlus,让你更专注业务代码的开发。
(2)支持用户自行扩展。
我们看一下Elegent Data框架的系统架构图:

## 使用说明(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` 分支,等待作者合并即可