diff --git a/src/main/java/xyz/wbsite/dbtool/Application.java b/src/main/java/xyz/wbsite/dbtool/Application.java index 0e3c5100..74351cd2 100644 --- a/src/main/java/xyz/wbsite/dbtool/Application.java +++ b/src/main/java/xyz/wbsite/dbtool/Application.java @@ -5,7 +5,11 @@ import org.springframework.boot.autoconfigure.EnableAutoConfiguration; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.boot.builder.SpringApplicationBuilder; import org.springframework.boot.web.servlet.support.SpringBootServletInitializer; +import xyz.wbsite.dbtool.web.frame.utils.ResourceUtil; +import java.io.File; +import java.io.FileNotFoundException; +import java.net.URL; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; @@ -17,7 +21,7 @@ public class Application extends SpringBootServletInitializer { return application.sources(Application.class); } - public static void main(String[] args) { + public static void main(String[] args) throws FileNotFoundException { ExecutorService executorService = Executors.newFixedThreadPool(2); executorService.execute(new Runnable() { @Override diff --git a/src/main/java/xyz/wbsite/dbtool/javafx/ctrl/OptionMainController.java b/src/main/java/xyz/wbsite/dbtool/javafx/ctrl/OptionMainController.java index 4ac5038f..e090b33d 100644 --- a/src/main/java/xyz/wbsite/dbtool/javafx/ctrl/OptionMainController.java +++ b/src/main/java/xyz/wbsite/dbtool/javafx/ctrl/OptionMainController.java @@ -27,7 +27,7 @@ public class OptionMainController { public String getDataBase() { RadioButton value = (RadioButton) db.selectedToggleProperty().getValue(); String name = value.textProperty().getValue(); - return name.toUpperCase(); + return name; } public GenerateOptionListener getListener() { diff --git a/src/main/java/xyz/wbsite/dbtool/javafx/enums/DataBase.java b/src/main/java/xyz/wbsite/dbtool/javafx/enums/DataBase.java index d1716e2d..759bfa16 100644 --- a/src/main/java/xyz/wbsite/dbtool/javafx/enums/DataBase.java +++ b/src/main/java/xyz/wbsite/dbtool/javafx/enums/DataBase.java @@ -2,6 +2,7 @@ package xyz.wbsite.dbtool.javafx.enums; public enum DataBase { - ORACLE, - MYSQL + MySQL, + Oracle, + SQLite } diff --git a/src/main/java/xyz/wbsite/dbtool/javafx/manger/ProjectManager.java b/src/main/java/xyz/wbsite/dbtool/javafx/manger/ProjectManager.java index 8ab6c63d..0b8105c9 100644 --- a/src/main/java/xyz/wbsite/dbtool/javafx/manger/ProjectManager.java +++ b/src/main/java/xyz/wbsite/dbtool/javafx/manger/ProjectManager.java @@ -3,16 +3,40 @@ package xyz.wbsite.dbtool.javafx.manger; import org.springframework.boot.system.ApplicationHome; import xyz.wbsite.dbtool.javafx.enums.DataBase; import xyz.wbsite.dbtool.javafx.enums.FieldType; -import xyz.wbsite.dbtool.javafx.manger.callable.*; -import xyz.wbsite.dbtool.javafx.po.*; +import xyz.wbsite.dbtool.javafx.manger.callable.AndroidCallable; +import xyz.wbsite.dbtool.javafx.manger.callable.ApiCallable; +import xyz.wbsite.dbtool.javafx.manger.callable.SBMDBCallable; +import xyz.wbsite.dbtool.javafx.manger.callable.SpringBootCallable; +import xyz.wbsite.dbtool.javafx.manger.callable.SpringMVCCallable; +import xyz.wbsite.dbtool.javafx.manger.callable.VueCallable; +import xyz.wbsite.dbtool.javafx.po.AbstractDBmapper; +import xyz.wbsite.dbtool.javafx.po.AndroidOption; +import xyz.wbsite.dbtool.javafx.po.Api; +import xyz.wbsite.dbtool.javafx.po.Field; +import xyz.wbsite.dbtool.javafx.po.Module; +import xyz.wbsite.dbtool.javafx.po.MySQLDBmapper; +import xyz.wbsite.dbtool.javafx.po.OracleDBmapper; +import xyz.wbsite.dbtool.javafx.po.Project; +import xyz.wbsite.dbtool.javafx.po.SBMDBOption; +import xyz.wbsite.dbtool.javafx.po.SQLiteDBmapper; +import xyz.wbsite.dbtool.javafx.po.Table; +import xyz.wbsite.dbtool.javafx.po.VueOption; import xyz.wbsite.dbtool.javafx.tool.Dialog; import java.io.File; import java.io.FilenameFilter; -import java.sql.*; +import java.sql.Connection; +import java.sql.DriverManager; +import java.sql.ResultSet; +import java.sql.SQLException; +import java.sql.Statement; import java.util.List; import java.util.Map; -import java.util.concurrent.*; +import java.util.concurrent.Callable; +import java.util.concurrent.ExecutionException; +import java.util.concurrent.ExecutorService; +import java.util.concurrent.Executors; +import java.util.concurrent.Future; public class ProjectManager { @@ -219,10 +243,12 @@ public class ProjectManager { private static ExecutorService service = Executors.newFixedThreadPool(1); public void tryGetDBmapper(DataBase dataBase) { - if (dataBase.name().equals(DataBase.MYSQL.name())) { - dBmapper = new MySqlDBmapper(dataBase); - } else if (dataBase.name().equals(DataBase.ORACLE.name())) { + if (dataBase.name().toUpperCase().equals(DataBase.MySQL.name().toUpperCase())) { + dBmapper = new MySQLDBmapper(dataBase); + } else if (dataBase.name().toUpperCase().equals(DataBase.Oracle.name().toUpperCase())) { dBmapper = new OracleDBmapper(dataBase); + } else if (dataBase.name().toUpperCase().equals(DataBase.SQLite.name().toUpperCase())) { + dBmapper = new SQLiteDBmapper(dataBase); } } @@ -278,7 +304,7 @@ public class ProjectManager { @Override public void run() { boolean mkdirs = api.mkdirs(); - ApiCallable apiCallable = new ApiCallable(module,api,domainList, apis); + ApiCallable apiCallable = new ApiCallable(module, api, domainList, apis); Future submit = service.submit(apiCallable); try { Boolean b = (Boolean) submit.get(); @@ -402,7 +428,7 @@ public class ProjectManager { String driverClassName = properties.get("driverClassName"); try { - //加载MySql的驱动类 + //加载MySQL的驱动类 Class.forName(driverClassName); Connection cn = DriverManager.getConnection(url, username, password); @@ -425,7 +451,7 @@ public class ProjectManager { if ("Orcale".equals(type)) { try { - dBmapper = new OracleDBmapper(DataBase.ORACLE); + dBmapper = new OracleDBmapper(DataBase.Oracle); //加载驱动类 Class.forName(driverClassName); @@ -497,7 +523,7 @@ public class ProjectManager { } } else if ("Mysql".equals(type)) { try { - dBmapper = new MySqlDBmapper(DataBase.MYSQL); + dBmapper = new MySQLDBmapper(DataBase.MySQL); //加载驱动类 Class.forName(driverClassName); diff --git a/src/main/java/xyz/wbsite/dbtool/javafx/manger/callable/SpringBootCallable.java b/src/main/java/xyz/wbsite/dbtool/javafx/manger/callable/SpringBootCallable.java index 73663584..85f6ec34 100644 --- a/src/main/java/xyz/wbsite/dbtool/javafx/manger/callable/SpringBootCallable.java +++ b/src/main/java/xyz/wbsite/dbtool/javafx/manger/callable/SpringBootCallable.java @@ -88,7 +88,7 @@ public class SpringBootCallable implements Callable { generateMapper(Tool.createPath(moduleDir.getAbsolutePath(), "mpr"), module, dataBase, option); System.out.println("生成模块:Manager"); generateManager(Tool.createPath(moduleDir.getAbsolutePath(), "mgr"), module, dataBase, option); - System.out.println("生成模块:Requset"); + System.out.println("生成模块:Request"); generateRequest(Tool.createPath(moduleDir.getAbsolutePath(), "req"), module, dataBase, option); System.out.println("生成模块:Response"); generateResponse(Tool.createPath(moduleDir.getAbsolutePath(), "rsp"), module, dataBase, option); @@ -664,7 +664,7 @@ public class SpringBootCallable implements Callable { freeMarkerManager.outputTemp(Tool.createFile(root.getAbsolutePath(), "application-prod.properties"), option + "/resources/application-prod.ftl", ctx); Tool.outputResource(option + "/resources/logback-spring.xml", Tool.createFile(root.getAbsolutePath(), "logback-spring.xml")); - if (DataBase.ORACLE == dataBase) { + if (DataBase.Oracle == dataBase) { File lib = Tool.createPath(root.getAbsolutePath(), "lib"); Tool.outputResource(option + "/resources/lib/ojdbc7-12.1.0.2.jar", Tool.createFile(lib.getAbsolutePath(), "ojdbc7-12.1.0.2.jar")); } diff --git a/src/main/java/xyz/wbsite/dbtool/javafx/po/MySqlDBmapper.java b/src/main/java/xyz/wbsite/dbtool/javafx/po/MySqlDBmapper.java index 2180753e..e208d4df 100644 --- a/src/main/java/xyz/wbsite/dbtool/javafx/po/MySqlDBmapper.java +++ b/src/main/java/xyz/wbsite/dbtool/javafx/po/MySqlDBmapper.java @@ -3,9 +3,9 @@ package xyz.wbsite.dbtool.javafx.po; import xyz.wbsite.dbtool.javafx.enums.DataBase; import xyz.wbsite.dbtool.javafx.enums.FieldType; -public class MySqlDBmapper extends AbstractDBmapper { +public class MySQLDBmapper extends AbstractDBmapper { - public MySqlDBmapper(DataBase mDataBase) { + public MySQLDBmapper(DataBase mDataBase) { super(mDataBase); } diff --git a/src/main/java/xyz/wbsite/dbtool/javafx/po/SQLiteDBmapper.java b/src/main/java/xyz/wbsite/dbtool/javafx/po/SQLiteDBmapper.java new file mode 100644 index 00000000..cf0f69ed --- /dev/null +++ b/src/main/java/xyz/wbsite/dbtool/javafx/po/SQLiteDBmapper.java @@ -0,0 +1,236 @@ +package xyz.wbsite.dbtool.javafx.po; + +import xyz.wbsite.dbtool.javafx.enums.DataBase; +import xyz.wbsite.dbtool.javafx.enums.FieldType; + +public class SQLiteDBmapper extends AbstractDBmapper { + + public SQLiteDBmapper(DataBase mDataBase) { + super(mDataBase); + } + + @Override + public String getDataBaseType(FieldType type, int lenght) { + if (FieldType.Boolean.name().equals(type.name())) { + return "BIT"; + } else if (FieldType.Byte.name().equals(type.name())) { + return "TINYINT"; + } else if (FieldType.Short.name().equals(type.name())) { + return "SMALLINT"; + } else if (FieldType.Integer.name().equals(type.name())) { + return "INTEGER"; + } else if (FieldType.Long.name().equals(type.name())) { + return "NUMERIC"; + } else if (FieldType.Float.name().equals(type.name())) { + return "REAL"; + } else if (FieldType.Double.name().equals(type.name())) { + return "FLOAT"; + } else if (FieldType.Character.name().equals(type.name())) { + return "VARCHAR"; + } else if (FieldType.String_1.name().equals(type.name())) { + return "CAHR"; + } else if (FieldType.String_10.name().equals(type.name())) { + return "CAHR"; + } else if (FieldType.String_var.name().equals(type.name())) { + return "VARCHAR"; + } else if (FieldType.String_var50.name().equals(type.name())) { + return "VARCHAR"; + } else if (FieldType.String_var100.name().equals(type.name())) { + return "VARCHAR"; + } else if (FieldType.String_var255.name().equals(type.name())) { + return "VARCHAR"; + } else if (FieldType.String_var500.name().equals(type.name())) { + return "VARCHAR"; + } else if (FieldType.String_var2500.name().equals(type.name())) { + return "VARCHAR"; + } else if (FieldType.String_var4000.name().equals(type.name())) { + return "VARCHAR"; + } else if (FieldType.Date.name().equals(type.name())) { + return "DATE"; + } else if (FieldType.Bytes.name().equals(type.name())) { + return "BLOB"; + } else { + return ""; + } + } + + @Override + public String getFieldSql(Field field) { + StringBuffer sb = new StringBuffer(""); + sb.append("`").append(field.getFieldName()).append("` "); + + FieldType type = field.getFieldType(); + + if (FieldType.Boolean.name().equals(type.name())) { + sb.append("TINYINT(1)"); + } else if (FieldType.Dict.name().equals(type.name())) { + sb.append("VARCHAR(10)"); + } else if (FieldType.Byte.name().equals(type.name())) { + sb.append("TINYINT(3)"); + } else if (FieldType.Short.name().equals(type.name())) { + sb.append("SMALLINT(5)"); + } else if (FieldType.Integer.name().equals(type.name())) { + sb.append("INTEGER(10)"); + } else if (FieldType.Long.name().equals(type.name())) { + sb.append("BIGINT(20)"); + } else if (FieldType.Float.name().equals(type.name())) { + sb.append("FLOAT"); + } else if (FieldType.Double.name().equals(type.name())) { + sb.append("DOUBLE"); + } else if (FieldType.Date.name().equals(type.name())) { + sb.append("DATETIME"); + } else if (FieldType.Bytes.name().equals(type.name())) { + sb.append("BLOB"); + } else if (FieldType.Character.name().equals(type.name())) { + sb.append("CHAR(1)"); + } else if (FieldType.String_1.name().equals(type.name())) { + sb.append("CHAR(1)"); + } else if (FieldType.String_10.name().equals(type.name())) { + sb.append("CHAR(10)"); + } else if (FieldType.String_var.name().equals(type.name())) { + Integer fieldLength = field.getFieldLength(); + sb.append("VARCHAR(" + fieldLength + ")"); + } else if (FieldType.String_var50.name().equals(type.name())) { + sb.append("VARCHAR(50)"); + } else if (FieldType.String_var100.name().equals(type.name())) { + sb.append("VARCHAR(100)"); + } else if (FieldType.String_var255.name().equals(type.name())) { + sb.append("VARCHAR(250)"); + } else if (FieldType.String_var500.name().equals(type.name())) { + sb.append("VARCHAR(500)"); + } else if (FieldType.String_var2500.name().equals(type.name())) { + sb.append("VARCHAR(2500)"); + } else if (FieldType.String_var4000.name().equals(type.name())) { + sb.append("VARCHAR(4000)"); + } else if (FieldType.String_super.name().equals(type.name())) { + sb.append("TEXT"); + } + + if (!field.getIsSystem() && field.getIsMust() && (field.getDefaultValue() == null || field.getDefaultValue().toUpperCase().equals("NULL"))) { + sb.append(" NOT NULL"); + } else if (!field.getIsSystem() && field.getIsMust() && field.getDefaultValue() != null && !field.getDefaultValue().toUpperCase().equals("NULL")) { + if (field.getFieldType().name().contains("String")) {//默认字符 + sb.append(" NOT NULL").append(" DEFAULT '" + field.getDefaultValue() + "'"); + } else {//不是字符就是数字,目前只考虑两张情况 + sb.append(" NOT NULL").append(" DEFAULT " + field.getDefaultValue() + ""); + } + } else if (field.getIsSystem() && field.getFieldName().equals("ID")) { + sb.append(" NOT NULL"); + } else if (field.getIsSystem() && field.getFieldName().equals("ROW_VERSION")) { + sb.append(" NOT NULL").append(" DEFAULT 0"); + } else if (field.getIsSystem() && field.getFieldName().equals("IS_DELETED")) { + sb.append(" NOT NULL").append(" DEFAULT 0"); + } else if (field.getIsSystem() && field.getFieldName().equals("CREATE_BY")) { + sb.append(" NOT NULL"); + } else if (field.getIsSystem() && field.getFieldName().equals("CREATE_TIME")) { + sb.append(" NOT NULL"); + } else if (field.getIsSystem() && field.getFieldName().equals("LAST_UPDATE_BY")) { + sb.append(" DEFAULT NULL"); + } else if (field.getIsSystem() && field.getFieldName().equals("LAST_UPDATE_TIME")) { + sb.append(" DEFAULT NULL"); + } + + if (field.getFieldComment() != null) { + sb.append(" COMMENT '" + field.getFieldComment() + "'"); + } + return sb.toString(); + } + + @Override + DataBase getDataBase() { + return super.getDataBase(); + } + + @Override + public String getDataBaseType(FieldType type) { + if (FieldType.Boolean.name().equals(type.name())) { + return "TINYINT"; + } else if (FieldType.Byte.name().equals(type.name())) { + return "TINYINT"; + } else if (FieldType.Short.name().equals(type.name())) { + return "SMALLINT"; + } else if (FieldType.Integer.name().equals(type.name())) { + return "INTEGER"; + } else if (FieldType.Long.name().equals(type.name())) { + return "NUMERIC"; + } else if (FieldType.Float.name().equals(type.name())) { + return "REAL"; + } else if (FieldType.Double.name().equals(type.name())) { + return "FLOAT"; + } else if (FieldType.Character.name().equals(type.name())) { + return "VARCHAR"; + } else if (FieldType.String_1.name().equals(type.name())) { + return "CHAR"; + } else if (FieldType.String_10.name().equals(type.name())) { + return "CHAR"; + } else if (FieldType.String_var.name().equals(type.name())) { + return "VARCHAR"; + } else if (FieldType.String_var50.name().equals(type.name())) { + return "VARCHAR"; + } else if (FieldType.String_var100.name().equals(type.name())) { + return "VARCHAR"; + } else if (FieldType.String_var255.name().equals(type.name())) { + return "VARCHAR"; + } else if (FieldType.String_var500.name().equals(type.name())) { + return "VARCHAR"; + } else if (FieldType.String_var2500.name().equals(type.name())) { + return "VARCHAR"; + } else if (FieldType.String_var4000.name().equals(type.name())) { + return "VARCHAR"; + } else if (FieldType.Date.name().equals(type.name())) { + return "DATETIME"; + } else if (FieldType.Bytes.name().equals(type.name())) { + return "BLOB"; + } else { + return ""; + } + } + + @Override + public FieldType getType(String type, int lenght, int precision, int scale) { + if ("bigint".equals(type)) { + return FieldType.Long; + } else if ("varchar".equals(type) && lenght == 50) { + return FieldType.String_var50; + } else if ("varchar".equals(type) && lenght == 100) { + return FieldType.String_var100; + } else if ("varchar".equals(type) && lenght == 255) { + return FieldType.String_var255; + } else if ("varchar".equals(type) && lenght == 500) { + return FieldType.String_var500; + } else if ("varchar".equals(type) && lenght == 2500) { + return FieldType.String_var2500; + } else if ("varchar".equals(type) && lenght == 4000) { + return FieldType.String_var4000; + } else if ("varchar".equals(type)) { + return FieldType.String_var; + } else if ("date".equals(type)) { + return FieldType.Date; + } else if ("datetime".equals(type)) { + return FieldType.Date; + } else if ("timestamp".equals(type)) { + return FieldType.Date; + } else if ("char".equals(type) && lenght == 1) { + return FieldType.String_1; + } else if ("char".equals(type) && lenght == 10) { + return FieldType.String_10; + } else if ("char".equals(type)) { + return FieldType.String_var; + } else if ("tinyint".equals(type)) { + return FieldType.Integer; + } else if ("smallint".equals(type)) { + return FieldType.Integer; + } else if ("mediumint".equals(type)) { + return FieldType.Integer; + } else if ("int".equals(type)) { + return FieldType.Integer; + } else if ("bigint".equals(type)) { + return FieldType.Long; + } else if ("float".equals(type)) { + return FieldType.Float; + } else if ("double".equals(type)) { + return FieldType.Double; + } + return FieldType.String_var50; + } +} diff --git a/src/main/java/xyz/wbsite/dbtool/javafx/tool/Dialog.java b/src/main/java/xyz/wbsite/dbtool/javafx/tool/Dialog.java index a1b234d8..a2704ab9 100644 --- a/src/main/java/xyz/wbsite/dbtool/javafx/tool/Dialog.java +++ b/src/main/java/xyz/wbsite/dbtool/javafx/tool/Dialog.java @@ -219,7 +219,7 @@ public class Dialog { controller.getOk().setOnAction(new EventHandler() { @Override public void handle(ActionEvent event) { - listener.onGenerate(controller.getType(), DataBase.valueOf(controller.getDataBase().toUpperCase())); + listener.onGenerate(controller.getType(), DataBase.valueOf(controller.getDataBase())); } }); diff --git a/src/main/java/xyz/wbsite/dbtool/web/frame/utils/ClassUtil.java b/src/main/java/xyz/wbsite/dbtool/web/frame/utils/ClassUtil.java new file mode 100644 index 00000000..c9a208ac --- /dev/null +++ b/src/main/java/xyz/wbsite/dbtool/web/frame/utils/ClassUtil.java @@ -0,0 +1,114 @@ +package xyz.wbsite.dbtool.web.frame.utils; + +import java.lang.reflect.Field; +import java.lang.reflect.Method; +import java.util.Collection; + +/** + * ClassUtil + * + * @author wangbing + * @version 0.0.1 + * @since 2017-01-01 + */ +public class ClassUtil { + + /** + * 获取模板类所有字段 + * + * @param clazz 模板对象 + * @param parentFirst 是否关注父类的字段 + * @return + */ + public static Field[] getFields(Class clazz, boolean parentFirst) { + Field[] fields = clazz.getDeclaredFields(); + + if (parentFirst) { + Field[] parentFields = getParentFields(clazz.getSuperclass()); + return concat(fields, parentFields); + } + return fields; + } + + /** + * 判断是不是集合的实现类 + * + * @param clazz + * @return + */ + public static boolean isCollection(Class clazz) { + return Collection.class.isAssignableFrom(clazz); + } + + /** + * 获取GET方法 + * + * @param name 成员变量名 + * @param pojoClass POJO对象 + * @return 方法 + */ + public static Method getMethod(String name, Class pojoClass) throws RuntimeException { + String getMethodName = "get" + StringUtil.upperFirstWord(name); + try { + return pojoClass.getMethod(getMethodName); + } catch (Exception e) { + getMethodName = "is" + StringUtil.upperFirstWord(name); + try { + return pojoClass.getMethod(getMethodName); + } catch (NoSuchMethodException e1) { + throw new RuntimeException("can not find[" + name + "]method"); + } + } + } + + /** + * 获取SET方法 + * + * @param name 成员变量名 + * @param pojoClass POJO对象 + * @return 方法 + */ + public static Method setMethod(String name, Class pojoClass, Class type) { + String setMethodName = "set" + StringUtil.upperFirstWord(name); + try { + return pojoClass.getMethod(setMethodName, type); + } catch (Exception e) { + return null; + } + } + + public static boolean isJavaClass(Field field) { + Class fieldType = field.getType(); + boolean isBaseClass = false; + if (fieldType.isArray()) { + isBaseClass = false; + } else if (fieldType.isPrimitive() || fieldType.getPackage() == null + || fieldType.getPackage().getName().equals("java.lang") + || fieldType.getPackage().getName().equals("java.math") + || fieldType.getPackage().getName().equals("java.sql") + || fieldType.getPackage().getName().equals("java.util")) { + isBaseClass = true; + } + return isBaseClass; + } + + public static Field[] getFields(Class clazz) { + return getFields(clazz, false); + } + + private static Field[] getParentFields(Class parentClazz) { + if (parentClazz != null) { + Field[] fields = parentClazz.getDeclaredFields(); + Field[] parentFields = getParentFields(parentClazz.getSuperclass()); + return concat(fields, parentFields); + } + return new Field[0]; + } + + private static Field[] concat(Field[] f1, Field[] f2) { + Field[] fields = new Field[f1.length + f2.length]; + System.arraycopy(f1, 0, fields, 0, f1.length); + System.arraycopy(f2, 0, fields, f1.length, f2.length); + return fields; + } +} diff --git a/src/main/java/xyz/wbsite/dbtool/web/frame/utils/FileUtil.java b/src/main/java/xyz/wbsite/dbtool/web/frame/utils/FileUtil.java index 10c2d6be..141d2366 100644 --- a/src/main/java/xyz/wbsite/dbtool/web/frame/utils/FileUtil.java +++ b/src/main/java/xyz/wbsite/dbtool/web/frame/utils/FileUtil.java @@ -55,6 +55,28 @@ public class FileUtil { } } + public static byte[] toByteArray(InputStream input, int size) throws IOException { + if(size < 0) { + throw new IllegalArgumentException("Size must be equal or greater than zero: " + size); + } else if(size == 0) { + return new byte[0]; + } else { + byte[] data = new byte[size]; + + int offset; + int read; + for(offset = 0; offset < size && (read = input.read(data, offset, size - offset)) != -1; offset += read) { + ; + } + + if(offset != size) { + throw new IOException("Unexpected read size. current: " + offset + ", expected: " + size); + } else { + return data; + } + } + } + public static byte[] toByteArray(InputStream input) throws IOException { ByteArrayOutputStream output = new ByteArrayOutputStream(); Throwable var2 = null; diff --git a/src/main/java/xyz/wbsite/dbtool/web/frame/utils/ResourceUtil.java b/src/main/java/xyz/wbsite/dbtool/web/frame/utils/ResourceUtil.java new file mode 100644 index 00000000..87c08c56 --- /dev/null +++ b/src/main/java/xyz/wbsite/dbtool/web/frame/utils/ResourceUtil.java @@ -0,0 +1,78 @@ +package xyz.wbsite.dbtool.web.frame.utils; + +import org.springframework.boot.system.ApplicationHome; +import org.springframework.core.io.ClassPathResource; +import org.springframework.util.ResourceUtils; + +import java.io.File; +import java.io.FileOutputStream; +import java.io.IOException; +import java.io.InputStream; + +public class ResourceUtil extends ResourceUtils { + + /** + * 获取当前运行jar文件 + * + * @return jar路径 + */ + public static File getApplicationHome() { + ApplicationHome home = new ApplicationHome(ResourceUtil.class); + return home.getSource(); + } + + /** + * 获取resource下文件 + * + * @return 文件路径 + */ + public static InputStream getResourceInput(String resource) { + try { + ClassPathResource classPathResource = new ClassPathResource(resource); + return classPathResource.getInputStream(); + } catch (IOException e) { + return null; + } + } + + public static boolean copyResource2File(String resource, File file) { + InputStream resourceInput = getResourceInput(resource); + FileOutputStream fileOutputStream = null; + try { + if (!file.exists()) { + file.createNewFile(); + } + fileOutputStream = new FileOutputStream(file); + FileUtil.copy(resourceInput, fileOutputStream); + } catch (IOException e) { + e.printStackTrace(); + return false; + } finally { + try { + if (fileOutputStream != null) fileOutputStream.close(); + } catch (IOException e) { + e.printStackTrace(); + } + } + return true; + } + + public static byte[] getResourceBytes(String resource) { + InputStream is = null; + byte[] result = null; + try { + is = getResourceInput(resource); + result = new byte[is.available()]; + is.read(result); + } catch (IOException e) { + e.printStackTrace(); + } finally { + try { + if (is != null) is.close(); + } catch (IOException e) { + e.printStackTrace(); + } + } + return result; + } +} diff --git a/src/main/java/xyz/wbsite/dbtool/web/frame/utils/ResponseUtil.java b/src/main/java/xyz/wbsite/dbtool/web/frame/utils/ResponseUtil.java new file mode 100644 index 00000000..63fd1fa4 --- /dev/null +++ b/src/main/java/xyz/wbsite/dbtool/web/frame/utils/ResponseUtil.java @@ -0,0 +1,38 @@ +package xyz.wbsite.dbtool.web.frame.utils; + +import org.springframework.http.HttpHeaders; +import org.springframework.http.HttpStatus; +import org.springframework.http.MediaType; +import org.springframework.http.ResponseEntity; + +import java.io.UnsupportedEncodingException; +import java.net.URLEncoder; + +/** + * Base64Util + * + * @author wangbing + * @version 0.0.1 + * @since 2017-01-01 + */ +public class ResponseUtil { + + /** + * 包装ResponseEntity + * + * @param bytes 字节数组 + * @param fileName 文件名 + * @return + */ + public static ResponseEntity apply(byte[] bytes, String fileName) { + try { + HttpHeaders headers = new HttpHeaders(); + headers.setContentType(MediaType.APPLICATION_OCTET_STREAM); + headers.setContentDispositionFormData("attachment", URLEncoder.encode(fileName, "utf-8")); + return new ResponseEntity<>(bytes, headers, HttpStatus.OK); + } catch (UnsupportedEncodingException e) { + return null; + } + } + +} diff --git a/src/main/java/xyz/wbsite/dbtool/web/frame/utils/StringUtil.java b/src/main/java/xyz/wbsite/dbtool/web/frame/utils/StringUtil.java new file mode 100644 index 00000000..f7165e3f --- /dev/null +++ b/src/main/java/xyz/wbsite/dbtool/web/frame/utils/StringUtil.java @@ -0,0 +1,87 @@ +package xyz.wbsite.dbtool.web.frame.utils; + +public class StringUtil { + + public static int getByteLength(String str) { + int length = str.replaceAll("[^\\x00-\\xff]", "**").length(); + return length; + } + + public static String upperFirstWord(String str) { + String temp = str.substring(0, 1); + return temp.toUpperCase() + str.substring(1); + } + + public static boolean isEmpty(String value) { + int strLen; + if (value == null || (strLen = value.length()) == 0) { + return true; + } + for (int i = 0; i < strLen; i++) { + if ((Character.isWhitespace(value.charAt(i)) == false)) { + return false; + } + } + return true; + } + + + public static boolean isNotEmpty(String value) { + return !isEmpty(value); + } + + + /** + * 检查对象是否为数字型字符串,包含负数开头的。 + */ + public static boolean isNumeric(Object obj) { + if (obj == null) { + return false; + } + char[] chars = obj.toString().toCharArray(); + int length = chars.length; + if (length < 1) + return false; + + int i = 0; + if (length > 1 && chars[0] == '-') + i = 1; + + for (; i < length; i++) { + if (!Character.isDigit(chars[i])) { + return false; + } + } + return true; + } + + /** + * 把通用字符编码的字符串转化为汉字编码。 + */ + public static String unicodeToChinese(String unicode) { + StringBuilder out = new StringBuilder(); + if (!isEmpty(unicode)) { + for (int i = 0; i < unicode.length(); i++) { + out.append(unicode.charAt(i)); + } + } + return out.toString(); + } + + + public static String toUnderlineStyle(String name) { + StringBuilder newName = new StringBuilder(); + for (int i = 0; i < name.length(); i++) { + char c = name.charAt(i); + if (Character.isUpperCase(c)) { + if (i > 0) { + newName.append("_"); + } + newName.append(Character.toLowerCase(c)); + } else { + newName.append(c); + } + } + return newName.toString(); + } +} diff --git a/src/main/resources/fxml/generateOption.fxml b/src/main/resources/fxml/generateOption.fxml index bbc08417..32f918df 100644 --- a/src/main/resources/fxml/generateOption.fxml +++ b/src/main/resources/fxml/generateOption.fxml @@ -1,7 +1,13 @@ - - + + + + + + + +
@@ -34,12 +40,13 @@ - + - + + diff --git a/src/main/resources/fxml/main.fxml b/src/main/resources/fxml/main.fxml index f5924516..71153325 100644 --- a/src/main/resources/fxml/main.fxml +++ b/src/main/resources/fxml/main.fxml @@ -1,8 +1,19 @@ - - + + + + + + + + + + + + + @@ -22,10 +33,10 @@ - + - + diff --git a/src/main/resources/modules/SpringBoot/java/frame/utils/ResourceUtil.java b/src/main/resources/modules/SpringBoot/java/frame/utils/ResourceUtil.java new file mode 100644 index 00000000..ee99f922 --- /dev/null +++ b/src/main/resources/modules/SpringBoot/java/frame/utils/ResourceUtil.java @@ -0,0 +1,95 @@ +package ${basePackage}.frame.utils; + +import org.springframework.boot.system.ApplicationHome; +import org.springframework.core.io.ClassPathResource; +import org.springframework.util.ResourceUtils; + +import java.io.File; +import java.io.FileOutputStream; +import java.io.IOException; +import java.io.InputStream; + +/** + * Resource资源文件工具 + * + * @author wangbing + * @version 0.0.1 + * @since 2017-01-01 + */ +public class ResourceUtil extends ResourceUtils { + + /** + * 获取当前运行jar文件 + * + * @return jar路径 + */ + public static File getApplicationHome() { + ApplicationHome home = new ApplicationHome(ResourceUtil.class); + return home.getSource(); + } + + /** + * 获取resource下文件 + * + * @return 文件路径 + */ + public static InputStream getResourceInput(String resource) { + try { + ClassPathResource classPathResource = new ClassPathResource(resource); + return classPathResource.getInputStream(); + } catch (IOException e) { + return null; + } + } + + /** + * 复制jar下的资源文件到指定文件 + * + * @return 成功或失败情况 + */ + public static boolean copyResource2File(String resource, File file) { + InputStream resourceInput = getResourceInput(resource); + FileOutputStream fileOutputStream = null; + try { + if (!file.exists()) { + file.createNewFile(); + } + fileOutputStream = new FileOutputStream(file); + FileUtil.copy(resourceInput, fileOutputStream); + } catch (IOException e) { + e.printStackTrace(); + return false; + } finally { + try { + if (fileOutputStream != null) fileOutputStream.close(); + } catch (IOException e) { + e.printStackTrace(); + } + } + return true; + } + + /** + * 获取资源的的字节数组 + * + * @return 字节数组 + */ + public static byte[] getResourceBytes(String resource) { + InputStream is = null; + byte[] result = null; + try { + is = getResourceInput(resource); + result = new byte[is.available()]; + is.read(result); + } catch (IOException e) { + e.printStackTrace(); + } finally { + try { + if (is != null) is.close(); + } catch (IOException e) { + e.printStackTrace(); + } + } + return result; + } +} diff --git a/src/main/resources/modules/SpringBoot/java/module/mpr/mapper.ftl b/src/main/resources/modules/SpringBoot/java/module/mpr/mapper.ftl index cd9cbd81..53a47762 100644 --- a/src/main/resources/modules/SpringBoot/java/module/mpr/mapper.ftl +++ b/src/main/resources/modules/SpringBoot/java/module/mpr/mapper.ftl @@ -4,16 +4,16 @@ "http://mybatis.org/dtd/mybatis-3-mapper.dtd"> -<#if dataBase == 'ORACLE'> +<#if dataBase == 'Oracle'> "${module.modulePrefix?default("")}${table.tableName}" -<#elseif dataBase='MYSQL'> +<#elseif dataBase='MySQL'> `${module.modulePrefix?default("")}${table.tableName}` - <#if dataBase == 'ORACLE'> + <#if dataBase == 'Oracle'> <#list table.fields as f>"${f.fieldName}"<#if f_has_next>, - <#elseif dataBase='MYSQL'> + <#elseif dataBase='MySQL'> <#list table.fields as f>`${f.fieldName}`<#if f_has_next>, @@ -30,14 +30,14 @@ FROM WHERE - <#if dataBase == 'ORACLE'> + <#if dataBase == 'Oracle'> "IS_DELETED" = 0 - <#elseif dataBase='MYSQL'> + <#elseif dataBase='MySQL'> `IS_DELETED` = 0 <#list table.fields as f> <#if f.isQuery> -<#if dataBase == 'ORACLE'> +<#if dataBase == 'Oracle'> <#if f.fieldType.javaType() == "Boolean"> AND "${f.fieldName}" = ${r"#{"}request.${f.getFName()}} @@ -88,7 +88,7 @@ AND to_char("${f.fieldName}",'yyyy-MM-dd HH24:mi:ss') = to_char(${r"#{"}request.${f.getFName()}},'yyyy-MM-dd HH24:mi:ss') -<#elseif dataBase='MYSQL'> +<#elseif dataBase='MySQL'> <#if f.fieldType.javaType() == "Boolean"> AND `${f.fieldName}` = ${r"#{"}request.${f.getFName()}} @@ -150,18 +150,18 @@ FROM WHERE - <#if dataBase == 'ORACLE'> + <#if dataBase == 'Oracle'> "IS_DELETED" = 0 - <#elseif dataBase='MYSQL'> + <#elseif dataBase='MySQL'> `IS_DELETED` = 0 1 = 2 <#list table.fields as f> <#if f.isSearch> -<#if dataBase == 'ORACLE'> +<#if dataBase == 'Oracle'> OR "${f.fieldName}" LIKE CONCAT(CONCAT('%',${r"#{"}request.keyword}),'%') -<#elseif dataBase='MYSQL'> +<#elseif dataBase='MySQL'> OR `${f.fieldName}` LIKE CONCAT('%',${r"#{request.keyword}"},'%') @@ -186,7 +186,7 @@ 0, 0, ${r"#{"}token.userId,jdbcType=NUMERIC}, - <#if dataBase == 'ORACLE'>sysdate<#elseif dataBase == 'MYSQL'>sysdate(), + <#if dataBase == 'Oracle'>sysdate<#elseif dataBase == 'MySQL'>sysdate(), NULL, NULL ) @@ -210,7 +210,7 @@ 0, 0, ${r"#{"}token.userId,jdbcType=NUMERIC}, - <#if dataBase == 'ORACLE'>sysdate<#elseif dataBase == 'MYSQL'>sysdate(), + <#if dataBase == 'Oracle'>sysdate<#elseif dataBase == 'MySQL'>sysdate(), NULL, NULL ) @@ -220,11 +220,11 @@ UPDATE - <#if dataBase == 'ORACLE'> + <#if dataBase == 'Oracle'> SET "IS_DELETED" = 1 WHERE "IS_DELETED" = 0 AND "ID" = ${r"#{"}request.id} - <#elseif dataBase='MYSQL'> + <#elseif dataBase='MySQL'> SET `IS_DELETED` = 1 WHERE `IS_DELETED` = 0 AND `ID` = ${r"#{"}request.id} @@ -235,7 +235,7 @@ UPDATE SET - <#if dataBase == 'ORACLE'> + <#if dataBase == 'Oracle'> <#list table.fields as f> <#if !f.isPrimaryKey> <#if !f.isSystem || f.fieldName == 'ID'> @@ -246,7 +246,7 @@ "ROW_VERSION" = "ROW_VERSION" + 1, "LAST_UPDATE_BY" = ${r"#{"}token.userId}, "LAST_UPDATE_TIME" = sysdate - <#elseif dataBase='MYSQL'> + <#elseif dataBase='MySQL'> <#list table.fields as f> <#if !f.isPrimaryKey> <#if !f.isSystem || f.fieldName == 'ID'> @@ -259,11 +259,11 @@ `LAST_UPDATE_TIME` = sysdate() WHERE - <#if dataBase == 'ORACLE'> + <#if dataBase == 'Oracle'> "IS_DELETED" = 0 AND "ID" = ${r"#{"}request.id} AND "ROW_VERSION" = ${r"#{"}request.rowVersion} - <#elseif dataBase='MYSQL'> + <#elseif dataBase='MySQL'> `IS_DELETED` = 0 AND `ID` = ${r"#{"}request.id} AND `ROW_VERSION` = ${r"#{"}request.rowVersion} @@ -276,9 +276,9 @@ FROM WHERE - <#if dataBase == 'ORACLE'> + <#if dataBase == 'Oracle'> "IS_DELETED" = 0 - <#elseif dataBase='MYSQL'> + <#elseif dataBase='MySQL'> `IS_DELETED` = 0 @@ -289,10 +289,10 @@ FROM WHERE - <#if dataBase == 'ORACLE'> + <#if dataBase == 'Oracle'> "IS_DELETED" = 0 AND "ID" = ${r"#{request.id}"} - <#elseif dataBase='MYSQL'> + <#elseif dataBase='MySQL'> `IS_DELETED` = 0 AND `ID` = ${r"#{request.id}"} diff --git a/src/main/resources/modules/SpringBoot/java/module/mpr/mapper_nosys.ftl b/src/main/resources/modules/SpringBoot/java/module/mpr/mapper_nosys.ftl index 7b1fac42..921bef6f 100644 --- a/src/main/resources/modules/SpringBoot/java/module/mpr/mapper_nosys.ftl +++ b/src/main/resources/modules/SpringBoot/java/module/mpr/mapper_nosys.ftl @@ -5,16 +5,16 @@ -<#if dataBase == 'ORACLE'> +<#if dataBase == 'Oracle'> "${module.modulePrefix?default("")}${table.tableName}" -<#elseif dataBase='MYSQL'> +<#elseif dataBase='MySQL'> `${module.modulePrefix?default("")}${table.tableName}` - <#if dataBase == 'ORACLE'> + <#if dataBase == 'Oracle'> <#list table.fields as f>"${f.fieldName}"<#if f_has_next>, - <#elseif dataBase='MYSQL'> + <#elseif dataBase='MySQL'> <#list table.fields as f>`${f.fieldName}`<#if f_has_next>, @@ -34,7 +34,7 @@ 1 = 1 <#list table.fields as f> <#if f.isQuery> -<#if dataBase == 'ORACLE'> +<#if dataBase == 'Oracle'> <#if f.fieldType.javaType() == "String"> AND "${f.fieldName}" = ${r"#{"}request.${f.getFName()}} @@ -45,7 +45,7 @@ AND "${f.fieldName}" = ${r"#{"}request.${f.getFName()}} -<#elseif dataBase='MYSQL'> +<#elseif dataBase='MySQL'> <#if f.fieldType.javaType() == "String"> AND `${f.fieldName}` = ${r"#{"}request.${f.getFName()}} @@ -86,11 +86,11 @@ UPDATE SET - <#if dataBase == 'ORACLE'> + <#if dataBase == 'Oracle'> <#list table.fields as f> "${f.fieldName}" = ${r"#{"}request.${f.getFName()},jdbcType=${f.fieldType.jdbcType()}}<#if f_has_next>, - <#elseif dataBase='MYSQL'> + <#elseif dataBase='MySQL'> <#list table.fields as f> `${f.fieldName}` = ${r"#{"}request.${f.getFName()},jdbcType=${f.fieldType.jdbcType()}}<#if f_has_next>, diff --git a/src/main/resources/modules/SpringBoot/pom.ftl b/src/main/resources/modules/SpringBoot/pom.ftl index 7dfe17e5..36c0fb2f 100644 --- a/src/main/resources/modules/SpringBoot/pom.ftl +++ b/src/main/resources/modules/SpringBoot/pom.ftl @@ -115,6 +115,14 @@ +<#if dataBase == 'SQLite'> + + org.xerial + sqlite-jdbc + 3.21.0.1 + + + <#if dataBase == 'ORACLE'> com.example diff --git a/src/main/resources/modules/SpringBoot/resources/application-dev.ftl b/src/main/resources/modules/SpringBoot/resources/application-dev.ftl index d81124f4..9a677a0b 100644 --- a/src/main/resources/modules/SpringBoot/resources/application-dev.ftl +++ b/src/main/resources/modules/SpringBoot/resources/application-dev.ftl @@ -17,23 +17,36 @@ server.tomcat.uri-encoding=UTF-8 # 日志配置 logging.path=D:// logging.levels=DEBUG -<#if dataBase == 'ORACLE'> -# oracle +<#if dataBase == 'Oracle'> +# Oracle spring.datasource.driver-class-name=oracle.jdbc.driver.OracleDriver spring.datasource.url=jdbc:oracle:thin:@127.0.0.1:1521:orcl spring.datasource.username=TEST spring.datasource.password=123456 +# mybatis +mybatis.mapper-locations=classpath:**/mpr/*.xml +mybatis.configuration.map-underscore-to-camel-case=true -<#if dataBase == 'MYSQL'> -# mysql +<#if dataBase == 'MySQL'> +# MySQL spring.datasource.driver-class-name=com.mysql.jdbc.Driver spring.datasource.url=jdbc:mysql://192.168.31.81:3306/test?useUnicode=true&characterEncoding=utf-8&useSSL=false spring.datasource.username=test -spring.datasource.password=123456 +spring.datasource.password=123456# mybatis +# mybatis +mybatis.mapper-locations=classpath:**/mpr/*.xml +mybatis.configuration.map-underscore-to-camel-case=true +<#if dataBase == 'SQLite'> +# SQLite spring.datasource.url=jdbc:sqlite::resource:example.db +spring.datasource.driver-class-name=org.sqlite.JDBC +spring.datasource.url=jdbc:sqlite::resource:example.db +spring.datasource.username=test +spring.datasource.password=123456 # mybatis mybatis.mapper-locations=classpath:**/mpr/*.xml mybatis.configuration.map-underscore-to-camel-case=true + # pagehelper pagehelper.autoRuntimeDialect=true pagehelper.reasonable=false diff --git a/src/main/resources/modules/SpringBoot/resources/application-prod.ftl b/src/main/resources/modules/SpringBoot/resources/application-prod.ftl index b4723849..a36ccd95 100644 --- a/src/main/resources/modules/SpringBoot/resources/application-prod.ftl +++ b/src/main/resources/modules/SpringBoot/resources/application-prod.ftl @@ -17,23 +17,26 @@ server.tomcat.uri-encoding=UTF-8 # 日志配置 logging.path=/root/ logging.levels=INFO -<#if dataBase == 'ORACLE'> +<#if dataBase == 'Oracle'> # oracle spring.datasource.driver-class-name=oracle.jdbc.driver.OracleDriver spring.datasource.url=jdbc:oracle:thin:@127.0.0.1:1521:orcl spring.datasource.username=TEST spring.datasource.password=123456 +# mybatis +mybatis.mapper-locations=classpath:**/mpr/*.xml +mybatis.configuration.map-underscore-to-camel-case=true -<#if dataBase == 'MYSQL'> +<#if dataBase == 'MySQL'> # mysql spring.datasource.driver-class-name=com.mysql.jdbc.Driver spring.datasource.url=jdbc:mysql://127.0.0.1:3306/test?useUnicode=true&characterEncoding=utf-8&useSSL=false spring.datasource.username=test spring.datasource.password=123456 - # mybatis mybatis.mapper-locations=classpath:**/mpr/*.xml mybatis.configuration.map-underscore-to-camel-case=true + # pagehelper pagehelper.autoRuntimeDialect=true pagehelper.reasonable=false