package com.zheng.common.util; import org.apache.commons.lang.ObjectUtils; import org.apache.velocity.VelocityContext; import org.mybatis.generator.api.MyBatisGenerator; import org.mybatis.generator.config.Configuration; import org.mybatis.generator.config.xml.ConfigurationParser; import org.mybatis.generator.internal.DefaultShellCallback; import java.io.File; import java.text.SimpleDateFormat; import java.util.*; import static com.zheng.common.util.StringUtil.lineToHump; /** * 代码生成类 * Created by ZhangShuzheng on 2017/1/10. */ public class MybatisGeneratorUtil { // generatorConfig模板路径 private static String generatorConfig_vm = "/template/generatorConfig.vm"; // Service模板路径 private static String service_vm = "/template/Service.vm"; // ServiceMock模板路径 private static String serviceMock_vm = "/template/ServiceMock.vm"; // ServiceImpl模板路径 private static String serviceImpl_vm = "/template/ServiceImpl.vm"; /** * 根据模板生成generatorConfig.xml文件 * @param jdbc_driver 驱动路径 * @param jdbc_url 链接 * @param jdbc_username 帐号 * @param jdbc_password 密码 * @param module 项目模块 * @param database 数据库 * @param table_prefix 表前缀 * @param package_name 包名 */ public static void generator( String jdbc_driver, String jdbc_url, String jdbc_username, String jdbc_password, String module, String database, String table_prefix, String package_name, Map<String, String> last_insert_id_tables) throws Exception{ generatorConfig_vm = MybatisGeneratorUtil.class.getResource(generatorConfig_vm).getPath().replaceFirst("/", ""); service_vm = MybatisGeneratorUtil.class.getResource(service_vm).getPath().replaceFirst("/", ""); serviceMock_vm = MybatisGeneratorUtil.class.getResource(serviceMock_vm).getPath().replaceFirst("/", ""); serviceImpl_vm = MybatisGeneratorUtil.class.getResource(serviceImpl_vm).getPath().replaceFirst("/", ""); String targetProject = module + "/" + module + "-dao"; String module_path = module + "/" + module + "-dao/src/main/resources/generatorConfig.xml"; String sql = "SELECT table_name FROM INFORMATION_SCHEMA.TABLES WHERE table_schema = '" + database + "' AND table_name LIKE '" + table_prefix + "_%';"; System.out.println("========== 开始生成generatorConfig.xml文件 =========="); List<Map<String, Object>> tables = new ArrayList<>(); try { VelocityContext context = new VelocityContext(); Map<String, Object> table; // 查询定制前缀项目的所有表 JdbcUtil jdbcUtil = new JdbcUtil(jdbc_driver, jdbc_url, jdbc_username, AESUtil.AESDecode(jdbc_password)); List<Map> result = jdbcUtil.selectByParams(sql, null); for (Map map : result) { System.out.println(map.get("TABLE_NAME")); table = new HashMap<>(); table.put("table_name", map.get("TABLE_NAME")); table.put("model_name", lineToHump(ObjectUtils.toString(map.get("TABLE_NAME")))); tables.add(table); } jdbcUtil.release(); String targetProject_sqlMap = module + "/" + module + "-rpc-service"; context.put("tables", tables); context.put("generator_javaModelGenerator_targetPackage", package_name + ".dao.model"); context.put("generator_sqlMapGenerator_targetPackage", package_name + ".dao.mapper"); context.put("generator_javaClientGenerator_targetPackage", package_name + ".dao.mapper"); context.put("targetProject", targetProject); context.put("targetProject_sqlMap", targetProject_sqlMap); context.put("generator_jdbc_password", AESUtil.AESDecode(jdbc_password)); context.put("last_insert_id_tables", last_insert_id_tables); VelocityUtil.generate(generatorConfig_vm, module_path, context); // 删除旧代码 deleteDir(new File(targetProject + "/src/main/java/" + package_name.replaceAll("\\.", "/") + "/dao/model")); deleteDir(new File(targetProject + "/src/main/java/" + package_name.replaceAll("\\.", "/") + "/dao/mapper")); deleteDir(new File(targetProject_sqlMap + "/src/main/java/" + package_name.replaceAll("\\.", "/") + "/dao/mapper")); } catch (Exception e) { e.printStackTrace(); } System.out.println("========== 结束生成generatorConfig.xml文件 =========="); System.out.println("========== 开始运行MybatisGenerator =========="); List<String> warnings = new ArrayList<>(); File configFile = new File(module_path); ConfigurationParser cp = new ConfigurationParser(warnings); Configuration config = cp.parseConfiguration(configFile); DefaultShellCallback callback = new DefaultShellCallback(true); MyBatisGenerator myBatisGenerator = new MyBatisGenerator(config, callback, warnings); myBatisGenerator.generate(null); for (String warning : warnings) { System.out.println(warning); } System.out.println("========== 结束运行MybatisGenerator =========="); System.out.println("========== 开始生成Service =========="); String ctime = new SimpleDateFormat("yyyy/M/d").format(new Date()); String servicePath = module + "/" + module + "-rpc-api" + "/src/main/java/" + package_name.replaceAll("\\.", "/") + "/rpc/api"; String serviceImplPath = module + "/" + module + "-rpc-service" + "/src/main/java/" + package_name.replaceAll("\\.", "/") + "/rpc/service/impl"; for (int i = 0; i < tables.size(); i++) { String model = StringUtil.lineToHump(ObjectUtils.toString(tables.get(i).get("table_name"))); String service = servicePath + "/" + model + "Service.java"; String serviceMock = servicePath + "/" + model + "ServiceMock.java"; String serviceImpl = serviceImplPath + "/" + model + "ServiceImpl.java"; // 生成service File serviceFile = new File(service); if (!serviceFile.exists()) { VelocityContext context = new VelocityContext(); context.put("package_name", package_name); context.put("model", model); context.put("ctime", ctime); VelocityUtil.generate(service_vm, service, context); System.out.println(service); } // 生成serviceMock File serviceMockFile = new File(serviceMock); if (!serviceMockFile.exists()) { VelocityContext context = new VelocityContext(); context.put("package_name", package_name); context.put("model", model); context.put("ctime", ctime); VelocityUtil.generate(serviceMock_vm, serviceMock, context); System.out.println(serviceMock); } // 生成serviceImpl File serviceImplFile = new File(serviceImpl); if (!serviceImplFile.exists()) { VelocityContext context = new VelocityContext(); context.put("package_name", package_name); context.put("model", model); context.put("mapper", StringUtil.toLowerCaseFirstOne(model)); context.put("ctime", ctime); VelocityUtil.generate(serviceImpl_vm, serviceImpl, context); System.out.println(serviceImpl); } } System.out.println("========== 结束生成Service =========="); System.out.println("========== 开始生成Controller =========="); System.out.println("========== 结束生成Controller =========="); } // 递归删除非空文件夹 public static void deleteDir(File dir) { if (dir.isDirectory()) { File[] files = dir.listFiles(); for (int i = 0; i < files.length; i++) { deleteDir(files[i]); } } dir.delete(); } }