一张码表的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

posted @   逆火狂飙  阅读(63)  评论(1编辑  收藏  举报
相关博文:
阅读排行:
· 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操作系统版本
生当作人杰 死亦为鬼雄 至今思项羽 不肯过江东
点击右上角即可分享
微信分享提示