在我编写之前,是否有用于操作数据库的Java API。就像java.sql.DatabaseMetaData
周围的面向对象的包装一样,支持Schema.createTable(name, columns)
?
显然,正确的SQL语句应该在后台根据使用的DB执行。
我对用于执行DDL语句的API特别感兴趣。
答案 0 :(得分:2)
许多对象关系映射框架都带有工具,可以从现有模式生成域模型类,或创建(甚至更新)模式以匹配域模型类。
特别是,hibernate可以这样做,参见
http://docs.jboss.org/hibernate/core/3.6/reference/en-US/html_single/#toolsetguide-s1
答案 1 :(得分:1)
据我所知,某些工具(如NetBeans)可以即时创建/修改数据库模式。如果找不到特定的库,可以查看源代码。
答案 2 :(得分:1)
您是否考虑过直接的JDBC调用?
出于控制和安全原因,我喜欢分别将DDL和DML与ORM和JDBC分开。这允许经验较少的编码人员专注于数据操作(通过休眠)。
可能只是我的“老派”偏见......
Hibernate可以执行一些DDL功能,但我没有广泛使用它。我认为它不能动态创建表(例如在正在运行的现有数据库上)。
public static void createEmployees()
{
Connection con = getConnection();
String createString;
createString = "create table Employees (" +
"Employee_ID INTEGER, " +
"Name VARCHAR(30))";
try {
stmt = con.createStatement();
stmt.executeUpdate(createString);
stmt.close();
con.close();
} catch(SQLException ex) {
System.err.println("SQLException: " + ex.getMessage());
}
JOptionPane.showMessageDialog(null,"Employees Table Created");
}
答案 3 :(得分:1)
Java API for DDL in SQL: I've had to build one for my project, so I've published it as open-source: https://bitbucket.org/aragot/play-sql-dialects (APL2 license)
The license says it's ok to derive and include in a project for sale, as long as you respect the terms.
There's only a full dialect for PostgreSQL. Please feel free to contribute support for MySQL or Oracle. The unfortunate part is, Oracle and MySQL don't support transactional DDL, so in case of exception you need to recover the state of the database, which is the reason I didn't bother.
Example:
if (rDialect.hasSchema("schema_test")) {
rDialect.dropSchema("schema_test");
}
rDialect.createSchema("schema_test");
rDialect.setDefaultSchema("schema_test");
DDLColumn colID = new DDLColumn("ID", "#", null, null, null, DDLColumn.DataType.INTEGER, null, null, null);
DDLColumn colPOSITION = new DDLColumn("POSITION", "POSITION", null, null, null, DDLColumn.DataType.TEXT, null, null, null);
DDLColumn column1 = new DDLColumn("COL1", "Column 1", null, "integer-renderer", null, DDLColumn.DataType.INTEGER, null, null, null);
DDLColumn column2 = new DDLColumn("COL2", "Column 2", null, "as-string", null, DDLColumn.DataType.TEXT, null, null, null);
DDLTable table = new DDLTable(true, "test1", "Test 1", colID, colPOSITION, column1, column2);
rDialect.createTable(table);
答案 4 :(得分:1)
来自Apache的DdlUtils执行此操作https://db.apache.org/ddlutils/
答案 5 :(得分:0)
我一直认为,如果您为SQL使用预准备语句,那么您可以毫不费力地更改数据库连接器并切换到另一个具有相关JDBC连接器的数据库。
答案 6 :(得分:0)
我们正在使用Pentaho数据集成(ex-Kettle)取得了一些成功,尽管Community Edition API的文档记录很少。它可能需要一些黑客攻击,但它提供的抽象和许多功能可能是值得的。