From 9de7b4b377460a605c31878b231fe0f516e1bca4 Mon Sep 17 00:00:00 2001 From: Honghua Zhu Date: Thu, 10 May 2018 17:53:10 +0800 Subject: [PATCH] =?UTF-8?q?=E6=89=A7=E8=A1=8CCREATE=20TABLE=E6=97=B6?= =?UTF-8?q?=E5=A6=82=E6=9E=9C=E6=8C=87=E5=AE=9A=E4=BA=86generate=20code?= =?UTF-8?q?=E5=AD=90=E5=8F=A5=E5=88=99=E7=94=9F=E6=88=90=E4=BB=A3=E7=A0=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/main/java/org/lealone/orm/Table.java | 224 ------------------ .../org/lealone/sql/ddl/CreateService.java | 6 +- .../java/org/lealone/sql/ddl/CreateTable.java | 190 +++++++++++++++ .../java/org/lealone/test/UnitTestBase.java | 26 ++ .../org/lealone/test/orm/CustomerTest.java | 31 +-- .../lealone/test/service/ServiceProvider.java | 9 +- .../org/lealone/test/service/ServiceTest.java | 47 ++-- 7 files changed, 256 insertions(+), 277 deletions(-) diff --git a/lealone-orm/src/main/java/org/lealone/orm/Table.java b/lealone-orm/src/main/java/org/lealone/orm/Table.java index 85ddc28b3..e7d5b677e 100644 --- a/lealone-orm/src/main/java/org/lealone/orm/Table.java +++ b/lealone-orm/src/main/java/org/lealone/orm/Table.java @@ -17,33 +17,7 @@ */ package org.lealone.orm; -import java.io.BufferedOutputStream; -import java.io.File; -import java.io.FileOutputStream; -import java.io.IOException; -import java.nio.charset.Charset; -import java.util.HashSet; - -import org.lealone.common.exceptions.DbException; -import org.lealone.common.util.CamelCaseHelper; import org.lealone.db.ServerSession; -import org.lealone.db.table.Column; -import org.lealone.db.value.DataType; -import org.lealone.db.value.Value; -import org.lealone.orm.typequery.PArray; -import org.lealone.orm.typequery.PBigDecimal; -import org.lealone.orm.typequery.PBoolean; -import org.lealone.orm.typequery.PByte; -import org.lealone.orm.typequery.PDouble; -import org.lealone.orm.typequery.PFloat; -import org.lealone.orm.typequery.PInteger; -import org.lealone.orm.typequery.PLong; -import org.lealone.orm.typequery.PShort; -import org.lealone.orm.typequery.PSqlDate; -import org.lealone.orm.typequery.PString; -import org.lealone.orm.typequery.PTime; -import org.lealone.orm.typequery.PTimestamp; -import org.lealone.orm.typequery.PUuid; public class Table { @@ -86,202 +60,4 @@ ServerSession getSession() { public Database getDatabase() { return db; } - - public void genJavaCode(String path, String packageName) { - StringBuilder buff = new StringBuilder(); - StringBuilder methods = new StringBuilder(); - String className = CamelCaseHelper.toCamelFromUnderscore(dbTable.getName()); - className = Character.toUpperCase(className.charAt(0)) + className.substring(1); - - String qclassName = 'Q' + className; - StringBuilder qbuff = new StringBuilder(); - StringBuilder qfields = new StringBuilder(); - StringBuilder qinit = new StringBuilder(); - HashSet qimportSet = new HashSet<>(); - - String queryTypePackageName = PInteger.class.getPackage().getName(); - int queryTypePackageNameLength = queryTypePackageName.length(); - - buff.append("package ").append(packageName).append(";\r\n"); - buff.append("\r\n"); - buff.append("import org.lealone.orm.Table;\r\n"); - buff.append("\r\n"); - buff.append("/**\r\n"); - buff.append(" * Model bean for table '").append(dbTable.getName()).append("'.\r\n"); - buff.append(" *\r\n"); - buff.append(" * THIS IS A GENERATED OBJECT, DO NOT MODIFY THIS CLASS.\r\n"); - buff.append(" */\r\n"); - buff.append("public class ").append(className).append(" {\r\n"); - buff.append("\r\n"); - buff.append(" public static ").append(className).append(" create(String url) {\r\n"); - buff.append(" Table t = new Table(url, \"").append(dbTable.getName()).append("\");\r\n"); - buff.append(" return new ").append(className).append("(t);\r\n"); - buff.append(" }\r\n"); - buff.append("\r\n"); - buff.append(" private Table _t_;\r\n"); - buff.append("\r\n"); - for (Column c : dbTable.getColumns()) { - int type = c.getType(); - String typeClassName = DataType.getTypeClassName(type); - if (typeClassName.startsWith("java.lang.")) { - typeClassName = typeClassName.substring(10); - } - - String queryTypeClassName = getQueryTypeClassName(type); - queryTypeClassName = queryTypeClassName.substring(queryTypePackageNameLength + 1); - qimportSet.add(queryTypeClassName); - String columnName = CamelCaseHelper.toCamelFromUnderscore(c.getName()); - String columnNameFirstUpperCase = Character.toUpperCase(columnName.charAt(0)) + columnName.substring(1); - buff.append(" private ").append(typeClassName).append(" ").append(columnName).append(";\r\n"); - - qfields.append(" public final ").append(queryTypeClassName).append('<').append(qclassName).append("> ") - .append(columnName).append(";\r\n"); - - // 例如: this.id = new PLong<>("id", this); - qinit.append(" this.").append(columnName).append(" = new ").append(queryTypeClassName) - .append("<>(\"").append(columnName).append("\", this);\r\n"); - - // setter - methods.append("\r\n"); - methods.append(" public ").append(className).append(" set").append(columnNameFirstUpperCase).append('(') - .append(typeClassName); - methods.append(' ').append(columnName).append(") {\r\n"); - methods.append(" this.").append(columnName).append(" = ").append(columnName).append("; \r\n"); - methods.append(" return this;\r\n"); - methods.append(" }\r\n"); - - // getter - methods.append("\r\n"); - methods.append(" public ").append(typeClassName).append(" get").append(columnNameFirstUpperCase) - .append("() { \r\n"); - methods.append(" return ").append(columnName).append("; \r\n"); - methods.append(" }\r\n"); - } - buff.append("\r\n"); - buff.append(" public ").append(className).append("() {\r\n"); - buff.append(" }\r\n"); - buff.append("\r\n"); - buff.append(" private ").append(className).append("(Table t) {\r\n"); - buff.append(" this._t_ = t;\r\n"); - buff.append(" }\r\n"); - buff.append(methods); - buff.append("\r\n"); - buff.append(" public void save() {\r\n"); - buff.append(" _t_.save(this);\r\n"); - buff.append(" }\r\n"); - buff.append("\r\n"); - buff.append(" public boolean delete() {\r\n"); - buff.append(" return _t_.delete(this);\r\n"); - buff.append(" }\r\n"); - buff.append("}\r\n"); - // System.out.println(buff); - - // 查询器类 - qbuff.append("package ").append(packageName).append(";\r\n\r\n"); - qbuff.append("import org.lealone.orm.Query;\r\n"); - qbuff.append("import org.lealone.orm.Table;\r\n\r\n"); - for (String i : qimportSet) { - qbuff.append("import ").append(queryTypePackageName).append('.').append(i).append(";\r\n"); - } - qbuff.append("\r\n"); - qbuff.append("/**\r\n"); - qbuff.append(" * Query bean for model '").append(className).append("'.\r\n"); - qbuff.append(" *\r\n"); - qbuff.append(" * THIS IS A GENERATED OBJECT, DO NOT MODIFY THIS CLASS.\r\n"); - qbuff.append(" */\r\n"); - // 例如: public class QCustomer extends Query { - qbuff.append("public class ").append(qclassName).append(" extends Query<").append(className).append(", ") - .append(qclassName).append("> {\r\n"); - qbuff.append("\r\n"); - qbuff.append(" public static ").append(qclassName).append(" create(String url) {\r\n"); - qbuff.append(" Table t = new Table(url, \"").append(dbTable.getName()).append("\");\r\n"); - qbuff.append(" return new ").append(qclassName).append("(t);\r\n"); - qbuff.append(" }\r\n"); - qbuff.append("\r\n"); - qbuff.append(qfields); - qbuff.append("\r\n"); - qbuff.append(" private ").append(qclassName).append("(Table t) {\r\n"); - qbuff.append(" super(t);\r\n"); - qbuff.append(" setRoot(this);\r\n"); - qbuff.append("\r\n"); - qbuff.append(qinit); - qbuff.append(" }\r\n"); - qbuff.append("}\r\n"); - // System.out.println(qbuff); - - if (!path.endsWith(File.separator)) - path = path + File.separator; - path = path.replace('/', File.separatorChar); - path = path + packageName.replace('.', File.separatorChar) + File.separatorChar; - try { - if (!new File(path).exists()) { - new File(path).mkdirs(); - } - BufferedOutputStream modelFile = new BufferedOutputStream(new FileOutputStream(path + className + ".java")); - modelFile.write(buff.toString().getBytes(Charset.forName("UTF-8"))); - modelFile.close(); - - BufferedOutputStream qFile = new BufferedOutputStream(new FileOutputStream(path + qclassName + ".java")); - qFile.write(qbuff.toString().getBytes(Charset.forName("UTF-8"))); - qFile.close(); - } catch (IOException e) { - throw DbException.convertIOException(e, "Failed to genJavaCode, path = " + path); - } - } - - private static String getQueryTypeClassName(int type) { - switch (type) { - case Value.BOOLEAN: - return PBoolean.class.getName(); - case Value.BYTE: - return PByte.class.getName(); - case Value.SHORT: - return PShort.class.getName(); - case Value.INT: - return PInteger.class.getName(); - case Value.LONG: - return PLong.class.getName(); - case Value.DECIMAL: - return PBigDecimal.class.getName(); - case Value.TIME: - return PTime.class.getName(); - case Value.DATE: - return PSqlDate.class.getName(); - case Value.TIMESTAMP: - return PTimestamp.class.getName(); - case Value.BYTES: - // "[B", not "byte[]"; - return byte[].class.getName(); // TODO - case Value.UUID: - return PUuid.class.getName(); - case Value.STRING: - case Value.STRING_IGNORECASE: - case Value.STRING_FIXED: - return PString.class.getName(); - case Value.BLOB: - // "java.sql.Blob"; - throw DbException.throwInternalError("type=" + type); // return java.sql.Blob.class.getName(); // TODO - case Value.CLOB: - // "java.sql.Clob"; - throw DbException.throwInternalError("type=" + type); // return java.sql.Clob.class.getName(); // TODO - case Value.DOUBLE: - return PDouble.class.getName(); - case Value.FLOAT: - return PFloat.class.getName(); - case Value.NULL: - return null; - case Value.JAVA_OBJECT: - // "java.lang.Object"; - throw DbException.throwInternalError("type=" + type); // return Object.class.getName(); // TODO - case Value.UNKNOWN: - // anything - return Object.class.getName(); - case Value.ARRAY: - return PArray.class.getName(); - case Value.RESULT_SET: - throw DbException.throwInternalError("type=" + type); // return ResultSet.class.getName(); // TODO - default: - throw DbException.throwInternalError("type=" + type); - } - } } diff --git a/lealone-sql/src/main/java/org/lealone/sql/ddl/CreateService.java b/lealone-sql/src/main/java/org/lealone/sql/ddl/CreateService.java index 46c8b7550..a951bc2b4 100644 --- a/lealone-sql/src/main/java/org/lealone/sql/ddl/CreateService.java +++ b/lealone-sql/src/main/java/org/lealone/sql/ddl/CreateService.java @@ -453,7 +453,7 @@ private void genServiceInterfaceCode() { // System.out.println(buff); // System.out.println(); - writeFile(packageName, serviceName, ibuff, buff); + writeFile(codePath, packageName, serviceName, ibuff, buff); } private void genServiceExecuterCode() { @@ -573,7 +573,7 @@ private void genServiceExecuterCode() { ibuff.append(" * THIS IS A GENERATED OBJECT, DO NOT MODIFY THIS CLASS.\r\n"); ibuff.append(" */\r\n"); - writeFile(getExecuterPackageName(), className, ibuff, buff); + writeFile(codePath, getExecuterPackageName(), className, ibuff, buff); registerServiceExecuter(className); } @@ -586,7 +586,7 @@ private String getExecuterPackageName() { return packageName + ".executer"; } - private void writeFile(String packageName, String className, StringBuilder... buffArray) { + public static void writeFile(String codePath, String packageName, String className, StringBuilder... buffArray) { String path = codePath; if (!path.endsWith(File.separator)) path = path + File.separator; diff --git a/lealone-sql/src/main/java/org/lealone/sql/ddl/CreateTable.java b/lealone-sql/src/main/java/org/lealone/sql/ddl/CreateTable.java index 0a3ad7c39..3c48e1def 100644 --- a/lealone-sql/src/main/java/org/lealone/sql/ddl/CreateTable.java +++ b/lealone-sql/src/main/java/org/lealone/sql/ddl/CreateTable.java @@ -7,10 +7,12 @@ package org.lealone.sql.ddl; import java.util.ArrayList; +import java.util.HashSet; import java.util.Map; import org.lealone.api.ErrorCode; import org.lealone.common.exceptions.DbException; +import org.lealone.common.util.CamelCaseHelper; import org.lealone.common.util.New; import org.lealone.db.Database; import org.lealone.db.DbObjectType; @@ -23,6 +25,7 @@ import org.lealone.db.table.Table; import org.lealone.db.value.CaseInsensitiveMap; import org.lealone.db.value.DataType; +import org.lealone.db.value.Value; import org.lealone.sql.SQLStatement; import org.lealone.sql.dml.Insert; import org.lealone.sql.dml.Query; @@ -195,6 +198,9 @@ public int update() { db.removeSchemaObject(session, table); throw e; } + + if (genCode) + genCode(); } return 0; } @@ -330,4 +336,188 @@ public String getCodePath() { return codePath; } + private void genCode() { + StringBuilder buff = new StringBuilder(); + StringBuilder methods = new StringBuilder(); + String className = CamelCaseHelper.toCamelFromUnderscore(data.tableName); + className = Character.toUpperCase(className.charAt(0)) + className.substring(1); + + String qclassName = 'Q' + className; + StringBuilder qbuff = new StringBuilder(); + StringBuilder qfields = new StringBuilder(); + StringBuilder qinit = new StringBuilder(); + HashSet qimportSet = new HashSet<>(); + + String queryTypePackageName = TQ; + int queryTypePackageNameLength = queryTypePackageName.length(); + + buff.append("package ").append(packageName).append(";\r\n"); + buff.append("\r\n"); + buff.append("import org.lealone.orm.Table;\r\n"); + buff.append("\r\n"); + buff.append("/**\r\n"); + buff.append(" * Model bean for table '").append(data.tableName).append("'.\r\n"); + buff.append(" *\r\n"); + buff.append(" * THIS IS A GENERATED OBJECT, DO NOT MODIFY THIS CLASS.\r\n"); + buff.append(" */\r\n"); + buff.append("public class ").append(className).append(" {\r\n"); + buff.append("\r\n"); + buff.append(" public static ").append(className).append(" create(String url) {\r\n"); + buff.append(" Table t = new Table(url, \"").append(data.tableName).append("\");\r\n"); + buff.append(" return new ").append(className).append("(t);\r\n"); + buff.append(" }\r\n"); + buff.append("\r\n"); + buff.append(" private Table _t_;\r\n"); + buff.append("\r\n"); + for (Column c : data.columns) { + int type = c.getType(); + String typeClassName = DataType.getTypeClassName(type); + if (typeClassName.startsWith("java.lang.")) { + typeClassName = typeClassName.substring(10); + } + + String queryTypeClassName = getQueryTypeClassName(type); + queryTypeClassName = queryTypeClassName.substring(queryTypePackageNameLength + 1); + qimportSet.add(queryTypeClassName); + String columnName = CamelCaseHelper.toCamelFromUnderscore(c.getName()); + String columnNameFirstUpperCase = Character.toUpperCase(columnName.charAt(0)) + columnName.substring(1); + buff.append(" private ").append(typeClassName).append(" ").append(columnName).append(";\r\n"); + + qfields.append(" public final ").append(queryTypeClassName).append('<').append(qclassName).append("> ") + .append(columnName).append(";\r\n"); + + // 例如: this.id = new PLong<>("id", this); + qinit.append(" this.").append(columnName).append(" = new ").append(queryTypeClassName) + .append("<>(\"").append(columnName).append("\", this);\r\n"); + + // setter + methods.append("\r\n"); + methods.append(" public ").append(className).append(" set").append(columnNameFirstUpperCase).append('(') + .append(typeClassName); + methods.append(' ').append(columnName).append(") {\r\n"); + methods.append(" this.").append(columnName).append(" = ").append(columnName).append("; \r\n"); + methods.append(" return this;\r\n"); + methods.append(" }\r\n"); + + // getter + methods.append("\r\n"); + methods.append(" public ").append(typeClassName).append(" get").append(columnNameFirstUpperCase) + .append("() { \r\n"); + methods.append(" return ").append(columnName).append("; \r\n"); + methods.append(" }\r\n"); + } + buff.append("\r\n"); + buff.append(" public ").append(className).append("() {\r\n"); + buff.append(" }\r\n"); + buff.append("\r\n"); + buff.append(" private ").append(className).append("(Table t) {\r\n"); + buff.append(" this._t_ = t;\r\n"); + buff.append(" }\r\n"); + buff.append(methods); + buff.append("\r\n"); + buff.append(" public void save() {\r\n"); + buff.append(" _t_.save(this);\r\n"); + buff.append(" }\r\n"); + buff.append("\r\n"); + buff.append(" public boolean delete() {\r\n"); + buff.append(" return _t_.delete(this);\r\n"); + buff.append(" }\r\n"); + buff.append("}\r\n"); + // System.out.println(buff); + + // 查询器类 + qbuff.append("package ").append(packageName).append(";\r\n\r\n"); + qbuff.append("import org.lealone.orm.Query;\r\n"); + qbuff.append("import org.lealone.orm.Table;\r\n\r\n"); + for (String i : qimportSet) { + qbuff.append("import ").append(queryTypePackageName).append('.').append(i).append(";\r\n"); + } + qbuff.append("\r\n"); + qbuff.append("/**\r\n"); + qbuff.append(" * Query bean for model '").append(className).append("'.\r\n"); + qbuff.append(" *\r\n"); + qbuff.append(" * THIS IS A GENERATED OBJECT, DO NOT MODIFY THIS CLASS.\r\n"); + qbuff.append(" */\r\n"); + // 例如: public class QCustomer extends Query { + qbuff.append("public class ").append(qclassName).append(" extends Query<").append(className).append(", ") + .append(qclassName).append("> {\r\n"); + qbuff.append("\r\n"); + qbuff.append(" public static ").append(qclassName).append(" create(String url) {\r\n"); + qbuff.append(" Table t = new Table(url, \"").append(data.tableName).append("\");\r\n"); + qbuff.append(" return new ").append(qclassName).append("(t);\r\n"); + qbuff.append(" }\r\n"); + qbuff.append("\r\n"); + qbuff.append(qfields); + qbuff.append("\r\n"); + qbuff.append(" private ").append(qclassName).append("(Table t) {\r\n"); + qbuff.append(" super(t);\r\n"); + qbuff.append(" setRoot(this);\r\n"); + qbuff.append("\r\n"); + qbuff.append(qinit); + qbuff.append(" }\r\n"); + qbuff.append("}\r\n"); + // System.out.println(qbuff); + + CreateService.writeFile(codePath, packageName, className, buff); + CreateService.writeFile(codePath, packageName, qclassName, qbuff); + } + + private static final String TQ = "org.lealone.orm.typequery"; + + private static String getQueryTypeClassName(int type) { + String TQ = CreateTable.TQ + "."; + switch (type) { + case Value.BOOLEAN: + return TQ + "PBoolean"; + case Value.BYTE: + return TQ + "PByte"; + case Value.SHORT: + return TQ + "PShort"; + case Value.INT: + return TQ + "PInteger"; + case Value.LONG: + return TQ + "PLong"; + case Value.DECIMAL: + return TQ + "PBigDecimal"; + case Value.TIME: + return TQ + "PTime"; + case Value.DATE: + return TQ + "PSqlDate"; + case Value.TIMESTAMP: + return TQ + "PTimestamp"; + case Value.BYTES: + // "[B", not "byte[]"; + return byte[].class.getName(); // TODO + case Value.UUID: + return TQ + "PUuid"; + case Value.STRING: + case Value.STRING_IGNORECASE: + case Value.STRING_FIXED: + return TQ + "PString"; + case Value.BLOB: + // "java.sql.Blob"; + throw DbException.throwInternalError("type=" + type); // return java.sql.Blob.class.getName(); // TODO + case Value.CLOB: + // "java.sql.Clob"; + throw DbException.throwInternalError("type=" + type); // return java.sql.Clob.class.getName(); // TODO + case Value.DOUBLE: + return TQ + "PDouble"; + case Value.FLOAT: + return TQ + "PFloat"; + case Value.NULL: + return null; + case Value.JAVA_OBJECT: + // "java.lang.Object"; + throw DbException.throwInternalError("type=" + type); // return Object.class.getName(); // TODO + case Value.UNKNOWN: + // anything + return Object.class.getName(); + case Value.ARRAY: + return TQ + "PArray"; + case Value.RESULT_SET: + throw DbException.throwInternalError("type=" + type); // return ResultSet.class.getName(); // TODO + default: + throw DbException.throwInternalError("type=" + type); + } + } } diff --git a/lealone-test/src/test/java/org/lealone/test/UnitTestBase.java b/lealone-test/src/test/java/org/lealone/test/UnitTestBase.java index c7868c517..f67fe1b20 100644 --- a/lealone-test/src/test/java/org/lealone/test/UnitTestBase.java +++ b/lealone-test/src/test/java/org/lealone/test/UnitTestBase.java @@ -17,6 +17,11 @@ */ package org.lealone.test; +import java.sql.Connection; +import java.sql.DriverManager; +import java.sql.SQLException; +import java.sql.Statement; + //一个标记类,标识它的子类是进行单元测试的 public class UnitTestBase extends TestBase { @@ -24,4 +29,25 @@ public UnitTestBase() { initTransactionEngine(); } + public void execute(String sql) { + try (Connection conn = DriverManager.getConnection(getURL()); Statement stmt = conn.createStatement()) { + stmt.executeUpdate(sql); + } catch (SQLException e) { + e.printStackTrace(); + } + } + + public void runTest() { + try { + test(); + } catch (Exception e) { + e.printStackTrace(); + } finally { + closeTransactionEngine(); + } + } + + protected void test() throws Exception { + // do nothing + } } diff --git a/lealone-test/src/test/java/org/lealone/test/orm/CustomerTest.java b/lealone-test/src/test/java/org/lealone/test/orm/CustomerTest.java index fb1a87e59..c41e61131 100644 --- a/lealone-test/src/test/java/org/lealone/test/orm/CustomerTest.java +++ b/lealone-test/src/test/java/org/lealone/test/orm/CustomerTest.java @@ -19,42 +19,37 @@ import java.util.List; -import org.lealone.orm.Database; -import org.lealone.orm.Table; import org.lealone.test.UnitTestBase; import org.lealone.test.orm.generated.Customer; import org.lealone.test.orm.generated.QCustomer; public class CustomerTest extends UnitTestBase { - private static final String url = "jdbc:lealone:embed:test;user=root;password=root;persistent=false"; - public static void main(String[] args) { - new CustomerTest().run(); + CustomerTest t = new CustomerTest(); + t.setEmbedded(true); + t.setInMemory(true); + t.runTest(); } - private Database db; - - public void run() { + @Override + public void test() { createTable(); crud(); - db.close(); } private void createTable() { - System.out.println("create table"); - // 先建表 - db = new Database(url); - db.executeUpdate("create table customer(id long, name char(10), notes varchar, phone int)"); - - System.out.println("gen java jode"); - Table t = db.getTable("customer"); - // 生成领域模型类和查询器类的代码 - t.genJavaCode("./src/test/java", "org.lealone.test.orm.generated"); + System.out.println("create table: customer"); + + execute("create table customer(id long, name char(10), notes varchar, phone int)" // + + " package 'org.lealone.test.orm.generated'" // + + " generate code './src/test/java'"); // 生成领域模型类和查询器类的代码 } private void crud() { System.out.println("crud test"); + String url = getURL(); + System.out.println("jdbc url: " + url); // 增加两条记录 Customer.create(url).setName("Rob1").save(); diff --git a/lealone-test/src/test/java/org/lealone/test/service/ServiceProvider.java b/lealone-test/src/test/java/org/lealone/test/service/ServiceProvider.java index 15f044d0e..dc6f0ceec 100644 --- a/lealone-test/src/test/java/org/lealone/test/service/ServiceProvider.java +++ b/lealone-test/src/test/java/org/lealone/test/service/ServiceProvider.java @@ -17,14 +17,11 @@ */ package org.lealone.test.service; -import java.sql.SQLException; -import java.sql.Statement; - public class ServiceProvider { - public static void execute(Statement stmt) throws SQLException { + public static void execute(ServiceTest test) { // 创建服务: user_service - stmt.executeUpdate("create service if not exists user_service (" // + test.execute("create service if not exists user_service (" // + " add(user user) user," // 第一个user是参数名,第二个user是参数类型,第三个user是返回值类型 + " find(id long) user," // + " find_by_date(d date) user," // @@ -35,7 +32,7 @@ public static void execute(Statement stmt) throws SQLException { + " generate code './src/test/java'"); // 创建服务: hello_world_service - stmt.executeUpdate("create service hello_world_service (" // + test.execute("create service hello_world_service (" // + " say_hello() void," // + " say_goodbye_to(name varchar) varchar" // + " ) package '" + ServiceTest.packageName + ".generated'" // diff --git a/lealone-test/src/test/java/org/lealone/test/service/ServiceTest.java b/lealone-test/src/test/java/org/lealone/test/service/ServiceTest.java index 58dc0a2a1..0d9df95b7 100644 --- a/lealone-test/src/test/java/org/lealone/test/service/ServiceTest.java +++ b/lealone-test/src/test/java/org/lealone/test/service/ServiceTest.java @@ -17,12 +17,6 @@ */ package org.lealone.test.service; -import java.sql.Connection; -import java.sql.DriverManager; -import java.sql.SQLException; -import java.sql.Statement; - -import org.lealone.orm.Table; import org.lealone.test.UnitTestBase; import org.lealone.vertx.SockJSSocketServiceHandler; @@ -38,39 +32,40 @@ public class ServiceTest extends UnitTestBase { public static final String packageName = ServiceTest.class.getPackage().getName(); - private static final String url = "jdbc:lealone:embed:test;" // - + "user=root;password=root;" // - + "persistent=false;"; // - public static void main(String[] args) { - new ServiceTest().run(); + ServiceTest t = new ServiceTest(); + t.setEmbedded(true); + t.setInMemory(true); + t.runTest(); } - public void run() { + @Override + public void test() { + createTable(); createServices(); testBackendRpcServices(); // 在后端执行RPC testFrontendRpcServices(); // 在前端执行RPC } + private void createTable() { + System.out.println("create table: user"); + String packageName = ServiceTest.packageName + ".generated"; + + execute("create table user(id long, name char(10), notes varchar, phone int)" // + + " package '" + packageName + "'" // + + " generate code './src/test/java'"); // 生成领域模型类和查询器类的代码 + } + private void createServices() { - try (Connection conn = DriverManager.getConnection(url); Statement stmt = conn.createStatement()) { - System.out.println("create table"); - String packageName = ServiceTest.packageName + ".generated"; - // 创建表: user - stmt.executeUpdate("create table user(id long, name char(10), notes varchar, phone int)" // - + " package '" + packageName + "'"); - Table t = new Table(url, "user"); - t.genJavaCode("./src/test/java", packageName); - - System.out.println("create services"); - ServiceProvider.execute(stmt); - } catch (SQLException e) { - e.printStackTrace(); - } + System.out.println("create services"); + ServiceProvider.execute(this); } private void testBackendRpcServices() { System.out.println("test backend rpc services"); + String url = getURL(); + System.out.println("jdbc url: " + url); + ServiceConsumer.execute(url); }