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 baseMapper
//1、添加com.atguigu.yygh.cmn.service.DictServicepublic interface DictService extends IService
2、添加com.atguigu.yygh.cmn.service.impl.DictServiceImpl接口实现
@Servicepublic class DictServiceImpl extends ServiceImpl
这样的一个过程当中,因为是还要进行判断是否有子节点,那么这个时候就是判断对应的eq(“parent_id",id)。
2.4 添加数据字典controller添加com.atguigu.yygh.cmn.controller.DictController
@Api(description = "数据字典接口")@RestController@RequestMapping("/admin/cmn/dict")1public class DictController { @Autowired private DictService dictService; //根据数据id查询子数据列表 @ApiOperation(value = "根据数据id查询子数据列表") @GetMapping("findChildData/{id}") public Result findChildData(@PathVariable Long id) { List
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。
在model模块添加导出实体
package com.atguigu.yygh.vo.cmn;@Datapublic 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类添加接口实现类@Overridepublic 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
说明:直接复制示例代码中的“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
5.1.2 在service-cmn模块添加service方法
//导入数据字典
@Overridepublic 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")@Overridepublic List