一张码表的CRUD功能部分和快速取值运算功能部分的设计
某任务中有一张码表,从这张表取出的数据担任着快速换值的任务,即迅速地将传入的id变成记录中的code部分即可(实际比例子更复杂,但如果取到了code部分,剩下的数据变换部分是固定的);同时,对这张表还有常规的CRUD任务,要求进行删除更新添加任务后,快速换值任务也要即时改变。
在实际工作中,快速换值是经常调用,且一调用就是很多次,如果数据在DB端共享,每次访问都走数据库,时长绝对不可接受,故数据共享层必须上移;cud任务很少,但必须立即生效。因此,快速取值和crud都必须通过数据共享层。
因此,我在服务层设计了一张静态哈希表,存的是表对应的值作为缓存,crud任务进行前先访问这张缓存表,再访问DB;而快速换值时直接访问缓存表即可,为了防止缓存表内容没有初始化,特地设计一loadMap函数,以在取值前把数据从DB加载到缓存表中。这样就兼顾了效率和即时改变。
下面是代码:
CRUD控制层代码:
package com.hy.action; import com.hy.entity.Ds; import com.hy.service.CodeTableService; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestMethod; import org.springframework.web.bind.annotation.RestController; import java.util.LinkedHashMap; import java.util.List; import java.util.Map; @RestController public class CodeTableRestctrl { @Autowired private CodeTableService service; // 取出全部码值 @RequestMapping(value="/fetchAllCode", method= RequestMethod.GET) public Map<String,Object> fetchAllCode(){ Map<String,Object> retvalMap=new LinkedHashMap<String,Object>(); retvalMap.put("datas",service.fetchAll()); return retvalMap; } // 取出一个码值 @RequestMapping(value="/getCode", method= RequestMethod.GET) public Map<String,Object> getCode(long id){ Map<String,Object> retvalMap=new LinkedHashMap<String,Object>(); retvalMap.put("datas",service.getCode(id)); return retvalMap; } // 添加码值 @RequestMapping(value="/addCode", method= RequestMethod.POST) public Map<String,Object> addCode(String name,String code){ Map<String,Object> retvalMap=new LinkedHashMap<String,Object>(); retvalMap.put("status",service.addCode(name,code)); return retvalMap; } // 删除码值 @RequestMapping(value="/delCode", method= RequestMethod.DELETE) public Map<String,Object> delCode(long id){ Map<String,Object> retvalMap=new LinkedHashMap<String,Object>(); retvalMap.put("status",service.delCode(id)); return retvalMap; } // 更新码值 @RequestMapping(value="/updateCode", method= RequestMethod.POST) public Map<String,Object> updateCode(long id,String name,String code){ Map<String,Object> retvalMap=new LinkedHashMap<String,Object>(); retvalMap.put("status",service.updateCode(id,name,code)); return retvalMap; } }
CRUD服务层接口:
package com.hy.service; import com.hy.entity.Code; import java.util.List; public interface CodeTableService { void loadMap(); List<Code> fetchAll(); Code getCode(long id); boolean addCode(String name,String code); boolean delCode(long id); boolean updateCode(long id,String name,String code); }
CRUD服务层实现:
package com.hy.service; import com.hy.entity.Code; import com.hy.mapper.CodeTaleMapper; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; import org.springframework.stereotype.Service; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; @Service public class CodeTableServiceImpl implements CodeTableService{ @Autowired private CodeTaleMapper mapper; // Code cache private static Map<Long,Code> codeCacheMap; // 初始化codeCacheMap static{ codeCacheMap=new HashMap<Long, Code>(); } // 这个用于别处取用码值表 public static Map<Long,Code> getCodeCacheMap(){ return codeCacheMap; } // 这个函数该在调用getCodeCacheMap()之前调用一次 @Override public void loadMap(){ if(codeCacheMap.size()==0) { List<Code> codes = mapper.fetchAll(); for (Code cd : codes) { codeCacheMap.put(cd.getId(), cd); } } } @Override public List<Code> fetchAll() { if(codeCacheMap.size()==0){ List<Code> codes=mapper.fetchAll(); for(Code cd:codes){ codeCacheMap.put(cd.getId(),cd); } return codes; }else{ List<Code> codes=new ArrayList<>(); for(Map.Entry<Long,Code> entry:codeCacheMap.entrySet()){ codes.add(entry.getValue()); } return codes; } } @Override public Code getCode(long id) { // 先到缓存里找 if(codeCacheMap.containsKey(id)){ return codeCacheMap.get(id); } // 找不到到库里找 Code code=mapper.getCode(id); if(code!=null){ // 找到了先存缓存再返回 codeCacheMap.put(id,code); return code; } // 库里也找不到就返回空 return null; } @Override public boolean addCode(String name, String code) { // 同名互斥 if(mapper.countName(name)>0){ return false; } long id=mapper.generateId(); int changed=mapper.addCode(id,name,code); if(changed==1){ Code cd=new Code(id,name,code); codeCacheMap.put(id,cd); return true; }else{ return false; } } @Override public boolean delCode(long id) { if(codeCacheMap.containsKey(id)){ int changed=mapper.delCode(id); if(changed==1){ codeCacheMap.remove(id); return true; } return false; } return false; } @Override public boolean updateCode(long id, String name, String code) { // 同名互斥 if(mapper.countNameExceptionMe(id,name)>0){ return false; } if(codeCacheMap.containsKey(id)){ int changed=mapper.updateCode(id,name,code); if(changed==1){ Code cd=new Code(id,name,code); codeCacheMap.put(id,cd); return true; } return false; } return false; } }
CRUD DAO层:
package com.hy.mapper; import com.hy.entity.Code; import org.apache.ibatis.annotations.*; import java.util.List; @Mapper public interface CodeTaleMapper { @Select("select id,name,code from code_table order by id") List<Code> fetchAll(); @Select("select id,name,code from code_table where id=#{id}") Code getCode(long id); @Select("select code_table_sqs.nextval from dual") long generateId(); @Insert("insert into code_table(id,name,code) values(#{id},#{name},#{code})") int addCode(long id,String name,String code); @Delete("delete from code_table where id=#{id}") int delCode(long id); @Update("update code_table set name=#{name},code=#{code} where id=#{id}") int updateCode(long id,String name,String code); @Select("select count(*) from code_table where name=#{name}") int countName(String name); @Select("select count(*) from code_table where name=#{name} and id!=#{id}") int countNameExceptionMe(long id,String name); }
Code实体类:
package com.hy.entity; public class Code { private long id; private String name; private String code; public Code(long id,String name,String code){ this.id=id; this.name=name; this.code=code; } public Code(String name,String code){ this.name=name; this.code=code; } public Code(){ this(null,null); id=-1; } public long getId() { return id; } public void setId(long id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } public String getCode() { return code; } public void setCode(String code) { this.code = code; } }
快速访问控制层代码:
package com.hy.action; import com.hy.entity.Code; import com.hy.service.CodeTableService; import com.hy.service.CodeTableServiceImpl; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestMethod; import org.springframework.web.bind.annotation.RestController; import java.util.LinkedHashMap; import java.util.Map; @RestController public class ParseCodeRestctrl { @Autowired private CodeTableService service; @RequestMapping(value="/getCodeById", method= RequestMethod.GET) public Map<String,Object> getCodeByName(long id){ Map<String,Object> retvalMap=new LinkedHashMap<String,Object>(); service.loadMap(); Map<Long, Code> map= CodeTableServiceImpl.getCodeCacheMap(); retvalMap.put("name",map.get(id)); return retvalMap; } }
以上红字部分不能忘,因此CRUD任务没执行前,就要求换值部分好用了。
建表语句:
create table code_table( id number(12), name nvarchar2(20), code nvarchar2(100), primary key(id) ); CREATE SEQUENCE code_table_sqs INCREMENT BY 1 START WITH 1 NOMAXVALUE NOCYCLE NOCACHE;
END
分类:
Java.对象设计
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· 单线程的Redis速度为什么快?
2020-05-01 Agumaster页面样式就绪
2020-05-01 Thymeleaf中model设一个值 页面显示此值 JS取此值
2020-05-01 如何解决SpringBoot工程中的错误:java.sql.SQLNonTransientConnectionException: CLIENT_PLUGIN_AUTH is required
2020-05-01 支持MySQL数据库的agumaster版本
2018-05-01 写代码写文章勿有功利心
2015-05-01 【Canvas与艺术】绘制金色八卦图
2015-05-01 查看Linux操作系统版本