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 版权协议,转载请附上原文出处链接和本声明。