---
title: DataMap
date: 2021-02-05 10:50:28
permalink: /pages/70e14e/
---

# DataMap

## 一、前言
`DataMap` 是BaseMapper规定的一种数据结构类型

`DataMap` 可以用于BaseMapper中的所有数据库操作场景

希望使用者可以掌握 `DataMap` 的操作方式

当然不使用 `DataMap` 方式同样也可以快速上手 `BaseMapper`

## 二、使用要求

在使用 `DataMap` 的时候需要使用者考虑好当前操作需要的参数及字段

当然，如果使用者缺少部分参数或字段，框架会通过异常的方式提示使用者

但是最好在系统异常提示前，就将参数写好，这样就可以通过 `DataMap` 进行快速开发

::: warning 

所有的数据库操作，都必须在 `DataMap` 中设置好表名和主键名

部分操作还需要设置主键值，ids，和 idList等操作。

:::

## 三、参数说明

```java
// 需要更新或保存的数据
private Map<String, Object> data = new HashMap();
// 主键以逗号隔开的值，例：1，2，3
private String ids;
// 主键以list方式传入的值
private List<String> idList;
// 表名
private String tableName;
// 主键名
private String pkName;
// 主键值
private Object pkValue;
// 字段默认值
private String fields = "*";
// 字段列表
private List<String> fieldList;
// 子数据
private String subData;
// selectSql 此字段可通过SelectCondition生成
private String selectSql;
// SELECT sql生成器
private SelectCondition selectCondition;
// 实体类
private T obj;
```

## 四、开始使用

### 1. tableName && pkName （设置表名及主键）

设置表名及主键的方式有三种

* 通过DataMap设置主键及表名

```java
DataMap<Object> dataMap = DataMap.builder()
        .tableName("FT_USER")
        .pkName("USER_ID")
        .build();
```

* 通过 `OsSysTable` 设置主键及表名

```java
OsSysTable osSysTable = OsSysTable
        .builder()
        .tableName("FT_USER")
        .tablePk("USER_ID")
        .build();
DataMap<Object> dataMap = DataMap.builder()
        .sysOsTable(osSysTable)
        .build();
```

* 通过实体类设置主键和表名

实体类需要按照上一章来设置，需要将 `@Id` 放到主键字段上，将 `@Table(name = "表名")` 放到实体类上

实体类的字段会自动填充到 `DataMap` 字段中，非数据库字段，需要在实体类字段上需要加注解 `@DataIgnore`

```java
FtUser ftUser = FtUser.builder().build();
DataMap<Object> dataMap = DataMap.builder()
        .obj(ftUser)
        .build();
```

### 2. data (设置需要保存或者更新的数据)

* 通过 `map` 形式设置

```java
Map<String, Object> map = new HashMap<>();
map.put("USER_NAME", "张三");
map.put("PASSWORD", "654321");
DataMap<Object> dataMap = DataMap.builder()
        .data(map)
        .build();
```

* 通过 `add` 方法设置数据

```java
DataMap<Object> dataMap = DataMap.builder()
        .add("USER_NAME","张三")
        .add("PASSWORD","张三")
        .build();
```

* 通过实体类方式设置数据 

实体方式会自动将实体类数据，主键和表名赋给 `DataMap`

```java
FtUser ftUser = FtUser
        .builder()
        .username("张三")
        .password("123456")
        .build();
DataMap<Object> dataMap = DataMap.builder()
        .obj(ftUser)
        .build();
```

### 3. ids (主键以逗号隔开的形式)

```java
DataMap<Object> dataMap = DataMap.builder()
        .ids("1,2,3")
        .build();
```

当将多个主键通过上述方式赋给 `DataMap` 时，我们可以通过 `getIdList()` 方法获取 `List<String>` 类型得主键list

```java
// 获取list
List<String> idList = dataMap.getIdList();
// idList 结果
["1","2","3"]
```

### 4.  fields (字段列表)

与 `ids`类似，同样为逗号隔开，设置好后可以通过 `getFieldList()` 获取得到字段的list 

### 5. 其他参数

其他参数可以通过正常的 `set` 方法和 `get` 方法进行获取和设置

也可以通过 `builder()` 和 `toBuilder()` 方法进行设置和修改

## 五、使用示例

此处只展示调用的保存示例，其余规则会写在每个文档中。

### 1. 实体类保存

```java
FtUser ftUser = FtUser.builder().userName("张三").password("123456").build()
DataMap<FtUser> dataMap = DataMap.<FtUser>builder().obj(ftUser).build();
baseMapper.save(dataMap);
```


### 2. 非实体类保存

* 方法一

```java
DataMap<Object> dataMap=DataMap
        .builder()
        // 设置表名
        .tableName("FT_USER")
        // 设置主键
        .pkName("USER_ID")
        // 设置需要新增的字段及内容
        .add("USER_NAME","张三")
        .add("PASSWORD","123456")
        .build();
baseMapper.save(dataMap);
```

* 方法二

```java
 // 设置新增字段及内容
Map<String, Object> map=new HashMap<>();
map.put("USER_NAME","张三");
map.put("PASSWORD","123456");
DataMap<Object> dataMap=DataMap
        .builder()
        // 设置表名
        .tableName("FT_USER")
        // 设置主键
        .pkName("USER_ID")
        // 设置保存内容
        .data(map)
        .build();
baseMapper.save(dataMap);
```

* 方法三

```java
 OsSysTable osSysTable = OsSysTable
                .builder()
                .tableName("FT_USER")
                .tablePk("USER_ID")
                .build();
        // 设置新增字段及内容
 DataMap<Object> dataMap = DataMap
                .builder()
                // 设置表名及字段
                .sysOsTable(osSysTable)
                .add("USER_NAME","张三")
                .add("PASSWORD","123456")
                .build();
 baseMapper.save(dataMap);
```

* 方法四

```java
Map<String, Object> map = new HashMap<>();
map.put("USER_NAME", "张三");
map.put("PASSWORD", "123456");
OsSysTable osSysTable = OsSysTable
                .builder()
                .tableName("FT_USER")
                .tablePk("USER_ID")
                .build();
        // 设置新增字段及内容
DataMap<Object> dataMap = DataMap
                .builder()
                // 设置表名及字段
                .sysOsTable(osSysTable)
                .data(map)
                .build();
baseMapper.save(dataMap);
```
