【非广告】你还在手写crud吗,看完这篇文章,绝对赚了(三)

简介: 我记得最早刚步入互联网行业的时候,当时按照 MVC 的思想和模型,每次开发新功能,会依次编写 dao、service、controller相关服务类,包括对应的 dto、entity、vo 等等实体类,如果有多张单表,也会重复的编写相似的代码,现在回想起来,感觉当时自己好像处于石器时代!
  • BaseMapper,主要负责将dao层的公共方法抽出来
package com.example.generator.core;
import org.apache.ibatis.annotations.Param;
import java.io.Serializable;
import java.util.List;
import java.util.Map;
/**
 * @author pzblog
 * @Description
 * @since 2020-11-11
 */
public interface BaseMapper<T> {
    /**
     * 批量插入
     * @param list
     * @return
     */
    int insertList(@Param("list") List<T> list);
    /**
     * 按需插入一条记录
     * @param entity
     * @return
     */
    int insertPrimaryKeySelective(T entity);
    /**
     * 按需修改一条记录(通过主键ID)
     * @return
     */
    int updatePrimaryKeySelective(T entity);
    /**
     * 批量按需修改记录(通过主键ID)
     * @param list
     * @return
     */
    int updateBatchByIds(@Param("list") List<T> list);
    /**
     * 根据ID删除
     * @param id 主键ID
     * @return
     */
    int deleteByPrimaryKey(Serializable id);
    /**
     * 根据ID查询
     * @param id 主键ID
     * @return
     */
    T selectByPrimaryKey(Serializable id);
    /**
     * 按需查询
     * @param entity
     * @return
     */
    List<T> selectByPrimaryKeySelective(T entity);
    /**
     * 批量查询
     * @param ids 主键ID集合
     * @return
     */
    List<T> selectByIds(@Param("ids") List<? extends Serializable> ids);
    /**
     * 查询(根据 columnMap 条件)
     * @param columnMap 表字段 map 对象
     * @return
     */
    List<T> selectByMap(Map<String, Object> columnMap);
}
  • BaseService,主要负责将service层的公共方法抽出来
package com.example.generator.core;
import java.io.Serializable;
import java.util.List;
import java.util.Map;
/**
 * @author pzblog
 * @Description 服务类
 * @since 2020-11-11
 */
public interface BaseService<T> {
    /**
     * 新增
     * @param entity
     * @return boolean
     */
    boolean insert(T entity);
    /**
     * 批量新增
     * @param list
     * @return boolean
     */
    boolean insertList(List<T> list);
    /**
     * 通过ID修改记录(如果想全部更新,只需保证字段都不为NULL)
     * @param entity
     * @return boolean
     */
    boolean updateById(T entity);
    /**
     * 通过ID批量修改记录(如果想全部更新,只需保证字段都不为NULL)
     * @param list
     * @return boolean
     */
    boolean updateBatchByIds(List<T> list);
    /**
     * 根据ID删除
     * @param id 主键ID
     * @return boolean
     */
    boolean deleteById(Serializable id);
    /**
     * 根据ID查询
     * @param id 主键ID
     * @return
     */
    T selectById(Serializable id);
    /**
     * 按需查询
     * @param entity
     * @return
     */
    List<T> selectByPrimaryKeySelective(T entity);
    /**
     * 批量查询
     * @param ids
     * @return
     */
    List<T> selectByIds(List<? extends Serializable> ids);
    /**
     * 根据条件查询
     * @param columnMap
     * @return
     */
    List<T> selectByMap(Map<String, Object> columnMap);
}
  • BaseServiceImplservice层的公共方法具体实现类
package com.example.generator.core;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.transaction.annotation.Transactional;
import java.io.Serializable;
import java.util.List;
import java.util.Map;
/**
 * @author pzblog
 * @Description 实现类( 泛型说明:M 是 mapper 对象,T 是实体)
 * @since 2020-11-11
 */
public abstract class BaseServiceImpl<M extends BaseMapper<T>, T> implements BaseService<T>{
    @Autowired
    protected M baseMapper;
    /**
     * 新增
     * @param entity
     * @return boolean
     */
    @Override
    @Transactional(rollbackFor = {Exception.class})
    public boolean insert(T entity){
        return returnBool(baseMapper.insertPrimaryKeySelective(entity));
    }
    /**
     * 批量新增
     * @param list
     * @return boolean
     */
    @Override
    @Transactional(rollbackFor = {Exception.class})
    public boolean insertList(List<T> list){
        return returnBool(baseMapper.insertList(list));
    }
    /**
     * 通过ID修改记录(如果想全部更新,只需保证字段都不为NULL)
     * @param entity
     * @return boolean
     */
    @Override
    @Transactional(rollbackFor = {Exception.class})
    public boolean updateById(T entity){
        return returnBool(baseMapper.updatePrimaryKeySelective(entity));
    }
    /**
     * 通过ID批量修改记录(如果想全部更新,只需保证字段都不为NULL)
     * @param list
     * @return boolean
     */
    @Override
    @Transactional(rollbackFor = {Exception.class})
    public boolean updateBatchByIds(List<T> list){
        return returnBool(baseMapper.updateBatchByIds(list));
    }
    /**
     * 根据ID删除
     * @param id 主键ID
     * @return boolean
     */
    @Override
    @Transactional(rollbackFor = {Exception.class})
    public boolean deleteById(Serializable id){
        return returnBool(baseMapper.deleteByPrimaryKey(id));
    }
    /**
     * 根据ID查询
     * @param id 主键ID
     * @return
     */
    @Override
    public T selectById(Serializable id){
        return baseMapper.selectByPrimaryKey(id);
    }
    /**
     * 按需查询
     * @param entity
     * @return
     */
    @Override
    public List<T> selectByPrimaryKeySelective(T entity){
        return baseMapper.selectByPrimaryKeySelective(entity);
    }
    /**
     * 批量查询
     * @param ids
     * @return
     */
    @Override
    public List<T> selectByIds(List<? extends Serializable> ids){
        return baseMapper.selectByIds(ids);
    }
    /**
     * 根据条件查询
     * @param columnMap
     * @return
     */
    @Override
    public List<T> selectByMap(Map<String, Object> columnMap){
        return baseMapper.selectByMap(columnMap);
    }
    /**
     * 判断数据库操作是否成功
     * @param result 数据库操作返回影响条数
     * @return boolean
     */
    protected boolean returnBool(Integer result) {
        return null != result && result >= 1;
    }
}

在此,还封装来其他的类,例如 dto 公共类BaseDTO,分页类Pager,还有 id 请求类IdRequest

  • BaseDTO公共类
public class BaseDTO implements Serializable {
    /**
     * 请求token
     */
    private String token;
    /**
     * 当前页数
     */
    private Integer currPage = 1;
    /**
     * 每页记录数
     */
    private Integer pageSize = 20;
    /**
     * 分页参数(第几行)
     */
    private Integer start;
    /**
     * 分页参数(行数)
     */
    private Integer end;
    /**
     * 登录人ID
     */
    private String loginUserId;
    /**
     * 登录人名称
     */
    private String loginUserName;
    public String getToken() {
        return token;
    }
    public BaseDTO setToken(String token) {
        this.token = token;
        return this;
    }
    public Integer getCurrPage() {
        return currPage;
    }
    public BaseDTO setCurrPage(Integer currPage) {
        this.currPage = currPage;
        return this;
    }
    public Integer getPageSize() {
        return pageSize;
    }
    public BaseDTO setPageSize(Integer pageSize) {
        this.pageSize = pageSize;
        return this;
    }
    public Integer getStart() {
        if (this.currPage != null && this.currPage > 0) {
            start = (currPage - 1) * getPageSize();
            return start;
        }
        return start == null ? 0 : start;
    }
    public BaseDTO setStart(Integer start) {
        this.start = start;
        return this;
    }
    public Integer getEnd() {
        return getPageSize();
    }
    public BaseDTO setEnd(Integer end) {
        this.end = end;
        return this;
    }
    public String getLoginUserId() {
        return loginUserId;
    }
    public BaseDTO setLoginUserId(String loginUserId) {
        this.loginUserId = loginUserId;
        return this;
    }
    public String getLoginUserName() {
        return loginUserName;
    }
    public BaseDTO setLoginUserName(String loginUserName) {
        this.loginUserName = loginUserName;
        return this;
    }
}
  • Pager分页类
public class Pager<T extends Serializable> implements Serializable {
    private static final long serialVersionUID = -6557244954523041805L;
    /**
     * 当前页数
     */
    private int currPage;
    /**
     * 每页记录数
     */
    private int pageSize;
    /**
     * 总页数
     */
    private int totalPage;
    /**
     * 总记录数
     */
    private int totalCount;
    /**
     * 列表数据
     */
    private List<T> list;
    public Pager(int currPage, int pageSize) {
        this.currPage = currPage;
        this.pageSize = pageSize;
    }
    public Pager(int currPage, int pageSize, int totalCount, List<T> list) {
        this.currPage = currPage;
        this.pageSize = pageSize;
        this.totalPage = (int) Math.ceil((double) totalCount / pageSize);;
        this.totalCount = totalCount;
        this.list = list;
    }
    public int getCurrPage() {
        return currPage;
    }
    public Pager setCurrPage(int currPage) {
        this.currPage = currPage;
        return this;
    }
    public int getPageSize() {
        return pageSize;
    }
    public Pager setPageSize(int pageSize) {
        this.pageSize = pageSize;
        return this;
    }
    public int getTotalPage() {
        return totalPage;
    }
    public Pager setTotalPage(int totalPage) {
        this.totalPage = totalPage;
        return this;
    }
    public int getTotalCount() {
        return totalCount;
    }
    public Pager setTotalCount(int totalCount) {
        this.totalCount = totalCount;
        return this;
    }
    public List<T> getList() {
        return list;
    }
    public Pager setList(List<T> list) {
        this.list = list;
        return this;
    }
}
相关文章
|
2月前
|
前端开发 关系型数据库 数据库
使用 Flask 连接数据库和用户登录功能进行数据库的CRUD
使用 Flask 连接数据库和用户登录功能进行数据库的CRUD
52 0
|
8月前
|
JavaScript 前端开发 Java
LayUI之CRUD(增删改查功能实现)项目案例
LayUI之CRUD(增删改查功能实现)项目案例
51 0
|
8月前
|
存储 JSON 前端开发
LayUI之CRUD(增删改查)
LayUI之CRUD(增删改查)
95 0
|
8月前
|
存储 前端开发 JavaScript
Layui的CRUD(增删改查)
Layui的CRUD(增删改查)
84 0
|
2月前
|
存储 SQL 关系型数据库
【软件设计师】一篇文章带你了解数据库
【软件设计师】一篇文章带你了解数据库
|
24天前
|
JavaScript Java 测试技术
基于ssm+vue.js+uniapp小程序的数据库课程在线教学附带文章和源代码部署视频讲解等
基于ssm+vue.js+uniapp小程序的数据库课程在线教学附带文章和源代码部署视频讲解等
24 4
|
26天前
|
Java 测试技术 数据安全/隐私保护
基于ssm+vue.js+uniapp小程序的《数据库原理及应用》课程平台附带文章和源代码部署视频讲解等
基于ssm+vue.js+uniapp小程序的《数据库原理及应用》课程平台附带文章和源代码部署视频讲解等
13 0
基于ssm+vue.js+uniapp小程序的《数据库原理及应用》课程平台附带文章和源代码部署视频讲解等
|
7天前
|
API
10.SPA项目开发之CRUD+表单验证
10.SPA项目开发之CRUD+表单验证
5 0
|
8天前
|
关系型数据库 MySQL 数据库
Mysql数据库操作CRUD
Mysql数据库操作CRUD
18 0
|
2月前
|
JavaScript Java 测试技术
基于ssm+vue.js+uniapp小程序的《数据库系统原理》课程平台附带文章和源代码设计说明文档ppt
基于ssm+vue.js+uniapp小程序的《数据库系统原理》课程平台附带文章和源代码设计说明文档ppt
25 1