1.数据字典介绍2.搭建
2.1model模块添加数据字典实体2.2添加数据字典mapper2.3添加数据字典service2.4 添加数据字典controller 3.数据导入和导出
3.1EasyExcell介绍3.2EasyExcell集成3.2.1添加依赖3.3数据字典导出3.3.1 在service-cmn模块添加service方法3.3.2 在DictServiceImpl类添加接口实现类3.3.3 在service-cmn模块添加controller方法3.4数据字典导入 4.Spring Cache+Redis
1.数据字典介绍首先,我们现在要做的就是一个数据字典,什么是数据字典呢,我们来看看就知道了
在数据里面,这是一个神奇的东西,也可以作为一个难点出现,那就是在这个过程当中,数据肯定不只是有医院等级这个东西吧,还有种族、学历,所以我们需要设置对应的总parent_id来代表其种类,在这里面,我们还需要做的就是设置一个对应的id,来代表他们的医院等级、以及种族类别这些。
首先也是一样,在group中引入这个对应的微服务,然后在里面建立对应的mapper,还有就是对应的service,以及对应的controller这些东西在里面,就是这样的一个思路在里面
2.1model模块添加数据字典实体@Data
@ApiModel(description = "数据字典")
@TableName("dict")
public class Dict extends baseEntity {
private static final long serialVersionUID = 1L;
@ApiModelProperty(value = "上级id")
@TableField("parent_id")
private Long parentId;
@ApiModelProperty(value = "名称")
@TableField("name")
private String name;
@ApiModelProperty(value = "值")
@TableField("value")
private String value;
@ApiModelProperty(value = "编码")
@TableField("dict_code")
private String dictCode;
@ApiModelProperty(value = "是否包含子节点")
@TableField(exist = false)
private boolean hasChildren;
}
2.2添加数据字典mapper
添加com.atguigu.yygh.cmn.mapper.DictMapper
public interface DictMapper extends baseMapper2.3添加数据字典service{ }
//1、添加com.atguigu.yygh.cmn.service.DictService public interface DictService extends IService{ //根据数据id查询子数据列表 List findChlidData(Long id); }
2、添加com.atguigu.yygh.cmn.service.impl.DictServiceImpl接口实现
@Service public class DictServiceImpl extends ServiceImplimplements DictService { //根据数据id查询子数据列表 @Override public List findChlidData(Long id) { QueryWrapper wrapper = new QueryWrapper<>(); wrapper.eq("parent_id",id); List dictList = baseMapper.selectList(wrapper); //向list集合每个dict对象中设置hasChildren for (Dict dict:dictList) { Long dictId = dict.getId(); boolean isChild = this.isChildren(dictId); dict.setHasChildren(isChild); } return dictList; } //判断id下面是否有子节点 private boolean isChildren(Long id) { QueryWrapper wrapper = new QueryWrapper<>(); wrapper.eq("parent_id",id); Integer count = baseMapper.selectCount(wrapper); // 0>0 1>0 return count>0; } }
这样的一个过程当中,因为是还要进行判断是否有子节点,那么这个时候就是判断对应的eq(“parent_id",id)。
2.4 添加数据字典controller添加com.atguigu.yygh.cmn.controller.DictController
@Api(description = "数据字典接口")
@RestController
@RequestMapping("/admin/cmn/dict")1
public class DictController {
@Autowired
private DictService dictService;
//根据数据id查询子数据列表
@ApiOperation(value = "根据数据id查询子数据列表")
@GetMapping("findChildData/{id}")
public Result findChildData(@PathVariable Long id) {
List list = dictService.findChlidData(id);
return Result.ok(list);
}
}
3.数据导入和导出
3.1EasyExcell介绍
Java解析、生成Excel比较有名的框架有Apache poi、jxl。但他们都存在一个严重的问题就是非常的耗内存,poi有一套SAX模式的API可以一定程度的解决一些内存溢出的问题,但POI还是有一些缺陷,比如07版Excel解压缩以及解压后存储都是在内存中完成的,内存消耗依然很大。easyexcel重写了poi对07版Excel的解析,能够原本一个3M的excel用POI sax依然需要100M左右内存降低到几M,并且再大的excel不会出现内存溢出,03版依赖POI的sax模式。在上层做了模型转换的封装,让使用者更加简单方便。
EasyExcel是一个基于Java的简单、省内存的读写Excel的开源项目。在尽可能节约内存的情况下支持读写百M的Excel。
3.3数据字典导出com.alibaba easyexcel 2.1.1
在model模块添加导出实体
package com.atguigu.yygh.vo.cmn;
@Data
public class DictEeVo {
@ExcelProperty(value = "id",index = 0)
private Long id;
@ExcelProperty(value = "上级id",index = 1)
private Long parentId;
@ExcelProperty(value = "名称",index = 2)
private String name;
@ExcelProperty(value = "值",index = 3)
private String value;
@ExcelProperty(value = "编码",index = 4)
private String dictCode;
}
3.3.1 在service-cmn模块添加service方法
1、在DictService类添加接口
void exportData(HttpServletResponse response);3.3.2 在DictServiceImpl类添加接口实现类
@Override
public void exportData(HttpServletResponse response) {
try {
response.setContentType("application/vnd.ms-excel");
response.setCharacterEncoding("utf-8");
// 这里URLEncoder.encode可以防止中文乱码 当然和easyexcel没有关系
String fileName = URLEncoder.encode("数据字典", "UTF-8");
response.setHeader("Content-disposition", "attachment;filename="+ fileName + ".xlsx");
List dictList = dictMapper.selectList(null);
List dictVoList = new ArrayList<>(dictList.size());
for(Dict dict : dictList) {
DictEeVo dictVo = new DictEeVo();
BeanUtils.copyBean(dict, dictVo, DictEeVo.class);
dictVoList.add(dictVo);
}
EasyExcel.write(response.getOutputStream(), DictEeVo.class).sheet("数据字典").doWrite(dictVoList);
} catch (IOException e) {
e.printStackTrace();
}
}
说明:直接复制示例代码中的“web中的写”,改造即可
3.3.3 在service-cmn模块添加controller方法在DictController类添加方法
@ApiOperation(value="导出")
@GetMapping(value = "/exportData")
public void exportData(HttpServletResponse response) {
dictService.exportData(response);
}
3.4数据字典导入
5.1.1 创建回调监听器
public class DictListener extends AnalysisEventListener{ private DictMapper dictMapper; public DictListener(DictMapper dictMapper) { this.dictMapper = dictMapper; } //一行一行读取 @Override public void invoke(DictEeVo dictEeVo, AnalysisContext analysisContext) { //调用方法添加数据库 Dict dict = new Dict(); BeanUtils.copyProperties(dictEeVo,dict); dictMapper.insert(dict); } @Override public void doAfterAllAnalysed(AnalysisContext analysisContext) { } }
5.1.2 在service-cmn模块添加service方法
//导入数据字典
@Override
public void importDictData(MultipartFile file) {
try {
EasyExcel.read(file.getInputStream(),DictEeVo.class,new DictListener(baseMapper)).sheet().doRead();
} catch (IOException e) {
e.printStackTrace();
}
}
5.1.3 在service-cmn模块添加controller方法
在DictController类添加方法
@ApiOperation(value = "导入")
@PostMapping("importData")
public Result importData(MultipartFile file) {
dictService.importData(file);
return Result.ok();
}
4.Spring Cache+Redis
2、使用Spring Cache
2.1 常用缓存标签
2.1.2 缓存@Cacheable
根据方法对其返回结果进行缓存,下次请求时,如果缓存存在,则直接读取缓存数据返回;如果缓存不存在,则执行方法,并把返回的结果存入缓存中。一般用在查询方法上。
查看源码,属性值如下:
属性/方法名 解释
value 缓存名,必填,它指定了你的缓存存放在哪块命名空间
cacheNames 与 value 差不多,二选一即可
key 可选属性,可以使用 SpEL 标签自定义缓存的key
2.1.2 缓存@CachePut
使用该注解标志的方法,每次都会执行,并将结果存入指定的缓存中。其他方法可以直接从响应的缓存中读取缓存数据,而不需要再去查询数据库。一般用在新增方法上。
查看源码,属性值如下:
属性/方法名 解释
value 缓存名,必填,它指定了你的缓存存放在哪块命名空间
cacheNames 与 value 差不多,二选一即可
key 可选属性,可以使用 SpEL 标签自定义缓存的key
2.1.3 缓存@CacheEvict
使用该注解标志的方法,会清空指定的缓存。一般用在更新或者删除方法上
查看源码,属性值如下:
属性/方法名 解释
value 缓存名,必填,它指定了你的缓存存放在哪块命名空间
cacheNames 与 value 差不多,二选一即可
key 可选属性,可以使用 SpEL 标签自定义缓存的key
allEntries 是否清空所有缓存,默认为 false。如果指定为 true,则方法调用后将立即清空所有的缓存
beforeInvocation 是否在方法执行前就清空,默认为 false。如果指定为 true,则在方法执行前就会清空缓存
2.2 数据字典应用
改造com.atguigu.yygh.cmn.service.impl.DictServiceImpl类方法
@Cacheable(value = "dict",keyGenerator = "keyGenerator") @Override public ListfindByParentId(Long parentId) { List dictList = dictMapper.selectList(new QueryWrapper ().eq("parent_id", parentId)); dictList.stream().forEach(dict -> { boolean isHasChildren = this.isHasChildren(dict.getId()); dict.setHasChildren(isHasChildren); }); return dictList; } @CacheEvict(value = "dict", allEntries=true) @Override public void importData(MultipartFile file) { ExcelHelper fileHelper = new ExcelHelper(DictEeVo.class); List dictVoList = fileHelper.importExcel(file); if(!CollectionUtils.isEmpty(dictVoList)) { dictMapper.insertBatch(dictVoList); } }



