JavaWeb通用Controller

  • Post author:
  • Post category:java

JavaWeb通用Controller提供持久化操作接口


2021/12/20
注意:核心的类为 SimpleController

此解决方案为日常敲代码时,灵光一现
代码中如有缺陷请在评论区指出,尽量提一下解决方案,不然有时候我不知道怎么改。。。


前置条件

  • 使用mybatis的通用mapper或使用mapper接口进行持久化交互
  • 接口格式符合restful风格
  • 配合Lombok
  • 使用PageHelper进行分页

适用场景

  • 仅需提供RestFul风格的接口对pojo进行持久化操作
  • 没有复杂的业务逻辑,仅仅是实现CRUD(增删改查)操作
  • 级联操作的实现依赖于mybatis实现,具体请查询通用mapper的使用方式

实现步骤

dao

@Data
@ToString
@NoArgsConstructor
public class UserToken implements Serializable {

    @Id
    @KeySql(useGeneratedKeys = true)
    private Integer id;
    private String account;
    private String password;
    private String currentToken;
    private Date createdAt;
    private Date updatedAt;
    private Integer bak1;
    private Date bak2;
    private String bak3;

    private UserInfo userInfo;
}

StatusResponse

用于返回参数封装

package cn.easyfreedom.unitiveModel.model;

import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;

import java.util.Map;

@Data
@AllArgsConstructor
@NoArgsConstructor
public class StatusResponse {

    private int status;
    private String message;
    private Map<String,Object> data;

    public static final StatusResponse SUCCEED = new StatusResponse(200,"请求成功",null);
    public static final StatusResponse FAILURE = new StatusResponse(202,"操作失败",null);
    public static final StatusResponse OPTSUCCEED = new StatusResponse(204,"操作成功",null);

    public static StatusResponse responseBuilder(StatusResponse statusResponse,Map<String,Object> data){
        return new StatusResponse(statusResponse.getStatus(),statusResponse.getMessage(),data);
    }

}

mapper

创建通用mapper或创建普通mapper

package cn.easyfreedom.dataCenter.mappers;

import cn.easyfreedom.unitiveModel.pojo.UserInfo;
import tk.mybatis.mapper.common.Mapper;

@org.apache.ibatis.annotations.Mapper
public interface UserInfoMapper extends Mapper<UserInfo> {
}

BaseController

用于维护pojo的创建时间和更新时间

package cn.easyfreedom.dataCenter.controllers;

import cn.easyfreedom.unitiveModel.model.StatusResponse;

import javax.annotation.Nullable;
import java.lang.reflect.Method;
import java.util.Date;
import java.util.Map;

public abstract class BaseController {

    protected<T> T generateCreated(T pojo){
        try {
            Method setCreatedAt = pojo.getClass().getMethod("setCreatedAt", Date.class);
            setCreatedAt.invoke(pojo,new Date());
        } catch (NoSuchMethodException e) {
            e.printStackTrace();
        }finally {
            return pojo;
        }
    }

    protected<T> T generateUpdated(T pojo){
        try {
            Method setUpdatedAt = pojo.getClass().getMethod("setUpdatedAt", Date.class);
            setUpdatedAt.invoke(pojo,new Date());
        } catch (NoSuchMethodException e) {
            e.printStackTrace();
        }finally {
            return pojo;
        }
    }

    protected<T> T generatedCreatedAtAndUpdatedAt(T pojo){
        return generateCreated(generateUpdated(pojo));
    }

    protected StatusResponse generateOptResponse(int changes,@Nullable Map<String,Object> data){
        if(data == null){
            return changes > 0 ? StatusResponse.OPTSUCCEED : StatusResponse.FAILURE;
        }else{
            return changes > 0 ? StatusResponse.responseBuilder(StatusResponse.OPTSUCCEED, data) : StatusResponse.FAILURE;
        }
    }
}

SimpleController

用于实现基本的RestFul风格的最基本方法

package cn.easyfreedom.dataCenter.controllers;

import cn.easyfreedom.dataCenter.mappers.UserTokenMapper;
import cn.easyfreedom.unitiveModel.model.StatusResponse;
import cn.easyfreedom.unitiveModel.pojo.UserToken;
import com.github.pagehelper.PageHelper;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
import tk.mybatis.mapper.common.Mapper;

import javax.annotation.Nullable;
import java.util.LinkedList;
import java.util.List;
import java.util.Map;

public abstract class SimpleController<MapperInterface extends Mapper,Pojo> extends BaseController {

    @SuppressWarnings("SpringJavaInjectionPointsAutowiringInspection")
    @Autowired
    private MapperInterface mapper;

    @PostMapping("")
    public StatusResponse insert(@RequestBody Pojo pojo){
        int insert = mapper.insert(generatedCreatedAtAndUpdatedAt(pojo));
        return generateOptResponse(insert, Map.of("userToken",pojo));
    }

    @DeleteMapping("")
    public StatusResponse delete(@RequestBody Pojo pojo){
        int delete = mapper.delete(pojo);
        return generateOptResponse(delete,null);
    }

    @PutMapping("")
    public StatusResponse update(@RequestBody Pojo pojo){
        int i = mapper.updateByPrimaryKey(generateUpdated(pojo));
        return generateOptResponse(i,null);
    }

    @GetMapping("/all/{page}/{count}")
    public StatusResponse select(@PathVariable Integer page,@PathVariable Integer count,@Nullable @RequestBody Pojo pojo){

                List list = new LinkedList<>();
        PageHelper.startPage(page,count);
        if(pojo == null){
            list = mapper.selectAll();
        }else{
            list = mapper.select(pojo);
        }
        list.sort((var1,var2) -> {
            try {
                Method getCreatedAt = var1.getClass().getMethod("getCreatedAt");
                Date var1Date = (Date) getCreatedAt.invoke(var1);
                Date var2Date = (Date) getCreatedAt.invoke(var2);

                if (var1Date.before(var2Date)){
                    return 1;
                }else{
                    return -1;
                }
            } catch (NoSuchMethodException | IllegalAccessException | InvocationTargetException e) {
                e.printStackTrace();
                return 0;
            }
        });
        return generateOptResponse(list.size(),Map.of("userTokens",list));
    }

}

使用演示

package cn.easyfreedom.dataCenter.controllers;

import cn.easyfreedom.dataCenter.mappers.UserInfoMapper;
import cn.easyfreedom.unitiveModel.pojo.UserInfo;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
@RequestMapping("/user_info")
public class UserInfoController extends SimpleController<UserInfoMapper, UserInfo> {

}

功能扩展说明

  • 要扩展通用Controller提供的接口时,仅需更改SimpleController即可,其余Controller代码不需要改变

版权声明:本文为qq_45563168原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。