前言
任何一个快速开发框架,都离不开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
访问演示
略
项目源码地址
- 后端
- 前端
相关文章
打造一款适合自己的快速开发框架-集成swaggerui和knife4j