spring-boot-mybatis-plus-layui 自定义代码生成完整多对一
1.代码生成器:自定义包名、自定义类名、自定义生成哪些包、自定义mapper.xml生成位置;
2.逻辑删除;
3.多对一:多表+分页+动态条件;
4.较完善的注释。
代码在码云上:https://gitee.com/xfyuao/surprise.git
工具、技术版本:jdk 8.18、eclipse 2019-6、maven 3.3.9、spring boot 2.3.0、mybatis plus 3.3.1、lombok 1.18.12、mysql 5.5.61、layui 2.5.4
如果你的项目中使用了layui的tree组件,请把layui升级到最新版(2.5.6),2.5.4树组件有bug。时间:2020.5.30
生成器代码如下:
1 package com.xfyuao.util; 2 3 import java.util.ArrayList; 4 import java.util.List; 5 6 import com.baomidou.mybatisplus.annotation.DbType; 7 import com.baomidou.mybatisplus.core.toolkit.StringPool; 8 import com.baomidou.mybatisplus.generator.AutoGenerator; 9 import com.baomidou.mybatisplus.generator.InjectionConfig; 10 import com.baomidou.mybatisplus.generator.config.DataSourceConfig; 11 import com.baomidou.mybatisplus.generator.config.FileOutConfig; 12 import com.baomidou.mybatisplus.generator.config.GlobalConfig; 13 import com.baomidou.mybatisplus.generator.config.PackageConfig; 14 import com.baomidou.mybatisplus.generator.config.StrategyConfig; 15 import com.baomidou.mybatisplus.generator.config.TemplateConfig; 16 import com.baomidou.mybatisplus.generator.config.converts.MySqlTypeConvert; 17 import com.baomidou.mybatisplus.generator.config.po.TableInfo; 18 import com.baomidou.mybatisplus.generator.config.rules.DbColumnType; 19 import com.baomidou.mybatisplus.generator.config.rules.NamingStrategy; 20 import com.baomidou.mybatisplus.generator.engine.FreemarkerTemplateEngine; 21 22 // mybatis plus 根据表生成entity、mapper、mapper.xml、service、service.impl、controller 23 public class CodeGenerator { 24 25 private static String url = "jdbc:mysql://localhost:3306/mp?serverTimezone=GMT%2B8"; 26 private static String username = "root"; 27 private static String password = "admin"; 28 private static String dirverName = "com.mysql.jdbc.Driver"; 29 private static String author = "xfyuao";// 作者 30 private static String parent = "com.xfyuao";// 包前缀 31 private static String[] tableArray = { "stu" };// 需要生成代码的表 32 // 需要生成的包的名字,不需要生成以空字符或null代替 33 private static String entity = "templates/entity.java"; 34 private static String mapper = "templates/mapper.java"; 35 private static String service = "templates/service.java"; 36 private static String serviceImpl = "templates/serviceImpl.java"; 37 //controller层包名已经在90行修改为web,但模板不变 38 private static String controller = "templates/controller.java"; 39 40 public static void main(String[] args) { 41 42 AutoGenerator mpg = new AutoGenerator(); 43 // 选择 freemarker 引擎,默认 Velocity 44 mpg.setTemplateEngine(new FreemarkerTemplateEngine()); 45 46 // 全局配置 47 GlobalConfig gc = new GlobalConfig(); 48 gc.setAuthor(author); 49 gc.setFileOverride(true);// 覆盖同名文件 50 gc.setOpen(false);// 不要打开生成后的目录 51 String projectPath = System.getProperty("user.dir");// 获取项目根目录 52 gc.setOutputDir(projectPath + "/src/main/java");// 设置代码生成的目录 53 gc.setBaseResultMap(true);// mapper.xml中生成resultMap,默认false 54 /* 自定义文件命名,注意 %s 会自动填充表实体属性! */ 55 gc.setServiceName("%sService");// 默认生成的service接口会以I开头 56 // gc.setActiveRecord(false);//ActiveRecord模式,默认false,实体类会继承Model<T>,可以使用实体类crud 57 // gc.setSwagger2(true);//开启 swagger2 模式 默认false 58 // gc.setIdType(IdType.AUTO);//主键生成策略 默认自动 59 // gc.setEnableCache(false);// mapper.xml 二级缓存,默认false 60 mpg.setGlobalConfig(gc); 61 62 // 数据源配置 63 DataSourceConfig dsc = new DataSourceConfig(); 64 dsc.setDbType(DbType.MYSQL);//设置数据库类型 65 /*dsc.setTypeConvert(new MySqlTypeConvert() { 66 @Override 67 public DbColumnType processTypeConvert(GlobalConfig globalConfig, String fieldType) { 68 System.out.println("转换类型:" + fieldType); 69 //tinyint转换成Boolean 70 if (fieldType.toLowerCase().contains("tinyint")) { 71 return DbColumnType.BOOLEAN; 72 } 73 //将数据库中datetime转换成date 74 if (fieldType.toLowerCase().contains("datetime")) { 75 return DbColumnType.DATE; 76 } 77 return (DbColumnType) super.processTypeConvert(globalConfig, fieldType); 78 } 79 80 });*/ 81 dsc.setUrl(url); 82 dsc.setUsername(username); 83 dsc.setPassword(password); 84 dsc.setDriverName(dirverName); 85 86 mpg.setDataSource(dsc); 87 88 // 策略配置 89 StrategyConfig strategy = new StrategyConfig(); 90 // strategy.setCapitalMode(true);// 全局大写命名 ORACLE 注意 91 // strategy.setTablePrefix(new String[]{""});// 表前缀 92 strategy.setNaming(NamingStrategy.underline_to_camel);// 表名生成策略,下划线转驼峰 93 strategy.setColumnNaming(NamingStrategy.underline_to_camel);// 列名下划线转驼峰 94 strategy.setInclude(tableArray); // 需要生成的表 95 // strategy.setExclude(new String[]{"test"}); // 排除生成的表 96 strategy.setEntityLombokModel(true);// 实体类使用lombok 97 strategy.setRestControllerStyle(true); // 生成 @RestController 控制器 98 strategy.setLogicDeleteFieldName("is_delete"); // 逻辑删除属性名称 99 100 // strategy.setSuperEntityClass("com.baomidou.ant.common.BaseEntity");// 自定义实体父类 101 // strategy.setSuperEntityColumns(new String[] { "test_id", "age"});//自定义实体,公共字段 102 // strategy.setSuperMapperClass("com.baomidou.mybatisplus.core.mapper.BaseMapper");//自定义mapper父类 103 // strategy.setSuperServiceClass("com.baomidou.mybatisplus.extension.service.IService");//自定义service父类 104 // strategy.setSuperServiceImplClass("com.baomidou.mybatisplus.extension.service.impl.ServiceImpl");//自定义service实现类父类 105 // strategy.setSuperControllerClass("com.baomidou.ant.common.BaseController");//自定义Controller父类 106 // 【实体】是否生成字段常量(默认 false) 107 // public static final String ID = "test_id"; 108 // strategy.setEntityColumnConstant(true); 109 // 【实体】是否为构建者模型(默认 false) 110 // public User setName(String name) {this.name = name; return this;} 111 // strategy.setEntityBuilderModel(true); 112 mpg.setStrategy(strategy); 113 114 // 包配置 115 PackageConfig pc = new PackageConfig(); 116 pc.setParent(parent); 117 pc.setController("web");// controller改成web 118 mpg.setPackageInfo(pc); 119 120 // 注入自定义配置,可以在 VM 中使用 cfg.abc 【可无】 121 InjectionConfig cfg = new InjectionConfig() { 122 @Override 123 public void initMap() { 124 } 125 }; 126 // 如果模板引擎是 freemarker 127 String templatePath = "/templates/mapper.xml.ftl"; 128 List<FileOutConfig> focList = new ArrayList<>(); 129 // 调整 xml 生成目录,默认在mapper.xml包下 130 focList.add(new FileOutConfig(templatePath) { 131 @Override 132 public String outputFile(TableInfo tableInfo) { 133 // 自定义输出文件名 , 如果你 Entity 设置了前后缀、此处注意 xml 的名称会跟着发生变化!! 134 return projectPath + "/src/main/resources/mapper/" + tableInfo.getEntityName() + "Mapper" 135 + StringPool.DOT_XML; 136 } 137 }); 138 cfg.setFileOutConfigList(focList); 139 mpg.setCfg(cfg); 140 TemplateConfig tc = new TemplateConfig(); 141 // 关闭默认 xml 生成,已经在src/main/resources/mapper下生成 142 tc.setXml(null); 143 tc.setEntity(entity); 144 tc.setMapper(mapper); 145 tc.setService(service); 146 tc.setServiceImpl(serviceImpl); 147 tc.setController(controller); 148 mpg.setTemplate(tc); 149 150 // 执行生成 151 mpg.execute(); 152 153 } 154 }