
1. 前言
對于寫Crud的老司機來說時間非常寶貴,一些樣板代碼寫不但費時費力,而且枯燥無味。經常有小伙伴問我,胖哥你怎么天天那么有時間去搞新東西,透露一下秘訣唄。

好吧,今天就把Mybatis-plus的代碼生成器分享出來,讓你也成為一個優秀的時間管理大師。
2. 基本依賴
以Spring Boot和MySQL為例,你需要下面這些依賴:
? ?org.projectlombok ? ?lombok ? ?compile ? ?com.zaxxer ? ?HikariCP ? ?mysql ? ?mysql-connector-java ? ?com.baomidou ? ?mybatis-plus-boot-starter ? ?com.baomidou ? ?mybatis-plus-generator ? ?compile ? ?true ? ?org.springframework.boot ? ?spring-boot-starter-freemarker ? ?compile ? ?true
然后配置好你的數據庫,確保數據庫連接通訊暢通。
3. 定制代碼生成器
這里我期望生成的目錄結構是這樣的:

于是我花了點時間定制了一些生成器的配置,代碼如下,就是這么硬核!
package cn.felord.mybatis.util;?import com.baomidou.mybatisplus.annotation.DbType;import com.baomidou.mybatisplus.annotation.IdType;import com.baomidou.mybatisplus.core.toolkit.StringPool;import com.baomidou.mybatisplus.generator.AutoGenerator;import com.baomidou.mybatisplus.generator.InjectionConfig;import com.baomidou.mybatisplus.generator.config.*;import com.baomidou.mybatisplus.generator.config.po.TableInfo;import com.baomidou.mybatisplus.generator.config.rules.NamingStrategy;import com.baomidou.mybatisplus.generator.engine.FreemarkerTemplateEngine;?import java.util.ArrayList;import java.util.List;import java.util.Optional;??/** * 代碼生成器配置 * * @author felord * @since 10 :39 2018/9/9 */public class CodeGenerator { ? ?private String dbUrl; ? ?private String userName; ? ?private String password; ? ?private String dir; ? ?private String xmlDir; ? ?private String packageName;? ? ?private CodeGenerator() { ? }? ? ?/** ? ? * The type Config builder. ? ? */ ? ?public static class ConfigBuilder {? ? ? ? ?private String dbUrl; ? ? ? ?private String userName; ? ? ? ?private String password; ? ? ? ?private String dir; ? ? ? ?private String xmlDir; ? ? ? ?private String packageName;?? ? ? ? ?/** ? ? ? ? * Db url config builder. ? ? ? ? * ? ? ? ? * @param dbUrl the db url ? ? ? ? * @return the config builder ? ? ? ? */ ? ? ? ?public ConfigBuilder dbUrl(final String dbUrl) { ? ? ? ? ? ?this.dbUrl = dbUrl; ? ? ? ? ? ?return this; ? ? ? }? ? ? ? ?/** ? ? ? ? * User name config builder. ? ? ? ? * ? ? ? ? * @param userName the user name ? ? ? ? * @return the config builder ? ? ? ? */ ? ? ? ?public ConfigBuilder userName(final String userName) { ? ? ? ? ? ?this.userName = userName; ? ? ? ? ? ?return this; ? ? ? }? ? ? ? ?/** ? ? ? ? * Password config builder. ? ? ? ? * ? ? ? ? * @param password the password ? ? ? ? * @return the config builder ? ? ? ? */ ? ? ? ?public ConfigBuilder password(final String password) { ? ? ? ? ? ?this.password = password; ? ? ? ? ? ?return this; ? ? ? }? ? ? ? ?/** ? ? ? ? * Dir config builder. ? ? ? ? * ? ? ? ? * @param dir the dir ? ? ? ? * @return the config builder ? ? ? ? */ ? ? ? ?public ConfigBuilder dir(final String dir) { ? ? ? ? ? ?this.dir = dir; ? ? ? ? ? ?return this; ? ? ? }? ? ? ? ?/** ? ? ? ? * Dir config builder. ? ? ? ? * ? ? ? ? * @param xmlDir the dir ? ? ? ? * @return the config builder ? ? ? ? */ ? ? ? ?public ConfigBuilder xmlDir(final String xmlDir) { ? ? ? ? ? ?this.xmlDir = xmlDir; ? ? ? ? ? ?return this; ? ? ? }? ? ? ? ?/** ? ? ? ? * Package name config builder. ? ? ? ? * ? ? ? ? * @param packageName the package name ? ? ? ? * @return the config builder ? ? ? ? */ ? ? ? ?public ConfigBuilder packageName(final String packageName) { ? ? ? ? ? ?this.packageName = packageName; ? ? ? ? ? ?return this; ? ? ? }? ? ? ? ?/** ? ? ? ? * Build code generator. ? ? ? ? * ? ? ? ? * @return the code generator ? ? ? ? */ ? ? ? ?public CodeGenerator build() { ? ? ? ? ? ?CodeGenerator generator = new CodeGenerator();? ? ? ? ? ? ?generator.dbUrl = Optional.of(this.dbUrl).get(); ? ? ? ? ? ?generator.userName = Optional.of(this.userName).get(); ? ? ? ? ? ?generator.password = Optional.of(this.password).get(); ? ? ? ? ? ?generator.dir = Optional.of(this.dir).get(); ? ? ? ? ? ?generator.xmlDir = Optional.of(this.xmlDir).get(); ? ? ? ? ? ?generator.packageName = Optional.of(this.packageName).get(); ? ? ? ? ? ?return generator; ? ? ? } ? }?? ? ?/** ? ? * Code. ? ? * ? ? * @param tableNames the table names ? ? */ ? ?public void code(String... tableNames) { ? ? ? ?codingMysql(true, false, true, this.dbUrl, this.userName, this.password, this.dir, this.xmlDir, this.packageName, tableNames); ? }? ? ?/** ? ? * ? ? * 生成器核心部分 ? ? * ? ? * @param serviceNameStartWithI 是否前綴I ? ? * @param createController ? ? 是否生成controller ? ? * @param useLombok ? ? ? ? ? ? 是否使用 lombok ? ? * @param dbUrl ? ? ? ? ? ? ? ? 數據庫連接 ? ? * @param username ? ? ? ? ? ? 用戶名稱 ? ? * @param password ? ? ? ? ? ? 密碼 ? ? * @param outDir ? ? ? ? ? ? ? 輸出目錄 ? ? * @param xmlDir ? ? ? ? ? ? ? xml 文件目錄 ? ? * @param packageName ? ? ? ? ? 包路徑 ? ? * @param tableNames ? ? ? ? ? 表名稱 ? ? */ ? ?private static void codingMysql(boolean serviceNameStartWithI, ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?boolean createController, ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?boolean useLombok, ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?String dbUrl, ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?String username, ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?String password, ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?String outDir, ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?String xmlDir, ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?String packageName, ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?String... tableNames) { ? ? ? ?GlobalConfig config = new GlobalConfig(); ? ? ? ?DataSourceConfig dataSourceConfig = new DataSourceConfig();// ? ? ? 數據庫類型 這里使用 mysql ? ? ? ?dataSourceConfig.setDbType(DbType.MYSQL) ? ? ? ? ? ? ? .setUrl(dbUrl) ? ? ? ? ? ? ? .setUsername(username) ? ? ? ? ? ? ? .setPassword(password)// ? ? ? ? ? ? ? 驅動名稱 這里使用mysql ? ? ? ? ? ? ? .setDriverName("com.mysql.jdbc.Driver");? ? ? ? ?// 自定義xml輸出路徑 ? ? ? ?InjectionConfig cfg = new InjectionConfig() { ? ? ? ? ? ?@Override ? ? ? ? ? ?public void initMap() { ? ? ? ? ? ? ? ?// to do nothing ? ? ? ? ? } ? ? ? }; ? ? ? ?List focList = new ArrayList<>();// ? ? ? 你也可以定制 xml 的模板 ? ? ? ?focList.add(new FileOutConfig("/templates/mapper.xml.ftl") { ? ? ? ? ? ?@Override ? ? ? ? ? ?public String outputFile(TableInfo tableInfo) { ? ? ? ? ? ? ? ?// 自定義xml文件的路徑 ? ? ? ? ? ? ? ?return xmlDir + "/mapper/" + tableInfo.getMapperName() + StringPool.DOT_XML; ? ? ? ? ? } ? ? ? }); ? ? ? ?cfg.setFileOutConfigList(focList);??// ? ? ? 策略配置項 ? ? ? ?StrategyConfig strategyConfig = new StrategyConfig(); ? ? ? ?strategyConfig ? ? ? ? ? ? ? .setCapitalMode(false)// ? ? ? ? ? ? ? 是否使用 lombok ? ? ? ? ? ? ? .setEntityLombokModel(useLombok)// ? ? ? ? ? ? ? 下劃線轉駝峰 ? ? ? ? ? ? ? .setNaming(NamingStrategy.underline_to_camel) ? ? ? ? ? ? ? ?//修改替換成你需要的表名,多個表名傳數組 ? ? ? ? ? ? ? .setInclude(tableNames);// ? ? ? 使用 AR 模式 ? ? ? ?config.setActiveRecord(true)// ? ? ? ? ? ? ? 設置頭注釋的 author ? ? ? ? ? ? ? .setAuthor("system")// ? ? ? ? ? ? ? 項目輸出路徑 ? ? ? ? ? ? ? .setOutputDir(outDir)// ? ? ? ? ? ? ? 是否覆蓋已經生成的同名文件 ? ? ? ? ? ? ? .setFileOverride(true)// ? ? ? ? ? ? ? 雪花算法生成id ? ? ? ? ? ? ? .setIdType(IdType.ASSIGN_ID)// ? ? ? ? ? ? ? 是否使用緩存 ? ? ? ? ? ? ? .setEnableCache(false)// ? ? ? ? ? ? ? 是否生成 xml 中的 基礎 resultMap ? ? ? ? ? ? ? .setBaseResultMap(true); ? ? ? ?if (!serviceNameStartWithI) {// ? ? ? ? ? Service 層的 通用格式后綴 ? ? ? ? ? ?config.setServiceName("%sService"); ? ? ? }// ? ? ? ? ? ? 實體類包名 ? ? ? ?PackageConfig packageConfig = new PackageConfig().setParent(packageName).setEntity("entity"); ? ? ? ?TemplateConfig templateConfig = new TemplateConfig().setXml(null);// ? ? ? 這里選擇不生成 controller 實際上 生成的大多不符合我們需要 到服務層就行了 ? ? ? ?if (!createController) { ? ? ? ? ? ?templateConfig.setController(null); ? ? ? }// ? ? ? 整合起來運行 ? ? ? ?new AutoGenerator() ? ? ? ? ? ? ? .setGlobalConfig(config) ? ? ? ? ? ? ? .setTemplateEngine(new FreemarkerTemplateEngine()) ? ? ? ? ? ? ? .setDataSource(dataSourceConfig) ? ? ? ? ? ? ? .setStrategy(strategyConfig) ? ? ? ? ? ? ? .setPackageInfo(packageConfig) ? ? ? ? ? ? ? .setCfg(cfg) ? ? ? ? ? ? ? .setTemplate(templateConfig) ? ? ? ? ? ? ? .execute(); ? }?}?
如果我生成的目錄結構能夠滿足你的需要,那就巧了,直接拿去用;如果不滿足需要,你可以按照注釋的說明進行微調。18年搞的用了好幾年,沒出過什么亂子。
4. 代碼生成器的使用
使用起來非常簡單,確保數據庫能夠使用JDBC連接成功,寫個main方法,配置一下,跑起來就是了:
/** * @author felord.cn * @since 11:34 **/public class AutoCoding { ? ?public static void main(String[] args) {?// ? ? ? ? maven 工程 main 包的全路徑 ? ? ? ?final String mainDir = "C:IdeaProjectsbc-recylingsrcmain";? ? ? ? ?CodeGenerator.ConfigBuilder builder = new CodeGenerator.ConfigBuilder();? ? ? ? ?CodeGenerator codeGenerator = builder// ? ? ? ? ? ? ? 數據庫連接 ? ? ? ? ? ? ? .dbUrl("jdbc:mysql://localhost:3306/test")// ? ? ? ? ? ? ? 賬戶 ? ? ? ? ? ? ? .userName("root")// ? ? ? ? ? ? ? 密碼 ? ? ? ? ? ? ? .password("123456") ? ? ? ? ? ? ? ?// 生成類位置 ? ? ? ? ? ? ? .dir(mainDir + "java") ? ? ? ? ? ? ? ?// 生成xml 位置 ? ? ? ? ? ? ? .xmlDir(mainDir + "resources") ? ? ? ? ? ? ? ?// 包引用路徑 ? ? ? ? ? ? ? .packageName("cn.felord.mybatis") ? ? ? ? ? ? ? .build();? ? ? ? ?//根據表生成后臺代碼 ? ? ? ?codeGenerator.code("user_info");?? ? }}
然后代碼就生成了,是不是非常的好用?恭喜你獲得了 時間管理大師 榮譽稱號。
切記不要炫耀,否則需求加倍。
5. 總結
雖然好用,但是建議新手不要使用,多手寫一下代碼。另外復雜的SQL還是建議自己寫,多鍛煉寫SQL的能力。如果你在使用中有什么問題,可以私信我進行溝通。如果你有更加好用的可以通過留言分享給廣大條友。