001/** 002 * Copyright (c) 2015-2022, Michael Yang 杨福海 (fuhai999@gmail.com). 003 * <p> 004 * Licensed under the Apache License, Version 2.0 (the "License"); 005 * you may not use this file except in compliance with the License. 006 * You may obtain a copy of the License at 007 * <p> 008 * http://www.apache.org/licenses/LICENSE-2.0 009 * <p> 010 * Unless required by applicable law or agreed to in writing, software 011 * distributed under the License is distributed on an "AS IS" BASIS, 012 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 013 * See the License for the specific language governing permissions and 014 * limitations under the License. 015 */ 016package io.jboot.codegen; 017 018import com.jfinal.plugin.activerecord.dialect.*; 019import com.jfinal.plugin.activerecord.generator.MetaBuilder; 020import com.jfinal.plugin.activerecord.generator.TableMeta; 021import com.zaxxer.hikari.HikariConfig; 022import com.zaxxer.hikari.HikariDataSource; 023import io.jboot.Jboot; 024import io.jboot.db.datasource.DataSourceConfig; 025import io.jboot.exception.JbootIllegalConfigException; 026import io.jboot.utils.StrUtil; 027 028import javax.sql.DataSource; 029import java.util.ArrayList; 030import java.util.List; 031import java.util.Set; 032 033/** 034 * 代码生成工具类 035 */ 036public class CodeGenHelpler { 037 038 039 public static String getUserDir() { 040 return System.getProperty("user.dir"); 041 } 042 043 044 /** 045 * 获取数据源 046 * 047 * @return 048 */ 049 public static DataSource getDatasource() { 050 DataSourceConfig datasourceConfig = Jboot.config(DataSourceConfig.class, "jboot.datasource"); 051 HikariConfig config = new HikariConfig(); 052 config.setJdbcUrl(datasourceConfig.getUrl()); 053 config.setUsername(datasourceConfig.getUser()); 054 config.setPassword(datasourceConfig.getPassword()); 055 config.setDriverClassName(datasourceConfig.getDriverClassName()); 056 057 return new HikariDataSource(config); 058 } 059 060 061 public static MetaBuilder createMetaBuilder() { 062 return createMetaBuilder(getDatasource(), Jboot.config(DataSourceConfig.class, "jboot.datasource").getType()); 063 } 064 065 066 public static MetaBuilder createMetaBuilder(DataSource dataSource) { 067 return createMetaBuilder(dataSource, DataSourceConfig.TYPE_MYSQL); 068 } 069 070 071 public static MetaBuilder createMetaBuilder(DataSource dataSource, String type) { 072 return createMetaBuilder(dataSource, type, true); 073 } 074 075 public static MetaBuilder createMetaBuilder(DataSource dataSource, String type, boolean removeNoPrimaryKeyTable) { 076 MetaBuilder metaBuilder = removeNoPrimaryKeyTable ? new MetaBuilder(dataSource) : new MetaBuilder(dataSource) { 077 @Override 078 protected void removeNoPrimaryKeyTable(List<TableMeta> ret) { 079 //do Nothing... 080 } 081 }; 082 metaBuilder.setGenerateRemarks(true); 083 switch (type) { 084 case DataSourceConfig.TYPE_MYSQL: 085 metaBuilder.setDialect(new MysqlDialect()); 086 break; 087 case DataSourceConfig.TYPE_ORACLE: 088 metaBuilder.setDialect(new OracleDialect()); 089 break; 090 case DataSourceConfig.TYPE_SQLSERVER: 091 metaBuilder.setDialect(new SqlServerDialect()); 092 break; 093 case DataSourceConfig.TYPE_SQLITE: 094 metaBuilder.setDialect(new Sqlite3Dialect()); 095 break; 096 case DataSourceConfig.TYPE_ANSISQL: 097 metaBuilder.setDialect(new AnsiSqlDialect()); 098 break; 099 case DataSourceConfig.TYPE_POSTGRESQL: 100 metaBuilder.setDialect(new PostgreSqlDialect()); 101 break; 102 case DataSourceConfig.TYPE_INFORMIX: 103 metaBuilder.setDialect(new InformixDialect()); 104 break; 105 default: 106 throw new JbootIllegalConfigException("Only support datasource type: mysql、oracle、sqlserver、sqlite、ansisql、postgresql and infomix" + 107 ", please check your jboot.properties. "); 108 } 109 110 return metaBuilder; 111 } 112 113 114 /** 115 * 排除指定的表,有些表不需要生成的 116 * 117 * @param list 118 * @param excludeTables 119 */ 120 public static void excludeTables(List<TableMeta> list, String excludeTables) { 121 if (StrUtil.isNotBlank(excludeTables)) { 122 List<TableMeta> newTableMetaList = new ArrayList<>(); 123 Set<String> excludeTableSet = StrUtil.splitToSet(excludeTables.toLowerCase(), ","); 124 for (TableMeta tableMeta : list) { 125 if (excludeTableSet.contains(tableMeta.name.toLowerCase())) { 126 System.out.println("exclude table: " + tableMeta.name); 127 continue; 128 } 129 newTableMetaList.add(tableMeta); 130 } 131 list.clear(); 132 list.addAll(newTableMetaList); 133 } 134 } 135 136 137} 138 139