mybatisplus自动生成id_纯手撸:一键生成前后端代码,Mybatis-Plus代码生成器,舒服了...

本文介绍了如何利用Mybatis-Plus的代码生成器提高开发效率,通过AutoGenerator自动生成Entity、Mapper、Service、Controller等代码,并提供数据库脚本、Maven依赖、配置文件和模板文件的详细说明,帮助开发者一键生成前后端代码。
摘要由CSDN通过智能技术生成

作者:GitHub摸轮子啊

链接:https://juejin.im/post/6855567242315989006

前言

在日常的软件开发中,程序员往往需要花费大量的时间写CRUD,不仅枯燥效率低,而且每个人的代码风格不统一。MyBatis-Plus 代码生成器,通过 AutoGenerator 可以快速生成 Entity、Mapper、Mapper XML、Service、Controller 等各个模块及前端页面的代码,极大的提升了开发效率。

项目介绍

本项目将以springboot用演示,前端使用freemaker,数据库持久层用mybatis(考虑到mybatis的使用还是最普遍的,就没有用jpa和mybatisplus),通过Velocity模板引擎配置各模块的文件模板,通过mybatis-plus代码生成器连接mysql,用商品表为例生成各模块的代码和前端页面。(本项目只演示分页查询和导出功能)。

实战

数据库脚本

创建一张商品表test_goods

CREATE TABLE `test_goods` (  `id` bigint(20) DEFAULT NULL COMMENT 'id',  `goods_sn` varchar(45) DEFAULT NULL COMMENT '商品编码',  `name` varchar(255) DEFAULT NULL COMMENT '商品名称',  `title` varchar(80) DEFAULT NULL COMMENT '标题',  `price` decimal(10,2) DEFAULT NULL COMMENT '售价',  `status` int(2) DEFAULT NULL COMMENT '商品状态',  `sale_count` int(11) DEFAULT NULL COMMENT '销量',  `create_date` datetime DEFAULT NULL COMMENT '创建时间',  `modify_date` datetime DEFAULT NULL COMMENT '修改时间') ENGINE=InnoDB DEFAULT CHARSET=utf8复制代码

maven依赖

  org.springframework.boot            spring-boot-starter-web        org.mybatis.spring.boot            mybatis-spring-boot-starter            2.1.2org.springframework.boot            spring-boot-starter-data-redis        com.baomidou            mybatis-plus            2.1.4org.aspectj            aspectjweaver            providedorg.projectlombok            lombok            1.16.10providedorg.apache.velocity            velocity-engine-core            2.0mysql            mysql-connector-java            runtimecom.opencsv            opencsv            3.8org.springframework.boot            spring-boot-starter-freemarker        复制代码

配置文件

mybatis:  mapper-locations: classpath:mybatis/*Mapper.xml  type-aliases-package: com.lzn.mybatisplus.codegenerator.entityspring:  datasource:    username: root    password: 123qwe    url: jdbc:mysql://192.168.0.1:3306/myProject?useUnicode=true&characterEncoding=utf-8&useSSL=false&serverTimezone=UTC    driver-class-name: com.mysql.jdbc.Driver  redis:    host: 192.168.0.1    password: 1234qwer    port: 6379  freemarker:    template-loader-path: classpath:/templates/pages/    cache: false    charset: UTF-8    check-template-location: true    content-type: text/html    expose-request-attributes: true    expose-session-attributes: true    suffix: .ftl复制代码

模板文件

本项目中,所有模块的文件都是用Velocity模板引擎生成,这里简单介绍下Velocity的语法,在Velocity中用表示变量,例如:{}表示变量,例如:表示变量,例如:{table.entityName} 表示实体名,{field.name} 表示字段名,我们在AutoGenerator代码生成器里定义的全局变量 ${author}、{date} 表示作者,日期等。在Velocity中用#表示语法,例如 #foreach($field in ${table.fields}) #end遍历表字段。下面演示几个类、前端文件、xml文件的模板文件

实体类模板(entity.java.vm)

package ${package.Entity};import java.math.BigDecimal;import java.util.Date;import lombok.Getter;import lombok.Setter;import lombok.ToString;/** * 数据库表名 ${table.name} * * @author ${author} * @date ${date} */@Getter@Setter@ToStringpublic class ${table.entityName}  {    #foreach($field in ${table.fields})    /**     * 数据库字段名 ${field.name} 类型 ${field.type}     */    private ${field.propertyType}  ${field.propertyName};    #end}复制代码

Controller模板(controller.java.vm)

package ${package.Controller};import ${package.Entity}.${entity};import ${package.Service}.${table.serviceName};import com.lzn.mybatisplus.codegenerator.export.${table.entityName}VO;import com.lzn.mybatisplus.codegenerator.export.${table.entityName}ExportService;import com.lzn.mybatisplus.codegenerator.utils.entity.*;import com.lzn.mybatisplus.codegenerator.utils.export.*;import org.apache.commons.beanutils.ConvertUtils;import com.lzn.mybatisplus.codegenerator.utils.ParameterUtil;import com.lzn.mybatisplus.codegenerator.utils.entity.GridDataModel;import org.slf4j.Logger;import org.slf4j.LoggerFactory;import org.springframework.stereotype.Controller;import org.springframework.ui.Model;import org.springframework.web.bind.annotation.*;import javax.annotation.Resource;import javax.servlet.ServletRequest;import javax.servlet.http.HttpServletRequest;import java.util.List;import java.util.Map;/** * 

* ${tablecomment} 前端控制器 *

* * @author ${author} * @since ${date} */@Controller@RequestMapping(value="/admin/${table.entityPath}")public class ${table.controllerName}{ private static Logger logger = LoggerFactory.getLogger(${table.controllerName}.class); @Resource private ${entity}Service ${table.entityPath}Service; @RequestMapping(value = "list", method = RequestMethod.GET) public String list(Model model){ return "/admin/${cfg.pageDirName}/list"; } @RequestMapping(value = "searchList", method = RequestMethod.POST) @ResponseBody @ExportMethod(serviceClass = ${entity}ExportService.class, memo = "明细导出") public String searchList(ServletRequest request,@ModelAttribute("page") OmuiPage page){ try { Map searchParam = ParameterUtil.getParametersStartingWith(request, "filter_"); GridDataModel gd =${table.entityPath}Service.findByPage(searchParam, page); return JsonMapper.nonDefaultMapper().toJson(gd); } catch (Exception e) { logger.error("查询出错了",e); return JsonMapper.nonDefaultMapper().toJson(new Resp("false", e.getMessage())); } }}复制代码

Service类模板(service.java.vm)

package ${package.Service};import org.springframework.stereotype.Service;import com.lzn.mybatisplus.codegenerator.dao.${table.mapperName};import com.lzn.mybatisplus.codegenerator.utils.entity.GridDataModel;import com.lzn.mybatisplus.codegenerator.utils.entity.OmuiPage;import com.lzn.mybatisplus.codegenerator.export.${table.entityName}VO;import javax.annotation.Resource;import java.math.BigDecimal;import java.text.DateFormat;import java.text.ParseException;import java.text.SimpleDateFormat;import java.util.*;/** * 

* $!{tablecomment} 服务类 *

* * @author ${author} * @since ${date} */@Servicepublic class ${table.serviceName} { @Resource private ${table.mapperName} ${table.entityPath}Dao; /** * 分页查询 * */ public GridDataModel findByPage(Map searchParams, OmuiPage page){ GridDataModel gm = new GridDataModel(); searchParams.put("start", page.getStart()); searchParams.put("limit", page.getLimit()); long count = ${table.entityPath}Dao.countForPage(searchParams); List list = ${table.entityPath}Dao.listForPage(searchParams); gm.setTotal(count); gm.setRows(list); return gm; }}复制代码

Dao类模板(dao.java.vm)

package ${package.Mapper};import com.lzn.mybatisplus.codegenerator.entity.${table.entityName};import com.lzn.mybatisplus.codegenerator.export.${table.entityName}VO;import java.util.List;import java.util.Map;public interface ${table.mapperName}  {    /**     *  根据主键删除数据库的记录, ${table.name}     */    int deleteByPrimaryKey(Long id);    /**     *  新写入数据库记录, ${table.name}     */    int insert(${table.entityName} record);    /**     *  根据指定主键获取一条数据库记录, ${table.name}     */    ${table.entityName} selectByPrimaryKey(Long id);    /**     *  根据主键来更新符合条件的数据库记录, ${table.name}     */    int updateByPrimaryKey(${table.entityName} record);    /**     *  根据条件分页查询     * */    List listForPage(Map searchMap);    /**     *  根据条件分页查询(计数)     * */    long countForPage(Map searchMap);    }复制代码

Mapper.xml模板(mapper.xml.vm)

<?xml version="1.0" encoding="UTF-8"?>    #if(${baseResultMap})                            #foreach($field in ${table.fields})                #if(${field.keyFlag})##生成主键排在第一位                                    #end            #end            #foreach($field in ${table.commonFields})##生成公共字段                            #end            #foreach($field in ${table.fields})                #if(!${field.keyFlag})##生成普通字段                                    #end            #end            #end    #if(${baseColumnList})                        #foreach($field in ${table.commonFields})            #if(${field.name} == ${field.propertyName})${field.name}#else${field.name} AS ${field.propertyName}#end,        #end        ${table.fieldNames}            #end            delete from ${table.name}        where        #foreach($field in ${table.fields})            #if(${field.keyFlag})## 主键                ${field.name} = #{ ${field.propertyName} }            #end        #end                SELECT LAST_INSERT_ID()                insert into ${table.name} (        #foreach($field in ${table.fields})            #if(!${field.keyFlag})##生成普通字段                ${field.name}#if($foreach.hasNext),#end            #end        #end        )        values (        #foreach($field in ${table.fields})            #if(!${field.keyFlag})##生成普通字段                #{ ${field.propertyName}}#if($foreach.hasNext),#end            #end        #end        )            update ${table.name}        set        #foreach($field in ${table.fields})            #if(!${field.keyFlag})##生成普通字段               ${field.name} = #{ ${field.propertyName}} #if($foreach.hasNext),#end            #end        #end        where        #foreach($field in ${table.fields})            #if(${field.keyFlag})              id = #{ ${field.name} }            #end        #end            select                from ${table.name}        where id = #{ id }            select         count(*)        from        ${table.name}        where 1=1                    and create_date =]]>  #{beginDate}                    and  create_date  #{endDate}                select                from        ${table.name}        where 1=1                    and create_date =]]>  #{beginDate}                    and  create_date  #{endDate}                limit #{start}, #{limit}    复制代码

前端页面list.ftl模板(list.ftl.vm)

 $!{tablecomment}
状态: 待处理已处理全部手机号: 联系人: 创建时间: - 查询
复制代码

代码生成器

package com.lzn.mybatisplus.codegenerator;import com.baomidou.mybatisplus.generator.AutoGenerator;import com.baomidou.mybatisplus.generator.InjectionConfig;import com.baomidou.mybatisplus.generator.config.*;import com.baomidou.mybatisplus.generator.config.converts.MySqlTypeConvert;import com.baomidou.mybatisplus.generator.config.po.TableInfo;import com.baomidou.mybatisplus.generator.config.rules.DbColumnType;import com.baomidou.mybatisplus.generator.config.rules.DbType;import com.baomidou.mybatisplus.generator.config.rules.NamingStrategy;import java.util.ArrayList;import java.util.HashMap;import java.util.List;import java.util.Map;/** * 辅助生产后台开发相关代码  开发时只在自己本地代码修改,不要提交 * 生成ddao service controller entity java代码 和前端 flt文件。 * 只演示list场景 */public class MpGenerator {    //注意:开发时只在自己本地代码修改,不要提交、不要提交 不要提交    //第一步修改 javaSrcDir 修改成自己项目存放java源代码的根路径    static String javaSrcDir = "D:/Git_space/lunzijihua/codegenerator/src/main/java";    static String resourceDir = "D:/Git_space/lunzijihua/codegenerator/src/main/resources";    //第二步修改 pageRootDir 修改成你要开发的模块的名称 存放ftl文件的文件夹的根路径    static String pageRootDir ="D:/Git_space/lunzijihua/codegenerator/src/main/resources/templates/pages/";    //第三步修改 packageName 修改成你要开发的模块的名称 包名 要小写 生产的entity service dao action文件夹和java代码会在下面    static String packageName = "user";//模块文件夹包名称    //第四步修改 pageDirName 修改成你要开发的模块的名称 存放ftl文件的文件夹 要小写    static String pageDirName = "user";//模块页面文件夹名    //第五步骤 表的前缀 填写了 生成文件时会去除掉    static String tablePrefix="test_";    //第六步 数据库里面对应的表的全名    static String tableName="test_goods";    /**     * 

* 代码自动生成 *

*/ public static void main(String[] args) { AutoGenerator mpg = new AutoGenerator(); // 全局配置 GlobalConfig gc = new GlobalConfig(); gc.setOutputDir(javaSrcDir); gc.setFileOverride(true); gc.setActiveRecord(true);// 不需要ActiveRecord特性的请改为false gc.setEnableCache(false);// XML 二级缓存 gc.setBaseResultMap(true);// XML ResultMap gc.setBaseColumnList(true);// XML columList // .setKotlin(true) 是否生成 kotlin 代码 gc.setAuthor("liuzhinan"); // 自定义文件命名,注意 %s 会自动填充表实体属性! gc.setMapperName("%sMybatisDao"); // gc.setXmlName("%sDao"); gc.setServiceName("%sService");// gc.setServiceImplName("%sService"); // gc.setControllerName("%sAction"); mpg.setGlobalConfig(gc); // 数据源配置 DataSourceConfig dsc = new DataSourceConfig(); dsc.setDbType(DbType.MYSQL); dsc.setTypeConvert(new MySqlTypeConvert(){ // 自定义数据库表字段类型转换【可选】 @Override public DbColumnType processTypeConvert(String fieldType) { System.out.println("转换类型:" + fieldType); // 注意!!processTypeConvert 存在默认类型转换,如果不是你要的效果请自定义返回、非如下直接返回。 return super.processTypeConvert(fieldType); } }); dsc.setDriverName("com.mysql.jdbc.Driver"); dsc.setUsername("test"); dsc.setPassword("123456"); dsc.setUrl("jdbc:mysql://192.168.0.1:3306/myProject?useSSL=false"); mpg.setDataSource(dsc); // 策略配置 StrategyConfig strategy = new StrategyConfig(); // strategy.setCapitalMode(true);// 全局大写命名 ORACLE 注意 strategy.setTablePrefix(new String[] { tablePrefix });// 此处可以修改为您的表前缀 strategy.setNaming(NamingStrategy.underline_to_camel);// 表名生成策略 strategy.setInclude(new String[] { tableName }); // 需要生成的表 // strategy.setExclude(new String[]{"test"}); // 排除生成的表 // 自定义实体父类 strategy.setSuperEntityClass("com.lzn.mybatisplus.codegenerator.entity.IdEntity"); // 自定义实体,公共字段 // strategy.setSuperEntityColumns(new String[] { "id", "create_date","modify_date" }); // 自定义 mapper 父类 // strategy.setSuperMapperClass("com.baomidou.demo.TestMapper"); // 自定义 service 父类 // strategy.setSuperServiceClass("com.baomidou.demo.TestService"); // 自定义 service 实现类父类 // strategy.setSuperServiceImplClass("com.baomidou.demo.TestServiceImpl"); // 自定义 controller 父类 // strategy.setSuperControllerClass("com.baomidou.demo.TestController"); // 【实体】是否生成字段常量(默认 false) // public static final String ID = "test_id"; // strategy.setEntityColumnConstant(true); // 【实体】是否为构建者模型(默认 false) // public User setName(String name) {this.name = name; return this;} // strategy.setEntityBuilderModel(true); mpg.setStrategy(strategy); // 包配置 PackageConfig pc = new PackageConfig(); pc.setParent("com.lzn.mybatisplus.codegenerator"); pc.setModuleName(null); pc.setMapper("dao"); pc.setEntity("entity"); pc.setService("service"); pc.setServiceImpl("service.impl"); pc.setController("controller"); mpg.setPackageInfo(pc); // 注入自定义配置,可以在 VM 中使用 cfg.abc 【可无】 InjectionConfig cfg = new InjectionConfig() { @Override public void initMap() { Map map = new HashMap(); map.put("abc", this.getConfig().getGlobalConfig().getAuthor() + "-mp"); map.put("pageDirName",pageDirName); map.put("packageName",packageName); this.setMap(map); } }; List focList = new ArrayList();// cfg.setFileOutConfigList(focList);// mpg.setCfg(cfg); //生成导出视图对象 focList.add(new FileOutConfig("/templates/vm/vo.java.vm") { @Override public String outputFile(TableInfo tableInfo) { return javaSrcDir+"/com/lzn/mybatisplus/codegenerator/export/"+tableInfo.getEntityName()+"VO.java"; } }); //生成excel导出的服务类, focList.add(new FileOutConfig("/templates/vm/exportservice.java.vm") { @Override public String outputFile(TableInfo tableInfo) { return javaSrcDir+"/com/lzn/mybatisplus/codegenerator/export/"+tableInfo.getEntityName()+"ExportService.java"; } }); //生成mybatisDao文件到指定目录 focList.add(new FileOutConfig("/templates/vm/mybatisdao.java.vm") { @Override public String outputFile(TableInfo tableInfo) { return javaSrcDir+"/com/lzn/mybatisplus/codegenerator/dao/"+tableInfo.getEntityName()+"MybatisDao.java"; } }); //生成mapper文件到指定目录 focList.add(new FileOutConfig("/templates/vm/mapper.xml.vm") { @Override public String outputFile(TableInfo tableInfo) { return resourceDir+"/mybatis/"+tableInfo.getEntityName()+"Mapper.xml"; } }); // 自定义 xxList.ftl 生成 focList.add(new FileOutConfig("/templates/vm/list.ftl.vm") { @Override public String outputFile(TableInfo tableInfo) { // 自定义输入文件名称 return pageRootDir+pageDirName+"/list.ftl"; } }); cfg.setFileOutConfigList(focList); mpg.setCfg(cfg); // 关闭默认 xml 生成,调整生成 至 根目录 TemplateConfig tc = new TemplateConfig(); tc.setEntity("/templates/vm/entity.java.vm"); tc.setService("/templates/vm/service.java.vm"); tc.setServiceImpl(null);//设成null才会不生产 tc.setController("/templates/vm/controller.java.vm"); tc.setMapper(null); tc.setXml(null); mpg.setTemplate(tc); // 自定义模板配置,可以 copy 源码 mybatis-plus/src/main/resources/templates 下面内容修改, // 放置自己项目的 src/main/resources/templates 目录下, 默认名称一下可以不配置,也可以自定义模板名称 // TemplateConfig tc = new TemplateConfig(); // tc.setController("..."); // tc.setEntity("..."); // tc.setMapper("..."); // tc.setXml("..."); // tc.setService("..."); // tc.setServiceImpl("..."); // 如上任何一个模块如果设置 空 OR Null 将不生成该模块。 // mpg.setTemplate(tc); // 执行生成 mpg.execute(); // 打印注入设置【可无】 System.err.println(mpg.getCfg().getMap().get("abc")); }}复制代码

执行代码生成器的Main方法

d5afcb89f6c9aab0e63a2a2656915a5f.png

执行代码后,在对应的目录自动生成了文件

c16f7bdb331bb7ddb0207e7941d72b0f.png

启动项目

488eb33bcc0d46de3c3af040d2634676.png

并访问列表页路径 http://localhost:8080/admin/goods/list

a697ff65f62a1230dbeefd0b1763915a.png
26863bb3adec29dc32fa66ae7ca69b8a.png

点击导出按钮(由于篇幅有限,导出的视图对象,导出service类和aop切面实现本文没有阐述,各位可自行下载代码查看)

d73711e1df1a0679b92100d201f34839.png
9d287ed898054d45bac335173b5e2505.png

总结

本文为项目自动生成前后端代码提供了思路:我们可以为项目的增删改查业务编写一套规范的代码,以此编写代码模板,后续通过代码生成器,通过数据库的一张表可快速生成前后端代码,提高项目组的开发效率。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值