哈哈,猿设计终于讲完了,接下来的一段时间,工厂君打算和大家一起来实现我们之间的设计——构建一个自己的电商系统来玩耍。嗯,这个可是一个大工程,代码量很大,业务也比较复杂,要搞就好好搞,代码方面还是需要一些规范的。
在这个背景下,工厂君为了解决代码的编写速度,也差点被逼上梁山——一个人的力量实在太有限了。工厂君灵机一动,决定搞一个适合项目开发的利器出来——pz-cg。在它的帮帮助下,工厂君节约了开发时间,大大地提高了工作效率。
其实对于新手而言,过度的依赖这类工具,深受其害的事情是大概率事件,如果你是一个新手,希望你在以后的学习中,尽量的去手写代码。虽然会吃力一些,遇到各种稀奇古怪的问题,但这是你的猿人生涯中,必须去面对和解决的事情。言尽于此,不再絮叨。
其实代码生成器有很多,网络上也有各种各样的版本,自然是各有各的好处,也各有各的弊端,今天工厂君会带着大家去造轮子——造一个符合大多数公司编码规范,也能够支持你快速修改的代码生成轮子。造轮子其实也是快速提升你技术实力的一种方式,你经常吐槽CRUD没技术含量,那么你就写个制造CRUD的代码机器出来如何?这个过程也是能提高你的技术实力的,准备好你的收藏,今天的东西,以后你大概率用得上,能够帮你解决实际问题。
既然要搞一个轮子,我们还是希望这个轮子相对通用,不但可以支持springMVC、Spring、Mybatis,在SpringBoot,SpringCloud的框架下依然可用才是硬道理^_^
既然是代码生成器,那么我们不妨来想一想,我们要生成什么样的代码?什么样的代码是需要我们去生成的?我们要搞的代码生成的本质是什么?关于这个答案,我们需要从一些需要去完成的功能中,管中窥豹一番。就以我们后续会讲到的品牌管理为例吧。
上图的功能就是一个较为典型的管理功能,像这一类功能,都有一些共同的特点——新增、修改、删除、列表查询(包括分页功能)。这些功能是相对固定的,代码的编写方式也相对有一定的痕迹可以寻觅。我们先一起来看一看后端的代码。
一般来说,在使用SpringMVC、Spring、Mybatis框架,进行开发的方式,像上述这样一个比较基本的页面,对应的后端代码,会分为Controller、service、dao三个层面。Controller层负责页面数据的封装、service层负责组织业务逻辑,dao层负责持久化数据。当然,如果你要分得细一点,会加入一个manager层面,用于组织数据持久层的代码,将业务逻辑交由service进行管控也是常见的做法。考虑到这个功能比较简单,我们并没有使用manager层,稍微简单一些,我们先看代码。
/** * Copyright(c) 2004-2020 pangzi *com.pz.basic.mall.controller.sys.MallBrandController.java */package com.pz.basic.mall.controller.sys; import com.pz.basic.mall.domain.base.Result;import com.pz.basic.mall.dmain.base.enums.DataActiveStatusEnum;import com.pz.basic.mall.domain.base.enums.DataStatusEnum;import com.pz.basic.mall.domain.sys.MallBrand;import com.pz.basic.mall.domain.sys.query.QueryMallBrand;import com.pz.basic.mall.service.sys.MallBrandService;import org.springframework.web.bind.annotation.RequestBody;import org.springframework.web.bind.annotation.RequestMapping;import org.springframework.web.bind.annotation.RestController; import java.util.List; /** * * @author pangzi * @date 2020-06-22 20:47:27 * * */@RestController@RequestMapping("/brandManage")public class MallBrandController {
private MallBrandService mallBrandService; public void setMallBrandService(MallBrandService mallBrandService) {
this.mallBrandService =mallBrandService; } /** * 新增品牌 * @param mallBrand * @return */ @RequestMapping("/addMallBrand") public Result addMallBrand(@RequestBody MallBrandmallBrand){
try{
return mallBrandService.addMallBrand(mallBrand); }catch(Exception e){
e.printStackTrace(); return new Result(false); } } /** * 修改品牌 * @param mallBrand * @return */ @RequestMapping("/updateMallBrand") public Result updateMallBrand(@RequestBodyMallBrand mallBrand){
try{
return mallBrandService.updateMallBrandById(mallBrand); }catch(Exception e){
e.printStackTrace(); return new Result(false); } } /** * 删除品牌 * @param mallBrand * @return */ @RequestMapping("/deleteMallBrand") public Result deleteMallBrand(@RequestBodyMallBrand mallBrand){
try{
return mallBrandService.deleteMallBrandById(mallBrand); }catch(Exception e){
e.printStackTrace(); return new Result(false); } } /** * 分页返回品牌列表 * @param queryMallBrand * @return */ @RequestMapping("/findByPage") public Result> findByPage(@RequestBody QueryMallBrand queryMallBrand){
returnmallBrandService.getMallBrandsByPage(queryMallBrand); } }
/** * Copyright(c) 2004-2020 pangzi *com.pz.basic.mall.service.sys.MallBrandService.java */package com.pz.basic.mall.service.sys;import java.util.List; import com.pz.basic.mall.domain.base.Result;import com.pz.basic.mall.domain.sys.query.QueryMallBrand; import com.pz.basic.mall.domain.sys.MallBrand;import java.util.Map;import java.io.Serializable; /** * service层,组装外部接口 和 本地业务,为本业务 或者其他业务提供服务,统一返回Result * 通过Result.isSuccess判断调用是否成功 * 此类中新增业务接口设计(接口命令,入参数据,返回值)要 能尽量完整的表达业务 含义 * @author pangzi * @date 2020-06-26 11:20:40 */public interface MallBrandService {
/** * 新增 mallBrand * 返回result,通过result.isSuccess()判断服务调用是否成功 * 通过result.getModel()得到新增mallBrand * @param mallBrand * @return */ public Result addMallBrand(MallBrand mallBrand) ; /** * 按照主键id更新mallBrand,请重新newMallBrand 的更新对象,设置要更新的字段 * 返回result,通过result.isSuccess()判断更新是否成功 * @param id * @param mallBrand * @return */ public Result updateMallBrandById(MallBrandmallBrand); /** * 按照主键id 删除 记录 * 返回result,通过result.isSuccess()判断删除是否成功 * @param id * @return */ public Result deleteMallBrandById(MallBrandmallBrand); /** * 查询列表,此接口不包含分页查询 * 返回result,通过result.isSuccess()判断服务调用是否成功 * 通过result.getModel()得到列表信息 * @param queryMallBrand * @return */ public Result<List> getMallBrandsByQuery(QueryMallBrand queryMallBrand); /** * 通过主键id查询MallBrand * 返回result,通过result.isSuccess()判断服务调用是否成功 * 通过result.getModel()得到查询的单条mallBrand信息 * @param id * @return */ public Result getMallBrandById(long id); /** * 查询列表,包含分页查询 * 查询分页信息,请设置 * QueryMallBrand.setIndex(设置当前页数) * QueryMallBrand.setPageSize(设置当前页面数据行数) * 返回result,通过result.isSuccess()判断服务调用是否成功 * 通过result.getTotal()返回结果总数 * 通过result.getModel()得到查询的单页列表信息 * @param queryMallBrand * @return */ public Result<List> getMallBrandsByPage(QueryMallBrand queryMallBrand); /** * 查询总数 * @param queryMallBrand * @return */ public Resultcount(QueryMallBrand queryMallBrand); }
/** * Copyright(c) 2004-2020 pangzi *com.pz.basic.mall.service.sys.impl.MallBrandService.java */package com.pz.basic.mall.service.sys.impl;import com.pz.basic.mall.dao.sys.MallBrandDao; import java.util.ArrayList;import java.util.List; import com.pz.basic.mall.domain.base.Result;import com.pz.basic.mall.domain.base.enums.DataActiveStatusEnum;import com.pz.basic.mall.domain.base.enums.DataStatusEnum;import com.pz.basic.mall.domain.sys.query.QueryMallBrand;import com.pz.basic.mall.service.sys.MallBrandService; import com.pz.basic.mall.domain.sys.MallBrand; /** * * @author pangzi * @date 2020-06-26 11:25:00 */public class MallBrandServiceImpl implements MallBrandService {
private MallBrandDao mallBrandDao; public void setMallBrandDao (MallBrandDaomallBrandDao) {
this.mallBrandDao = mallBrandDao; } public ResultaddMallBrand(MallBrand mallBrand) {
Resultresult = new Result(); try {
QueryMallBrand query= new QueryMallBrand(); query.setBrandName(mallBrand.getBrandName()); long count =mallBrandDao.countByQuery(query); if(count>0){
result.setSuccess(false); result.setMessage("品牌名已存在"); returnresult; } mallBrand.setStatus(DataStatusEnum.STATUS_ENABLE.getStatusValue()); mallBrand.setActive(DataActiveStatusEnum.STATUS_ACTIVE.getStatusValue()); mallBrandDao.insertMallBrand(mallBrand); result.addDefaultModel(mallBrand); } catch(Exception e) {
result.setSuccess(false); } return result; } public Result updateMallBrandById(MallBrandmallBrand) {
Result result = new Result(); try {
int count=mallBrandDao.updateMallBrandByIdModified(mallBrand); if(count>0){
result.setSuccess(true); } } catch(Exception e) {
result.setSuccess(false); } return result; } public Result deleteMallBrandById(MallBrandmallBrand) {
Result result = new Result(); try {
int count=0; MallBrandmodifiedMallBrand = new MallBrand(); modifiedMallBrand.setId(mallBrand.getId()); modifiedMallBrand.setActive(DataActiveStatusEnum.STATUS_DELETED.getStatusValue()); count=mallBrandDao.updateMallBrandByIdModified(modifiedMallBrand); if(count>0){
result.setSuccess(true); } } catch(Exception e) {
result.setSuccess(false); } return result; } public Result<List>getMallBrandsByQuery(QueryMallBrand queryMallBrand) {
Result<List>result = new Result<List>(); try {
queryMallBrand.setActive(DataActiveStatusEnum.STATUS_ACTIVE.getStatusValue()); result.addDefaultModel("MallBrands",mallBrandDao.selectMallBrandByQuery(queryMallBrand)); } catch(Exception e) {
result.setSuccess(false); } return result; } public ResultgetMallBrandById(long id) {
Resultresult = new Result(); try { result.addDefaultModel("MallBrand",mallBrandDao.selectMallBrandById(id)); } catch(Exception e) {
result.setSuccess(false); } return result; } public Result<List>getMallBrandsByPage(QueryMallBrand queryMallBrand) {
Result<List>result = new Result<List>(); queryMallBrand.setActive(DataActiveStatusEnum.STATUS_ACTIVE.getStatusValue()); long totalItem =mallBrandDao.countByQuery(queryMallBrand); queryMallBrand.setTotalItem(totalItem); queryMallBrand.repaginate(); if (totalItem > 0) {
result.addDefaultModel(mallBrandDao.selectMallBrandByPage(queryMallBrand)); } else {
result.addDefaultModel(newArrayList()); } result.setTotalItem(totalItem); result.setPageSize(queryMallBrand.getPageSize()); result.setPage(queryMallBrand.getPage()); return result; } public Resultcount(QueryMallBrand queryMallBrand) {
Result result =new Result(); queryMallBrand.setActive(DataActiveStatusEnum.STATUS_ACTIVE.getStatusValue()); try { result.addDefaultModel(mallBrandDao.countByQuery(queryMallBrand)); } catch(Exception e) {
result.setSuccess(false); } return result; } }
/** * Copyright(c) 2004-2020 pangzi * com.pz.basic.mall.dao.sys.MallBrandDao.java */package com.pz.basic.mall.dao.sys;import java.util.List;import com.pz.basic.mall.domain.sys.MallBrand;import com.pz.basic.mall.domain.sys.query.QueryMallBrand; import java.util.Map;import java.io.Serializable; /** * * @author pangzi * @date 2020-06-26 10:56:01 */public interfaceMallBrandDao {
/** * 根据条件查询总数 * @param QueryMallBrand query * @return */ long countByQuery(QueryMallBrand query); /** * 根据条件删除记录 * @param MallBrandQuery query * @return */ int deleteMallBrandByQuery(QueryMallBrandquery); /** * 根据ID删除记录 * @param id * @return */ int deleteMallBrandById(long id); /** * 新增记录 * @param MallBrand record * @return */ long insertMallBrand(MallBrand record); /** * 新增记录 注意:有值的记录才新增 * @param MallBrand record * @return */ long insertMallBrandModified(MallBrandrecord); /** * 根据查询条件返回列表 * @param QueryMallBrand query * @return */ ListselectMallBrandByQuery(QueryMallBrand query); /** * 根据查询条件返回列表 * @param QueryMallBrand query * @return */ ListselectMallBrandByPage(QueryMallBrandquery); /** * 根据ID查询对象 * @param Long id * @return */ MallBrand selectMallBrandById(long id); /** * 根据id修改记录 注意:有值的字段才更新 * @param MallBrand record * @return */ int updateMallBrandByIdModified(MallBrandrecord); }
Mapper文件:
<?xmlversion ="1.0" encoding="UTF-8" ?> <mappernamespace="com.pz.basic.mall.dao.sys.MallBrandDao"> <resultMap id="ResultMap"type="MallBrand"> <idproperty="id" column="id"/> <idproperty="brandName" column="brand_name"/> <idproperty="logo" column="logo"/> <idproperty="firstChar" column="first_char"/> <idproperty="status" column="status"/> <idproperty="active" column="active"/> <idproperty="createUser" column="create_user"/> <idproperty="modifyUser" column="modify_user"/> <idproperty="created" column="created"/> <idproperty="modified" column="modified"/> resultMap> <sql id="ALL_TABLE_COLOUM"> id, brand_name, logo, first_char, status, active, create_user, modify_user, created, modified sql> <sqlid="Query_Where_Clause" > <where > 1=1 <choose> <when test="id != null and id !=''"> and id = #{id} when> <whentest="brandName != null and brandName != ''"> and brand_name = #{brandName} when> <whentest="logo != null and logo != ''"> and logo = #{logo} when> <whentest="firstChar != null and firstChar != ''"> and first_char = #{firstChar} when> <whentest="status != null and status != ''"> and status = #{status} when> <whentest="active != null and active != ''"> and active = #{active} when> <whentest="createUser != null and createUser != ''"> and create_user = #{createUser} when> <whentest="modifyUser != null and modifyUser != ''"> and modify_user = #{modifyUser} when> <whentest="created != null and created != ''"> and created = #{created} when> <whentest="modified != null and modified != ''"> and modified = #{modified} when> choose> where> sql> <select id="selectMallBrandByQuery" resultMap="ResultMap"parameterType="QueryMallBrand" > select <includerefid="ALL_TABLE_COLOUM" /> from mall_brand <if test="page != null" > <include refid="Query_Where_Clause"/> if> select> <select id="selectMallBrandByPage" resultMap="ResultMap"parameterType="QueryMallBrand" > select <includerefid="ALL_TABLE_COLOUM" /> from mall_brand <if test="page != null"> <includerefid="Query_Where_Clause" /> if> LIMIT #{startRow},#{pageSize} select> <select id="selectMallBrandById"resultMap="ResultMap" parameterType="java.lang.Long" > select <include refid="ALL_TABLE_COLOUM"/> from mall_brand where id = #{id} select> <delete id="deleteMallBrandById"parameterType="java.lang.Integer" > delete from mall_brand where id = #{id} delete> <delete id="deleteMallBrandByQuery" parameterType= "QueryMallBrand"> delete from mall_brand <if test="page != null" > <includerefid="Query_Where_Clause" /> if> delete> <insert id="insertMallBrand"parameterType="MallBrand" > INSERT INTO mall_brand(id,brand_name,logo,first_char,status,active,create_user,modify_user,created,modified) VALUES(#{id},#{brandName},#{logo},#{firstChar},#{status},#{active},#{createUser},#{modifyUser},#{created},#{modified}) <selectKey resultType="long"keyProperty="id"> SELECT @@IDENTITY AS ID