從零搭建自己的SpringBoot後臺框架(九)

Mr_初晨發表於2018-04-25
Hello大家好,本章我們整合generator自動生成model,xml,dao功能 。有問題可以聯絡我mr_beany@163.com。另求各路大神指點,感謝

ps:最近這幾天在忙著搬家,更新的速度和回訊息的速度可能不會特別及時,見諒

一:新增所需依賴

由於我們上篇文章講過使用通用mapper,所以這裡我們除了需要新增mybatis-generator之外還需要新增通用mapper提供的generator依賴,其次我們還需要引入兩個常用jar包

<!--程式碼生成器-->
<dependency>
   <groupId>org.mybatis.generator</groupId>
   <artifactId>mybatis-generator-core</artifactId>
   <version>1.3.5</version>
   <scope>test</scope>
</dependency>

<dependency>
   <groupId>tk.mybatis</groupId>
   <artifactId>mapper-generator</artifactId>
   <version>1.0.0</version>
</dependency>

<!--常用庫依賴 -->
<dependency>
   <groupId>org.apache.commons</groupId>
   <artifactId>commons-lang3</artifactId>
   <version>3.5</version>
</dependency>
<dependency>
   <groupId>com.google.guava</groupId>
   <artifactId>guava</artifactId>
   <version>22.0</version>
</dependency>複製程式碼

二:建立系統日誌表

CREATE TABLE `system_log` (
  `id` varchar(32) NOT NULL,
  `description` varchar(50) DEFAULT NULL COMMENT '日誌資訊描述',
  `method` varchar(20) DEFAULT NULL COMMENT '方法名稱',
  `log_type` varchar(10) DEFAULT NULL COMMENT '日誌型別 0是正常,1是異常',
  `request_ip` varchar(30) DEFAULT NULL COMMENT '請求的ip',
  `exception_code` varchar(50) DEFAULT NULL COMMENT '異常錯誤碼',
  `exception_detail` varchar(255) DEFAULT NULL COMMENT '異常詳情',
  `params` varchar(1000) DEFAULT NULL COMMENT '請求引數',
  `user_id` varchar(32) DEFAULT NULL COMMENT '請求的使用者id',
  `create_time` datetime DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='系統日誌表';複製程式碼

三:建立系統常用變數資料夾

建立core→constant→ProjectConstant

package com.example.demo.core.constant;

public class ProjectConstant {

   // 專案基礎包名稱
   public static final String BASE_PACKAGE = "com.example.demo";

   // Model所在包
   public static final String MODEL_PACKAGE = BASE_PACKAGE + ".model";

   // Mapper所在包
   public static final String MAPPER_PACKAGE = BASE_PACKAGE + ".dao";

   // Service所在包
   public static final String SERVICE_PACKAGE = BASE_PACKAGE + ".service";

   // ServiceImpl所在包
   public static final String SERVICE_IMPL_PACKAGE = SERVICE_PACKAGE + ".impl";

   // Controller所在包
   public static final String CONTROLLER_PACKAGE = BASE_PACKAGE + ".controller";

   // Mapper外掛基礎介面的完全限定名
   public static final String MAPPER_INTERFACE_REFERENCE = BASE_PACKAGE + ".core.universal.Mapper";

}複製程式碼

四:建立src\test\java\com\example\demo\CodeGenerator.java

package com.example.demo;

import com.example.demo.core.constant.ProjectConstant;
import com.google.common.base.CaseFormat;
import org.apache.commons.lang3.StringUtils;
import org.mybatis.generator.api.MyBatisGenerator;
import org.mybatis.generator.config.*;
import org.mybatis.generator.internal.DefaultShellCallback;

import java.util.ArrayList;
import java.util.List;

/**
 * @Description: 程式碼生成器,根據資料表名稱生成對應的Model、Mapper簡化開發。
 * @author 張瑤
 * @date 2018/4/23 20:28
 */
public class CodeGenerator {

   // JDBC配置,請修改為你專案的實際配置
   private static final String JDBC_URL = "jdbc:mysql://localhost:3333/demo";
   private static final String JDBC_USERNAME = "root";
   private static final String JDBC_PASSWORD = "123456";
   private static final String JDBC_DIVER_CLASS_NAME = "com.mysql.jdbc.Driver";
   private static final String JAVA_PATH = "src/main/java"; // java檔案路徑
   private static final String RESOURCES_PATH = "src/main/resources";// 資原始檔路徑

   /**
    * genCode("輸入表名","輸入自定義Model名稱");
    * 如果想建立所有表,請輸入"%"
    * @param args
    */
   public static void main(String[] args) {
      genCode("system_log");
   }

   /**
    * 通過資料表名稱生成程式碼,Model 名稱通過解析資料表名稱獲得,下劃線轉大駝峰的形式。 如輸入表名稱 "t_user_detail" 將生成
    * TUserDetail、TUserDetailMapper、TUserDetailService ...
    * 
    * @param tableNames
    *            資料表名稱...
    */
   public static void genCode(String... tableNames) {
      for (String tableName : tableNames) {
         genCode(tableName, null);
      }
   }

   /**
    * 通過資料表名稱,和自定義的 Model 名稱生成程式碼 如輸入表名稱 "t_user_detail" 和自定義的 Model 名稱 "User"
    * 將生成 User、UserMapper、UserService ...
    * 
    * @param tableName
    *            資料表名稱
    * @param modelName
    *            自定義的 Model 名稱
    */
   public static void genCode(String tableName, String modelName) {
      genModelAndMapper(tableName, modelName);
   }

   public static void genModelAndMapper(String tableName, String modelName) {
      Context context = getContext();

      JDBCConnectionConfiguration jdbcConnectionConfiguration = getJDBCConnectionConfiguration();
      context.setJdbcConnectionConfiguration(jdbcConnectionConfiguration);

      PluginConfiguration pluginConfiguration = getPluginConfiguration();
      context.addPluginConfiguration(pluginConfiguration);

      JavaModelGeneratorConfiguration javaModelGeneratorConfiguration = getJavaModelGeneratorConfiguration();
      context.setJavaModelGeneratorConfiguration(javaModelGeneratorConfiguration);

      SqlMapGeneratorConfiguration sqlMapGeneratorConfiguration = getSqlMapGeneratorConfiguration();
      context.setSqlMapGeneratorConfiguration(sqlMapGeneratorConfiguration);

      JavaClientGeneratorConfiguration javaClientGeneratorConfiguration =getJavaClientGeneratorConfiguration();
      context.setJavaClientGeneratorConfiguration(javaClientGeneratorConfiguration);

      TableConfiguration tableConfiguration = new TableConfiguration(context);
      tableConfiguration.setTableName(tableName);
      tableConfiguration.setDomainObjectName(modelName);
      context.addTableConfiguration(tableConfiguration);

      List<String> warnings;
      MyBatisGenerator generator;
      try {
         Configuration config = new Configuration();
         config.addContext(context);
         config.validate();
         boolean overwrite = true;
         DefaultShellCallback callback = new DefaultShellCallback(overwrite);
         warnings = new ArrayList<>();
         generator = new MyBatisGenerator(config, callback, warnings);
         generator.generate(null);
      } catch (Exception e) {
         throw new RuntimeException("生成Model和Mapper失敗", e);
      }

      if (generator.getGeneratedJavaFiles().isEmpty() || generator.getGeneratedXmlFiles().isEmpty()) {
         throw new RuntimeException("生成Model和Mapper失敗:" + warnings);
      }
      if (StringUtils.isEmpty(modelName)){
         modelName = tableNameConvertUpperCamel(tableName);
      }
      System.out.println(modelName + ".java 生成成功");
      System.out.println(modelName + "Mapper.java 生成成功");
      System.out.println(modelName + "Mapper.xml 生成成功");
   }

   private static Context getContext(){
      Context context = new Context(ModelType.FLAT);
      context.setId("Potato");
      context.setTargetRuntime("MyBatis3Simple");
      context.addProperty(PropertyRegistry.CONTEXT_BEGINNING_DELIMITER, "`");
      context.addProperty(PropertyRegistry.CONTEXT_ENDING_DELIMITER, "`");
      return context;
   }

   private static JDBCConnectionConfiguration getJDBCConnectionConfiguration(){
      JDBCConnectionConfiguration jdbcConnectionConfiguration = new JDBCConnectionConfiguration();
      jdbcConnectionConfiguration.setConnectionURL(JDBC_URL);
      jdbcConnectionConfiguration.setUserId(JDBC_USERNAME);
      jdbcConnectionConfiguration.setPassword(JDBC_PASSWORD);
      jdbcConnectionConfiguration.setDriverClass(JDBC_DIVER_CLASS_NAME);
      return jdbcConnectionConfiguration;
   }

   private static PluginConfiguration getPluginConfiguration(){
      PluginConfiguration pluginConfiguration = new PluginConfiguration();
      pluginConfiguration.setConfigurationType("tk.mybatis.mapper.generator.MapperPlugin");
      pluginConfiguration.addProperty("mappers", ProjectConstant.MAPPER_INTERFACE_REFERENCE);
      return pluginConfiguration;
   }

   private static JavaModelGeneratorConfiguration getJavaModelGeneratorConfiguration(){
      JavaModelGeneratorConfiguration javaModelGeneratorConfiguration = new JavaModelGeneratorConfiguration();
      javaModelGeneratorConfiguration.setTargetProject(JAVA_PATH);
      javaModelGeneratorConfiguration.setTargetPackage(ProjectConstant.MODEL_PACKAGE);
      javaModelGeneratorConfiguration.addProperty("enableSubPackages","true");
      javaModelGeneratorConfiguration.addProperty("trimStrings","true");
      return javaModelGeneratorConfiguration;
   }

   private static SqlMapGeneratorConfiguration getSqlMapGeneratorConfiguration(){
      SqlMapGeneratorConfiguration sqlMapGeneratorConfiguration = new SqlMapGeneratorConfiguration();
      sqlMapGeneratorConfiguration.setTargetProject(RESOURCES_PATH);
      sqlMapGeneratorConfiguration.setTargetPackage("mapper");
      return sqlMapGeneratorConfiguration;
   }

   private static JavaClientGeneratorConfiguration getJavaClientGeneratorConfiguration(){
      JavaClientGeneratorConfiguration javaClientGeneratorConfiguration = new JavaClientGeneratorConfiguration();
      javaClientGeneratorConfiguration.setTargetProject(JAVA_PATH);
      javaClientGeneratorConfiguration.setTargetPackage(ProjectConstant.MAPPER_PACKAGE);
      javaClientGeneratorConfiguration.setConfigurationType("XMLMAPPER");
      return javaClientGeneratorConfiguration;
   }

   private static String tableNameConvertUpperCamel(String tableName) {
      return CaseFormat.LOWER_UNDERSCORE.to(CaseFormat.UPPER_CAMEL, tableName.toLowerCase());
   }
}複製程式碼

五:功能測試

CodeGenerator中右鍵run

從零搭建自己的SpringBoot後臺框架(九)

從零搭建自己的SpringBoot後臺框架(九)

ok,建立成功

專案地址

碼雲地址: gitee.com/beany/mySpr…

GitHub地址: github.com/MyBeany/myS…

寫文章不易,如對您有幫助,請幫忙點下star從零搭建自己的SpringBoot後臺框架(九)

結尾

整合generator自動生成model,xml,dao功能已完成,後續功能接下來陸續更新,有問題可以聯絡我mr_beany@163.com。另求各路大神指點,感謝大家。



相關文章