打造一款适合自己的快速开发框架-框架分层及CURD样例

984 阅读8分钟

前言

任何一个快速开发框架,都离不开CURD,代码生成器也是基于CURD生成的,本文主要是定制CURD模板样例,规范化代码,也为后续的代码生成器做铺垫。

分层

javaweb的三层架构,分别为控制层(web层)、业务逻辑层、持久层。对于CURD来说,每一层其实也都是对应着各自的CURD方法。这里会对每一层的类和方法制定命名规范。

控制层

控制层在springboot里面,即为controller,该层主要是接收用户输入的数据,并对数据进行基本的数据校验,如非空、数据类型等。该层接收到用户输入的数据并对其进行基础的数据校验,如校验通过,则会调用对应的业务方法,将业务方法处理的结果返回客户端。一般习惯性上,一个控制层方法调用一个业务逻辑层的方法。

业务逻辑层

业务逻辑层接收到控制层的参数后,会进行一些业务逻辑的处理,该层会对数据库进行操作,会调用持久层的方法。一般来说,一个业务方法可以调用多个持久层方法。

持久层

持久层即对数据库的表进行操作,一般一张表对应一个操作对象。

开始编码

目录结构

只罗列需要新增或修改的文件

├── mldong-admin  管理端接口
    ├── emuns
    	src/main/java
      └──com.mldong.modules.sys
        └── controller 控制层
        	└── SysUserController.java
    	├── dto  dto层
        	└── SysUserParam.java
        ├── enums  错误码枚举
        	└── SysErrEnum.java
    	├── dao	   持久层(与mapper的区别是该层是可以自定义,mapper后续由代码生成器生成)
        	└── SysUserDao.java
        └── service 服务层
        	├── impl
        		└── SysUserServiceImpl
        	└── SysUserService.java
   └── src/main/resources
    	├── dao/sys/sys_user.xml
├── mldong-common  工具类及通用代码
├── mldong-generator  代码生成器
└── mldong-mapper 持久层
    ├── src/main/java
    	├── com.mldong.base
    		└── BaseMapper.java
    	├── com.mldong.modules.sys.entity
    		└── SysUser.java
    	└── com.mldong.modules.sys.mapper
    		└── SysUserMapper.java
   └── src/main/resources
    	└── mapper/sys/sys_user.xml

文件说明

  • mldong-admin/src/main/java/com/mldong/modules/sys/controller/SysUserController.java

控制层

package com.mldong.modules.sys.controller;

import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import io.swagger.annotations.ApiParam;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;

import com.mldong.common.base.CommonPage;
import com.mldong.common.base.CommonResult;
import com.mldong.common.base.IdsParam;
import com.mldong.modules.sys.dto.SysUserParam;
import com.mldong.modules.sys.entity.SysUser;
import com.mldong.modules.sys.service.SysUserService;

@RestController
@RequestMapping("/sys/user")
@Api(tags="sys-用户管理")
public class SysUserController {
	@Autowired
	private SysUserService sysUserService;
	/**
	 * 添加用户
	 * @param param
	 * @return
	 */
	@PostMapping("save")
	@ApiOperation(value="添加用户", notes="添加用户")
	public CommonResult<?> save(@RequestBody SysUserParam param) {
		int count = sysUserService.save(param);
		if(count>0) {
			return CommonResult.success();
		} else {
			return CommonResult.fail();
		}
	}
	/**
	 * 更新用户
	 * @param param
	 * @return
	 */
	@PostMapping("update")
	@ApiOperation(value="更新用户", notes="更新用户")
	public CommonResult<?> update(@RequestBody SysUserParam param) {
		int count = sysUserService.update(param);
		if(count>0) {
			return CommonResult.success();
		} else {
			return CommonResult.fail();
		}
	}
	/**
	 * 删除用户
	 * @param param
	 * @return
	 */
	@PostMapping("remove")
	@ApiOperation(value="删除用户", notes="删除用户")
	public CommonResult<?> remove(@RequestBody IdsParam param) {
		int count = sysUserService.remove(param.getIds());
		if(count>0) {
			return CommonResult.success();
		} else {
			return CommonResult.fail();
		}
	}
	/**
	 * 通过id获取用户
	 * @param param
	 * @return
	 */
	@GetMapping("get")
	@ApiOperation(value="通过id获取用户", notes="通过id获取用户")
	public CommonResult<SysUser> get(@ApiParam(value="用户id",required=true)Long id) {
		return CommonResult.success(sysUserService.get(id));
	}
	/**
	 * 分页查询用户列表
	 * @param param
	 * @return
	 */
	@GetMapping("list")
	@ApiOperation(value="分页查询用户列表", notes="分页查询用户列表")
	public CommonResult<CommonPage<SysUser>> list(SysUserParam param, @ApiParam(value="第n页,默认1")@RequestParam(defaultValue="1")Integer pageNum, @ApiParam(value="每页大小,默认10")@RequestParam(defaultValue="10")int pageSize) {
		return CommonResult.success(sysUserService.list(param, pageNum, pageSize));
	}
}

  • mldong-admin/src/main/java/com/mldong/modules/sys/dto/SysUserParam.java

接口参数实体,该实体后续会加上Hibernator-Validator的校验,这里暂忽略,后续优化环节会说明。

package com.mldong.modules.sys.dto;

import io.swagger.annotations.ApiModelProperty;

public class SysUserParam {
	@ApiModelProperty(name="用户名",required=true)
	private String userName;
	@ApiModelProperty(name="姓名",required=true)
	private String realName;
	@ApiModelProperty(name="头像",required=false)
	private String avatar;
	@ApiModelProperty(name="邮箱",required=false)
	private String email;
	@ApiModelProperty(name="手机号",required=true)
	private String mobilePhone;
	@ApiModelProperty(name="联系电话",required=false)
	private String telephone;
	@ApiModelProperty(name="密码",required=false)
	private String password;
	@ApiModelProperty(name="确认密码",required=false)
	private String confirmPassword;
	// ... get set 略
	
}
  • mldong-admin/src/main/java/com/mldong/modules/sys/service/SysUserService.java

用户管理业务层

package com.mldong.modules.sys.service;

import java.util.List;

import com.mldong.common.base.CommonPage;
import com.mldong.modules.sys.dto.SysUserParam;
import com.mldong.modules.sys.entity.SysUser;
/**
 * 用户管理业务接口
 * @author mldong
 *
 */
public interface SysUserService {
	/**
	 * 添加用户
	 * @param param
	 * @return
	 */
	public int save(SysUserParam param);
	/**
	 * 更新用户
	 * @param param
	 * @return
	 */
	public int update(SysUserParam param);
	/**
	 * 删除用户
	 * @param ids
	 * @return
	 */
	public int remove(List<Long> ids);
	/**
	 * 查询用户
	 * @param id
	 * @return
	 */
	public SysUser get(Long id);
	/**
	 * 分页查询用户列表
	 * @param t
	 * @param pageNum
	 * @param pageSize
	 * @return
	 */
	public CommonPage<SysUser> list(SysUserParam t, int pageNum, int pageSize);
}
  • mldong-admin/src/main/java/com/mldong/modules/sys/service/impl/SysUserServiceImpl.java
package com.mldong.modules.sys.service.impl;

import java.util.Date;

import java.util.List;

import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import tk.mybatis.mapper.entity.Condition;

import com.github.pagehelper.Page;
import com.github.pagehelper.PageHelper;
import com.mldong.common.base.CommonPage;
import com.mldong.modules.sys.dto.SysUserParam;
import com.mldong.modules.sys.entity.SysUser;
import com.mldong.modules.sys.mapper.SysUserMapper;
import com.mldong.modules.sys.service.SysUserService;
/**
 * 用户管理业务
 * @author mldong
 *
 */
@Service
public class SysUserServiceImpl implements SysUserService{
	@Autowired
	private SysUserMapper sysUserMapper;
	@Override
	public int save(SysUserParam param) {
		Date now = new Date();
		SysUser user = new SysUser();
		BeanUtils.copyProperties(param, user);
		user.setCreateTime(now);
		user.setUpdateTime(now);
		user.setIsDeleted(false);
		return sysUserMapper.insertSelective(user);
	}

	@Override
	public int update(SysUserParam param) {
		Date now = new Date();
		SysUser user = new SysUser();
		BeanUtils.copyProperties(param, user);
		user.setUpdateTime(now);
		return sysUserMapper.updateByPrimaryKeySelective(user);
	}

	@Override
	public int remove(List<Long> ids) {
		Date now = new Date();
		SysUser upUser = new SysUser();
		upUser.setIsDeleted(true);
		upUser.setUpdateTime(now);
		Condition condition = new Condition(SysUser.class);
		condition.createCriteria().andIn("id", ids);
		return sysUserMapper.updateByConditionSelective(upUser, condition);
	}
	@Override
	public SysUser get(Long id) {
		return sysUserMapper.selectByPrimaryKey(id);
	}
	@Override
	public CommonPage<SysUser> list(SysUserParam param, int pageNum, int pageSize) {
		Page<SysUser> page = PageHelper.startPage(pageNum, pageSize,true);
		SysUser user = new SysUser();
		BeanUtils.copyProperties(param, user);
		sysUserMapper.select(user);
		return CommonPage.toPage(page);
	}
}
  • mldong-admin/src/main/java/com/mldong/modules/sys/dao/SysUserDao.java

自定义用户持久层类-样例

package com.mldong.modules.sys.dao;

import java.util.List;

import com.mldong.modules.sys.dto.SysUserResult;

public interface SysUserDao {
	public List<SysUserResult> selectWithRoleName();
}


  • mldong-admin/src/main/java/resources/dao/sys/sys_user_dao.xml

自定义的持久层xml,该层会继承mapper的xml的BaseResultMap,方便代码生成mapper后,新增字段不用人工添加。

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.mldong.modules.sys.dao.SysUserDao">
	<resultMap id="BaseResultMap" extends="com.mldong.modules.sys.mapper.SysUserMapper.BaseResultMap" 
	type="com.mldong.modules.sys.dto.SysUserResult">
		<result column="role_name" property="roleName" />   
	</resultMap>
	<select id="selectWithRoleName" resultMap="BaseResultMap">
		select u.*, 'aaaaa' as role_name from sys_user u
	</select>
</mapper>
  • mldong-admin/src/main/java/resources/application.yml

因修改了Mapper基类为自定义类,需要修改对应的配置文件。

mapper:
  mappers:
    - com.mldong.base.BaseMapper
  • mldong-mapper/src/main/java/com/mldong/modules/sys/SysUserMapper.java

持久层mapper,和表一对一关系,继承于自定义BaseMapper,该层后面定义为不可人工修改层(只能由代码生成器生成)

package com.mldong.modules.sys.mapper;

import com.mldong.base.BaseMapper;
import com.mldong.modules.sys.entity.SysUser;
/**
 * sys_user 持久层
 * @author mldong
 *
 */
public interface SysUserMapper extends BaseMapper<SysUser>{
    
}

  • mldong-mapper/src/main/java/com/mldong/modules/sys/SysUser.java

持久层实体,和表一对一关系,该层后面定义为不可人工修改层(只能由代码生成器生成)

package com.mldong.modules.sys.entity;

import java.io.Serializable;
import java.util.Date;

import javax.persistence.Id;
import javax.persistence.Table;
/**
 * 用户表实体
 * @author mldong
 *
 */
@Table(name="sys_user")
public class SysUser implements Serializable{
	/**
	 * 
	 */
	private static final long serialVersionUID = -2687095050668229447L;
	/**
	 * 主键
	 */
	@Id
	private Long id;
	/**
	 * 用户名
	 */
	private String userName;
	/**
	 * 姓名
	 */
	private String realName;
	/**
	 * 头像
	 */
	private String avatar;
	/**
	 * 邮箱
	 */
	private String email;
	/**
	 * 手机号
	 */
	private String mobilePhone;
	/**
	 * 联系电话
	 */
	private String telephone;
	/**
	 * 密码
	 */
	private String password;
	/**
	 * 加盐
	 */
	private String salt;
	/**
	 * 性别
	 */
	private Integer sex;
	/**
	 * 是否锁定
	 */
	private Boolean isLocked;
	/**
	 * 创建时间
	 */
	private Date createTime;
	/**
	 * 更新时间
	 */
	private Date updateTime;
	/**
	 * 是否删除
	 */
	private Boolean isDeleted;
    // get set 略
  • mldong-mapper/src/main/java/com/mldong/base/BaseMapper.java

持久层基类

package com.mldong.base;

import tk.mybatis.mapper.common.ConditionMapper;
import tk.mybatis.mapper.common.Marker;
import tk.mybatis.mapper.common.RowBoundsMapper;
/**
 * mapper基类
 * @author mldong
 *
 * @param <T>
 */
public interface BaseMapper<T> extends tk.mybatis.mapper.common.BaseMapper<T>,
		ConditionMapper<T>, RowBoundsMapper<T>, Marker {

}
  • mldong-mapper/src/main/java/resources/mapper/sys/sys_user_mapper.xml

mapper对应的xml,与表一对一关系,这里主要是表字段的维护。该层后面定义为不可人工修改层(只能由代码生成器生成)。生成这个的目的是方便dao/*/*.xml继承。

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.mldong.modules.sys.mapper.SysUserMapper">
	<resultMap id="BaseResultMap" type="com.mldong.modules.sys.entity.SysUser">
		<id column="id" property="id" />
		<result column="user_name" property="userName" />  
		<result column="real_name" property="realName" />  
		<result column="avatar" property="avatar" />  
		<result column="email" property="email" />  
		<result column="mobile_phone" property="mobilePhone" />  
		<result column="telephone" property="telephone" />  
		<result column="password" property="password" />  
		<result column="salt" property="salt" />  
		<result column="sex" property="sex" />  
		<result column="is_locked" property="isLocked" />  
		<result column="create_time" property="createTime" />  
		<result column="update_time" property="updateTime" />  
		<result column="is_deleted" property="isDeleted" />  
	</resultMap>
</mapper>

代码生成规则说明

这里只是以sys_user为样例进行说明。

类名 描述 规则说明
SysUserController 控制层类 该层可由代码生成器生成,只生成一次,再次生成不能覆盖。
SysUserParam 接收参数实体 该层可由代码生成器生成,只生成一次,再次生成不能覆盖。
SysUserService 业务层接口 该层可由代码生成器生成,只生成一次,再次生成不能覆盖。
SysUserServiceImpl 业务层接口实现 该层可由代码生成器生成,只生成一次,再次生成不能覆盖。
SysUserDao 自定义持久层 该层定义为人工添加层,按需自己新增。配套的sys_user_dao.xml也一样。
SysUserMapper 持久层 该层可由代码生成器生成,每次变字段的变动,都需要重新生成一次,可覆盖。
SysUser 实体类 该层可由代码生成器生成,每次变字段的变动,都需要重新生成一次,可覆盖。
sys_user_mapper.xml 持久层对应的xml 该层可由代码生成器生成,每次变字段的变动,都需要重新生成一次,可覆盖。

本文说到的代码生成器,后续会有文章对其进行详细说明,这里先不展开。

启动运行项目

MldongAdminApplication.java

右键->Run As -> Java Application

访问演示

项目源码地址

  • 后端

gitee.com/mldong/mldo…

  • 前端

gitee.com/mldong/mldo…

相关文章

打造一款适合自己的快速开发框架-先导篇

打造一款适合自己的快速开发框架-后端脚手架搭建

打造一款适合自己的快速开发框架-集成mapper

打造一款适合自己的快速开发框架-集成swaggerui和knife4j

打造一款适合自己的快速开发框架-通用类封装之统一结果返回、统一异常处理

打造一款适合自己的快速开发框架-业务错误码规范及实践