基于mybatisplus 实现的通用controller,标准dao、dto、vo结构

废话不多说,直接上代码

2023-7-27更新了请移步查看下边仓库的代码

https://gitee.com/xue-aokun/mybatis-plus-demo.git

baseController

package org.jeecg.core.controller;

import cn.hutool.core.collection.CollectionUtil;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import io.swagger.annotations.ApiOperation;
import lombok.extern.slf4j.Slf4j;
import org.jeecg.common.api.vo.Result;
import org.jeecg.common.aspect.annotation.AutoLog;
import org.jeecg.common.constant.CommonConstant;
import org.jeecg.common.exception.JeecgBootException;
import org.jeecg.core.entity.BaseModel;
import org.jeecg.core.service.ICrudService;
import org.springframework.beans.BeanUtils;
import org.springframework.web.bind.annotation.*;

import java.io.Serializable;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.Date;
import java.util.List;


/**
 * 基于mp 基础controller
 *
 * @Author xak
 * @Version 1.0
 * @Date 2023-06-12 18:12
 **/
@Slf4j
public abstract class BaseController<S extends ICrudService<T, D, V>, T extends BaseModel<T>, D extends T, V extends T> {

    protected S baseService;

    public ThreadLocal<LambdaQueryWrapper<T>> wrapperThreadLocal = new ThreadLocal<>();

    /**
     * 分页查询所有数据
     *
     * @param page 分页对象
     * @param dto  查询dto
     * @return 所有数据
     */
    @GetMapping
    @ApiOperation("分页查询所有数据")
    @AutoLog(value = "分页查询所有数据", operateType = CommonConstant.OPERATE_TYPE_1)
    public Result<Page<V>> selectAll(Page<T> page, D dto) {
        try {
            //强转对应实体
            T model = (T) dto;
            wrapperThreadLocal.set(new LambdaQueryWrapper<>(model));
            //重新构造 wrapper
            reBuildQueryWrapper(wrapperThreadLocal.get(), dto);
            Page<T> list = this.baseService.page(page, wrapperThreadLocal.get());
            List<T> records = list.getRecords();
            Page<V> voPage = new Page<>();
            List<V> voList = new ArrayList<>();
            voPage.setRecords(voList);
            BeanUtils.copyProperties(list, voPage);
            if (CollectionUtil.isEmpty(records)) {
                return Result.ok("查询成功", voPage);
            }
            for (T record : records) {
                V vo = (V) record;
                voList.add(vo);
            }
            return Result.OK("查询成功", voPage);
        } catch (Exception e) {
            log.error("分页查询失败,{}", e.getMessage());
            return Result.error("查询失败");
        } finally {
            wrapperThreadLocal.remove();
        }
    }

    public void reBuildQueryWrapper(LambdaQueryWrapper<T> wrapper, D dto) {

    }

    /**
     * 通过id查询单条数据
     *
     * @param id 主键
     * @return 单条数据
     */
    @GetMapping("{id}")
    @ApiOperation("通过id查询单条数据")
    @AutoLog(value = "通过id查询单条数据", operateType = CommonConstant.OPERATE_TYPE_1)
    public Result<V> selectOne(@PathVariable Serializable id) {
        V vo = (V) baseService.selectOne(id);
        if (vo == null) {
            return Result.error("查询失败");
        } else {
            return Result.OK("查询成功", vo);
        }
    }

    /**
     * 新增
     *
     * @param model 实体对象
     * @return 新增结果
     */
    @PostMapping
    @ApiOperation("新增")
    @AutoLog(value = "新增", operateType = CommonConstant.OPERATE_TYPE_2)
    public Result<String> insert(@RequestBody T model) {
        boolean save = this.baseService.save(model);
        if (Boolean.TRUE.equals(save)) {
            return Result.OK("新增成功");
        } else {
            return Result.error("新增失败");
        }
    }

    /**
     * 修改
     *
     * @param model 实体对象
     * @return 修改结果
     */
    @PutMapping
    @ApiOperation("修改")
    @AutoLog(value = "修改", operateType = CommonConstant.OPERATE_TYPE_3)
    public Result<Boolean> update(@RequestBody T model) {
        if (model.getId() == null) {
            throw new JeecgBootException("修改失败id不能为空");
        }
        boolean update = this.baseService.updateById(model);
        if (Boolean.TRUE.equals(update)) {
            return Result.ok("修改成功");
        } else {
            return Result.error("修改失败");
        }
    }

    /**
     * 删除
     *
     * @param idList 主键集合
     * @return 删除结果
     */
    @DeleteMapping
    @ApiOperation("删除")
    @AutoLog(value = "删除", operateType = CommonConstant.OPERATE_TYPE_4)
    public Result<Boolean> delete(@RequestParam("idList") List<String> idList) {
        boolean remove = this.baseService.removeByIds(idList);
        if (Boolean.TRUE.equals(remove)) {
            return Result.OK("删除成功");
        } else {
            return Result.error("修改失败");
        }
    }

    /***
     * 返回日期代表的毫秒
     *
     * @param date
     *             日期
     * @return 返回毫秒
     */
    public long millis(Date date) {

        Calendar c = Calendar.getInstance();
        c.setTime(date);

        return c.getTimeInMillis();
    }

    /**
     * 获取当前天的后一天
     *
     * @param date
     * @return
     */
    public Date getAfterOneDay(Date date) {

        Calendar c = Calendar.getInstance();
        c.setTimeInMillis(millis(date) + (long) 24 * 3600 * 1000);

        return c.getTime();

    }

}

ICrudDao

package org.jeecg.core.dao;

import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import org.jeecg.core.entity.BaseModel;

/**
 * @Author xak
 * @Version 1.0
 * @Date 2023-06-12 18:21
 **/

public interface ICrudDao<T extends BaseModel<T>> extends BaseMapper<T> {

}

BaseModel

package org.jeecg.core.entity;


import com.baomidou.mybatisplus.extension.activerecord.Model;
import io.swagger.annotations.ApiModelProperty;

/**
 * @Author xak
 * @Version 1.0
 * @Date 2023-06-14 11:07
 **/
public abstract class BaseModel<T> extends Model<BaseModel<T>> {

    @ApiModelProperty(value = "id")
    private String id;

    public String getId() {
        return id;
    }

    public void setId(String id) {
        this.id = id;
    }
}

ICrudService

package org.jeecg.core.service;

import com.baomidou.mybatisplus.extension.service.IService;
import org.jeecg.core.entity.BaseModel;

import java.io.Serializable;

/**
 * @Author xak
 * @Version 1.0
 * @Date 2023-06-12 18:22
 **/

public interface ICrudService<T extends BaseModel<T>,D extends T,V extends T> extends IService<T> {

    /**
     * 根据id查询
     * @param id
     * @return
     */
    V selectOne(Serializable id);

}

CrudServiceImpl

package org.jeecg.core.service.impl;

import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import lombok.extern.slf4j.Slf4j;
import org.jeecg.core.dao.ICrudDao;
import org.jeecg.core.entity.BaseModel;
import org.jeecg.core.service.ICrudService;
import org.springframework.transaction.annotation.Transactional;

import java.io.Serializable;

/**
 * @Author xak
 * @Version 1.0
 * @Date 2023-06-12 18:22
 **/
@Slf4j
public abstract class CrudServiceImpl<E extends ICrudDao<T>, T extends BaseModel<T>, D extends T, V extends T> extends ServiceImpl<E, T> implements ICrudService<T, D, V> {


    public ThreadLocal<V> voThreadLocal = new ThreadLocal<>();

    @Override
    public V selectOne(Serializable id) {
        try {
            voThreadLocal.set((V) getById(id));
            afterSelectOne(voThreadLocal);
            return voThreadLocal.get();
        } catch (Exception e) {
            log.error("查询单个对象失败,{}",e.getMessage());
            return null;
        } finally {
            voThreadLocal.remove();
        }
    }

    @Transactional
    @Override
    public boolean save(T entity) {
        beforeSave(entity);
        boolean save = super.save(entity);
        afterSave(entity);
        return save;
    }

    @Transactional
    @Override
    public boolean updateById(T entity) {
        beforeUpdateById(entity);
        boolean update = super.updateById(entity);
        afterUpdateById(entity);
        return update;
    }

    public void afterSelectOne(ThreadLocal<V> voThreadLocal) {

    }


    /**
     * mp基础  新增前执行
     *
     * @param model
     */
    protected void beforeSave(T model) {

    }

    /**
     * mp基础 新增后执行
     *
     * @param model
     */
    protected void afterSave(T model) {

    }

    /**
     * mp基础 更新前执行
     *
     * @param model
     */
    protected void beforeUpdateById(T model) {

    }

    /**
     * mp基础 更新后执行
     *
     * @param model
     */
    protected void afterUpdateById(T model) {

    }

    // TODO: 2023/6/14 有需要再拓展其他方法
}

实战代码

AkXak

package org.jeecg.entity;

import java.util.Date;

import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import lombok.EqualsAndHashCode;
import org.jeecg.core.entity.BaseModel;

/**
 * xak测试通用框架(AkXak)表实体类
 *
 * @author xak
 * @since 2023-06-16 16:08:14
 */
@EqualsAndHashCode(callSuper = true)
@Data
@ApiModel("xak测试通用框架")
public class AkXak extends BaseModel<AkXak> {

    @ApiModelProperty(value = "id")
    private String id;

    @ApiModelProperty(value = "创建人")
    private String createdBy;

    @ApiModelProperty(value = "创建时间")
    private Date createdTime;

    @ApiModelProperty(value = "更新人")
    private String updateBy;

    @ApiModelProperty(value = "更新时间")
    private Date updateTime;

}


AkXakDto

package org.jeecg.dto;


import io.swagger.annotations.ApiModel;
import lombok.Data;
import lombok.EqualsAndHashCode;
import org.jeecg.entity.AkXak;

/**
 * xak测试通用框架(AkXak)表参数类
 *
 * @author xak
 * @since 2023-06-16 16:08:14
 */
@EqualsAndHashCode(callSuper = true)
@Data
@ApiModel("xak测试通用框架 dto")
public class AkXakDto extends AkXak {

}


AkXakVo

package org.jeecg.vo;

import io.swagger.annotations.ApiModel;
import lombok.Data;
import lombok.EqualsAndHashCode;
import org.jeecg.entity.AkXak;

/**
 * xak测试通用框架(AkXak)表出参类
 *
 * @author xak
 * @since 2023-06-16 16:08:14
 */
@EqualsAndHashCode(callSuper = true)
@Data
@ApiModel("xak测试通用框架 vo")
public class AkXakVo extends AkXak {

}


AkXakController

package org.jeecg.controller;

import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import io.swagger.annotations.Api;
import org.jeecg.core.controller.BaseController;
import org.jeecg.dto.AkXakDto;
import org.jeecg.entity.AkXak;
import org.jeecg.service.AkXakService;
import org.jeecg.vo.AkXakVo;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import javax.annotation.PostConstruct;
import javax.annotation.Resource;
import java.util.Date;

/**
 * xak测试通用框架(AkXak)表控制层
 *
 * @author xak
 * @since 2023-06-16 16:08:13
 */
@Api(tags = "xak测试通用框架")
@RestController
@RequestMapping("akXak")
public class AkXakController extends BaseController<AkXakService, AkXak, AkXakDto, AkXakVo> {
    /**
     * 服务对象
     */
    @Resource
    private AkXakService service;

    @PostConstruct
    void fatherService() {
        this.baseService = service;
    }

    @Override
    public void reBuildQueryWrapper(LambdaQueryWrapper<AkXak> wrapper, AkXakDto dto) {
        if (dto.getCreatedTime() == null) {
            return;
        }
        Date createdTime = dto.getCreatedTime();
        dto.setCreatedTime(null);

        LambdaQueryWrapper<AkXak> queryWrapper = new LambdaQueryWrapper<>(dto);
        if (createdTime != null) {
            queryWrapper.between(AkXak::getCreatedTime, createdTime, getAfterOneDay(createdTime));
        }
        wrapperThreadLocal.set(queryWrapper);
    }
}


AkXakService

package org.jeecg.service;

import org.jeecg.entity.AkXak;
import org.jeecg.dto.AkXakDto;
import org.jeecg.vo.AkXakVo;
import org.jeecg.core.service.ICrudService;

/**
 * xak测试通用框架(AkXak)表服务接口
 *
 * @author xak
 * @since 2023-06-16 16:08:14
 */
public interface AkXakService extends ICrudService<AkXak, AkXakDto, AkXakVo> {

}


AkXakDao

package org.jeecg.dao;

import org.jeecg.core.dao.ICrudDao;
import org.jeecg.entity.AkXak;

/**
 * xak测试通用框架(AkXak)表数据库访问层
 *
 * @author xak
 * @since 2023-06-16 16:08:13
 */
public interface AkXakDao extends ICrudDao<AkXak> {

}


AkXakServiceImpl

package org.jeecg.service.impl;

import org.jeecg.core.service.impl.CrudServiceImpl;
import org.jeecg.dto.AkXakDto;
import org.jeecg.vo.AkXakVo;
import org.jeecg.dao.AkXakDao;
import org.jeecg.entity.AkXak;
import org.jeecg.service.AkXakService;
import org.springframework.stereotype.Service;

/**
 * xak测试通用框架(AkXak)表服务实现类
 *
 * @author xak
 * @since 2023-06-16 16:08:14
 */
@Service("akXakService")
public class AkXakServiceImpl extends CrudServiceImpl<AkXakDao, AkXak, AkXakDto, AkXakVo> implements AkXakService {

}


代码使用easyCode插件生成的,手写是不可能的,插件就不贴了,想搞这种东西的人应该有实力把插件模版改好的,嘻嘻嘻

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值