diff --git a/pom.xml b/pom.xml index ae45c7a7..cd802abe 100644 --- a/pom.xml +++ b/pom.xml @@ -46,21 +46,6 @@ commons-beanutils 1.9.2 - - mysql - mysql-connector-java - 5.1.38 - - - com.oracle - ojdbc14 - 10.2.0.5 - - - org.postgresql - postgresql - 9.4.1209 - com.alibaba fastjson diff --git a/src/main/java/com/zzg/mybatis/generator/MainUI.java b/src/main/java/com/zzg/mybatis/generator/MainUI.java index 34757c26..399e7e0e 100644 --- a/src/main/java/com/zzg/mybatis/generator/MainUI.java +++ b/src/main/java/com/zzg/mybatis/generator/MainUI.java @@ -1,32 +1,17 @@ package com.zzg.mybatis.generator; -import java.awt.*; -import java.awt.event.WindowAdapter; -import java.awt.event.WindowEvent; -import java.net.URL; -import java.util.regex.Matcher; -import java.util.regex.Pattern; - import com.zzg.mybatis.generator.controller.MainUIController; - -import com.zzg.mybatis.generator.model.GeneratorConfig; import com.zzg.mybatis.generator.util.ConfigHelper; -import com.zzg.mybatis.generator.view.AlertUtil; import javafx.application.Application; -import javafx.application.Platform; -import javafx.embed.swing.JFXPanel; import javafx.fxml.FXMLLoader; -import javafx.scene.Group; import javafx.scene.Parent; import javafx.scene.Scene; -import javafx.scene.paint.Color; -import javafx.scene.text.Font; -import javafx.scene.text.Text; import javafx.stage.Stage; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import javax.swing.*; +import java.net.URL; /** * 这是本软件的主入口,要运行本软件请直接运行本类就可以了,不用传入任何参数 diff --git a/src/main/java/com/zzg/mybatis/generator/bridge/MybatisGeneratorBridge.java b/src/main/java/com/zzg/mybatis/generator/bridge/MybatisGeneratorBridge.java index a41299a0..dcd39ef3 100644 --- a/src/main/java/com/zzg/mybatis/generator/bridge/MybatisGeneratorBridge.java +++ b/src/main/java/com/zzg/mybatis/generator/bridge/MybatisGeneratorBridge.java @@ -12,6 +12,7 @@ import org.mybatis.generator.api.ShellCallback; import org.mybatis.generator.config.*; import org.mybatis.generator.internal.DefaultShellCallback; +import org.mybatis.generator.internal.ObjectFactory; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -20,6 +21,8 @@ import java.util.List; import java.util.Set; +import static org.mybatis.generator.internal.util.ClassloaderUtility.getCustomClassloader; + /** * The bridge between GUI and the mybatis generator. All the operation to mybatis generator should proceed through this * class @@ -39,16 +42,18 @@ public class MybatisGeneratorBridge { private List ignoredColumns; private List columnOverrides; + /** + * The Context will share between all controller to be a the mybatis generator configuration collector + */ + private static Configuration configuration = new Configuration(); + private static Context context = new Context(ModelType.CONDITIONAL); - public MybatisGeneratorBridge() { - init(); - } + static { + configuration.addContext(context); + context.addProperty("javaFileEncoding", "UTF-8"); + } - private void init() { - Configuration config = new Configuration(); - Context context = new Context(ModelType.CONDITIONAL); - context.addProperty("javaFileEncoding", "UTF-8"); - config.addContext(context); + public MybatisGeneratorBridge() { } public void setGeneratorConfig(GeneratorConfig generatorConfig) { @@ -60,13 +65,7 @@ public void setDatabaseConfig(DatabaseConfig databaseConfig) { } public void generate() throws Exception { - Configuration config = new Configuration(); - String connectorLibPath = ConfigHelper.findConnectorLibPath(selectedDatabaseConfig.getDbType()); - _LOG.info("connectorLibPath: {}", connectorLibPath); - config.addClasspathEntry(connectorLibPath); - Context context = new Context(ModelType.CONDITIONAL); - config.addContext(context); - // Table config + // Table configuration TableConfiguration tableConfig = new TableConfiguration(context); tableConfig.setTableName(generatorConfig.getTableName()); tableConfig.setDomainObjectName(generatorConfig.getDomainObjectName()); @@ -101,7 +100,7 @@ public void generate() throws Exception { JavaModelGeneratorConfiguration modelConfig = new JavaModelGeneratorConfiguration(); modelConfig.setTargetPackage(generatorConfig.getModelPackage()); modelConfig.setTargetProject(generatorConfig.getProjectFolder() + "/" + generatorConfig.getModelPackageTargetFolder()); - // Mapper config + // Mapper configuration SqlMapGeneratorConfiguration mapperConfig = new SqlMapGeneratorConfiguration(); mapperConfig.setTargetPackage(generatorConfig.getMappingXMLPackage()); mapperConfig.setTargetProject(generatorConfig.getProjectFolder() + "/" + generatorConfig.getMappingXMLTargetFolder()); @@ -148,12 +147,15 @@ public void generate() throws Exception { Set fullyqualifiedTables = new HashSet<>(); Set contexts = new HashSet<>(); ShellCallback shellCallback = new DefaultShellCallback(true); // override=true - MyBatisGenerator myBatisGenerator = new MyBatisGenerator(config, shellCallback, warnings); + MyBatisGenerator myBatisGenerator = new MyBatisGenerator(configuration, shellCallback, warnings); myBatisGenerator.generate(progressCallback, contexts, fullyqualifiedTables); } + public static Context getContext() { + return context; + } - public void setProgressCallback(ProgressCallback progressCallback) { + public void setProgressCallback(ProgressCallback progressCallback) { this.progressCallback = progressCallback; } diff --git a/src/main/java/com/zzg/mybatis/generator/controller/MainUIController.java b/src/main/java/com/zzg/mybatis/generator/controller/MainUIController.java index 09ba2e21..5a9b1b06 100644 --- a/src/main/java/com/zzg/mybatis/generator/controller/MainUIController.java +++ b/src/main/java/com/zzg/mybatis/generator/controller/MainUIController.java @@ -1,6 +1,5 @@ package com.zzg.mybatis.generator.controller; -import com.mysql.jdbc.exceptions.jdbc4.CommunicationsException; import com.zzg.mybatis.generator.bridge.MybatisGeneratorBridge; import com.zzg.mybatis.generator.model.DatabaseConfig; import com.zzg.mybatis.generator.model.GeneratorConfig; @@ -30,6 +29,7 @@ import java.io.File; import java.net.URL; +import java.sql.SQLRecoverableException; import java.util.ArrayList; import java.util.List; import java.util.Optional; @@ -158,7 +158,7 @@ public void initialize(URL location, ResourceBundle resources) { children.add(newTreeItem); } } - } catch (CommunicationsException e) { + } catch (SQLRecoverableException e) { _LOG.error(e.getMessage(), e); AlertUtil.showErrorAlert("连接超时"); } catch (Exception e) { diff --git a/src/main/java/com/zzg/mybatis/generator/controller/NewConnectionController.java b/src/main/java/com/zzg/mybatis/generator/controller/NewConnectionController.java index de5e1e2f..de587677 100644 --- a/src/main/java/com/zzg/mybatis/generator/controller/NewConnectionController.java +++ b/src/main/java/com/zzg/mybatis/generator/controller/NewConnectionController.java @@ -64,8 +64,6 @@ void testConnection() { return; } try { - String url = DbUtil.getConnectionUrlWithSchema(config); - System.out.println(url); DbUtil.getConnection(config); AlertUtil.showInfoAlert("连接成功"); } catch (Exception e) { diff --git a/src/main/java/com/zzg/mybatis/generator/model/DatabaseConfig.java b/src/main/java/com/zzg/mybatis/generator/model/DatabaseConfig.java index 628439c7..6accf1ba 100644 --- a/src/main/java/com/zzg/mybatis/generator/model/DatabaseConfig.java +++ b/src/main/java/com/zzg/mybatis/generator/model/DatabaseConfig.java @@ -1,95 +1,114 @@ package com.zzg.mybatis.generator.model; +import java.util.Objects; + /** * Created by Owen on 5/13/16. */ public class DatabaseConfig { - private String dbType; - /** - * The name of the config - */ - private String name; + private String dbType; + /** + * The name of the config + */ + private String name; + + private String host; - private String host; + private String port; - private String port; + private String schema; - private String schema; + private String username; - private String username; + private String password; - private String password; + private String encoding; - private String encoding; + public String getName() { + return name; + } - public String getName() { - return name; - } + public void setName(String name) { + this.name = name; + } - public void setName(String name) { - this.name = name; - } + public String getHost() { + return host; + } - public String getHost() { - return host; - } + public void setHost(String host) { + this.host = host; + } - public void setHost(String host) { - this.host = host; - } + public String getPort() { + return port; + } - public String getPort() { - return port; - } + public void setPort(String port) { + this.port = port; + } - public void setPort(String port) { - this.port = port; - } + public String getSchema() { + return schema; + } - public String getSchema() { - return schema; - } + public void setSchema(String schema) { + this.schema = schema; + } - public void setSchema(String schema) { - this.schema = schema; - } + public String getUsername() { + return username; + } - public String getUsername() { - return username; - } + public void setUsername(String username) { + this.username = username; + } - public void setUsername(String username) { - this.username = username; - } + public String getPassword() { + return password; + } - public String getPassword() { - return password; - } + public void setPassword(String password) { + this.password = password; + } - public void setPassword(String password) { - this.password = password; - } + public String getEncoding() { + return encoding; + } - public String getEncoding() { - return encoding; - } + public void setEncoding(String encoding) { + this.encoding = encoding; + } - public void setEncoding(String encoding) { - this.encoding = encoding; - } + public String getDbType() { + return dbType; + } - public String getDbType() { - return dbType; - } + public void setDbType(String dbType) { + this.dbType = dbType; + } - public void setDbType(String dbType) { - this.dbType = dbType; - } + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (o == null || getClass() != o.getClass()) return false; + DatabaseConfig that = (DatabaseConfig) o; + return Objects.equals(dbType, that.dbType) && Objects.equals(name, that.name) && Objects.equals(host, that + .host) && Objects.equals(port, that.port) && Objects.equals(schema, that.schema) && Objects.equals + (username, that.username) && Objects.equals(password, that.password) && Objects.equals(encoding, that + .encoding); + } - @Override - public String toString() { - return name; - } + @Override + public int hashCode() { + return Objects.hash(dbType, name, host, port, schema, username, password, encoding); + } + @Override + public String toString() { + return "DatabaseConfig{" + "dbType='" + dbType + '\'' + ", name='" + name + '\'' + ", host='" + host + '\'' + + ", port='" + port + '\'' + ", schema='" + schema + '\'' + ", username='" + username + '\'' + ", " + + "password='" + password + '\'' + ", encoding='" + encoding + '\'' + '}'; + } } diff --git a/src/main/java/com/zzg/mybatis/generator/util/ConfigHelper.java b/src/main/java/com/zzg/mybatis/generator/util/ConfigHelper.java index 7f2cc524..d5b42290 100644 --- a/src/main/java/com/zzg/mybatis/generator/util/ConfigHelper.java +++ b/src/main/java/com/zzg/mybatis/generator/util/ConfigHelper.java @@ -215,5 +215,25 @@ public static String findConnectorLibPath(String dbType) { } } + public static List getAllJDBCDriverJarPaths() { + List jarFilePathList = new ArrayList<>(); + URL resource = Thread.currentThread().getContextClassLoader().getResource("logback.xml"); + try { + String path = resource.toURI().getRawPath(); + File file = new File(path.substring(0, path.lastIndexOf("/")) + "/lib"); + File[] jarFiles = file.listFiles(); + if (jarFiles != null && jarFiles.length > 0) { + for (File jarFile : jarFiles) { + if (jarFile.isFile() && jarFile.getAbsolutePath().endsWith(".jar")) { + jarFilePathList.add(jarFile.getAbsolutePath()); + } + } + } + } catch (Exception e) { + throw new RuntimeException("找不到驱动文件,请联系开发者"); + } + return jarFilePathList; + } + } diff --git a/src/main/java/com/zzg/mybatis/generator/util/DbUtil.java b/src/main/java/com/zzg/mybatis/generator/util/DbUtil.java index 6d190a07..f7eb4e4f 100644 --- a/src/main/java/com/zzg/mybatis/generator/util/DbUtil.java +++ b/src/main/java/com/zzg/mybatis/generator/util/DbUtil.java @@ -3,12 +3,16 @@ import com.zzg.mybatis.generator.model.DatabaseConfig; import com.zzg.mybatis.generator.model.DbType; import com.zzg.mybatis.generator.model.UITableColumnVO; +import org.apache.commons.lang3.StringUtils; +import org.mybatis.generator.config.JDBCConnectionConfiguration; +import org.mybatis.generator.internal.util.ClassloaderUtility; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import java.sql.*; -import java.util.ArrayList; -import java.util.List; +import java.util.*; + +import static org.mybatis.generator.internal.util.StringUtility.stringHasValue; /** * Created by Owen on 6/12/16. @@ -18,44 +22,75 @@ public class DbUtil { private static final Logger _LOG = LoggerFactory.getLogger(DbUtil.class); private static final int DB_CONNECTION_TIMEOUTS_SECONDS = 1; + private static Map drivers; + + static { + drivers = new HashMap<>(); + List driverJars = ConfigHelper.getAllJDBCDriverJarPaths(); + ClassLoader classloader = ClassloaderUtility.getCustomClassloader(driverJars); + DbType[] dbTypes = DbType.values(); + for (DbType dbType : dbTypes) { + try { + Class clazz = Class.forName(dbType.getDriverClass(), true, classloader); + Driver driver = (Driver) clazz.newInstance(); + _LOG.info("load driver class: {}", driver); + drivers.put(dbType, driver); + } catch (Exception e) { + _LOG.error("load driver error"); + } + } + } + public static Connection getConnection(DatabaseConfig config) throws ClassNotFoundException, SQLException { - DriverManager.setLoginTimeout(DB_CONNECTION_TIMEOUTS_SECONDS); - DbType dbType = DbType.valueOf(config.getDbType()); - Class.forName(dbType.getDriverClass()); String url = getConnectionUrlWithSchema(config); - _LOG.info("getConnection, connection url: {}", url); - return DriverManager.getConnection(url, config.getUsername(), config.getPassword()); + Properties props = new Properties(); + + props.setProperty("user", config.getUsername()); //$NON-NLS-1$ + props.setProperty("password", config.getPassword()); //$NON-NLS-1$ + + DriverManager.setLoginTimeout(DB_CONNECTION_TIMEOUTS_SECONDS); + Connection connection = drivers.get(DbType.valueOf(config.getDbType())).connect(url, props); + _LOG.info("getConnection, connection url: {}", connection); + return connection; } public static List getTableNames(DatabaseConfig config) throws Exception { String url = getConnectionUrlWithSchema(config); _LOG.info("getTableNames, connection url: {}", url); - Connection conn = DriverManager.getConnection(url, config.getUsername(), config.getPassword()); - DatabaseMetaData md = conn.getMetaData(); - ResultSet rs = md.getTables(null, config.getUsername().toUpperCase(), null, null); - List tables = new ArrayList<>(); - while (rs.next()) { - tables.add(rs.getString(3)); - } - return tables; - } + Connection connection = getConnection(config); + try { + DatabaseMetaData md = connection.getMetaData(); + ResultSet rs = md.getTables(null, config.getUsername().toUpperCase(), null, null); + List tables = new ArrayList<>(); + while (rs.next()) { + tables.add(rs.getString(3)); + } + return tables; + } finally { + connection.close(); + } + } public static List getTableColumns(DatabaseConfig dbConfig, String tableName) throws Exception { String url = getConnectionUrlWithSchema(dbConfig); _LOG.info("getTableColumns, connection url: {}", url); Connection conn = getConnection(dbConfig); - DatabaseMetaData md = conn.getMetaData(); - ResultSet rs = md.getColumns(null, null, tableName, null); - List columns = new ArrayList<>(); - while (rs.next()) { - UITableColumnVO columnVO = new UITableColumnVO(); - String columnName = rs.getString("COLUMN_NAME"); - columnVO.setColumnName(columnName); - columnVO.setJdbcType(rs.getString("TYPE_NAME")); - columns.add(columnVO); - } - return columns; - } + try { + DatabaseMetaData md = conn.getMetaData(); + ResultSet rs = md.getColumns(null, null, tableName, null); + List columns = new ArrayList<>(); + while (rs.next()) { + UITableColumnVO columnVO = new UITableColumnVO(); + String columnName = rs.getString("COLUMN_NAME"); + columnVO.setColumnName(columnName); + columnVO.setJdbcType(rs.getString("TYPE_NAME")); + columns.add(columnVO); + } + return columns; + } finally { + conn.close(); + } + } public static String getConnectionUrlWithSchema(DatabaseConfig dbConfig) throws ClassNotFoundException { DbType dbType = DbType.valueOf(dbConfig.getDbType()); diff --git a/src/test/java/com/zzg/mybatis/generator/util/ConfigHelperTest.java b/src/test/java/com/zzg/mybatis/generator/util/ConfigHelperTest.java index a1fd3db4..d6fa632b 100644 --- a/src/test/java/com/zzg/mybatis/generator/util/ConfigHelperTest.java +++ b/src/test/java/com/zzg/mybatis/generator/util/ConfigHelperTest.java @@ -3,6 +3,8 @@ import org.junit.Assert; import org.junit.Test; +import java.util.List; + /** * Created by zouzhigang on 2016/9/18. */ @@ -25,4 +27,10 @@ public void testFindConnectorLibPath_PostgreSQL() { String path = ConfigHelper.findConnectorLibPath("PostgreSQL"); Assert.assertTrue(path.contains("postgresql")); } + + @Test + public void testGetAllJDBCDriverJarPaths() { + List jarFilePaths = ConfigHelper.getAllJDBCDriverJarPaths(); + Assert.assertTrue(jarFilePaths != null && jarFilePaths.size() > 0); + } }