废话不多说,直接上代码
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插件生成的,手写是不可能的,插件就不贴了,想搞这种东西的人应该有实力把插件模版改好的,嘻嘻嘻