📄 sqlbuilder.java
字号:
if ((table.getName() != null) &&
(table.getName().length() > 0))
{
dropExternalForeignKeys(table);
}
}
// Next we drop the tables in reverse order to avoid referencial problems
// TODO: It might be more useful to either (or both)
// * determine an order in which the tables can be dropped safely (via the foreignkeys)
// * alter the tables first to drop the internal foreignkeys
for (int idx = database.getTableCount() - 1; idx >= 0; idx--)
{
Table table = database.getTable(idx);
if ((table.getName() != null) &&
(table.getName().length() > 0))
{
writeTableComment(table);
dropTable(table);
}
}
}
/**
* Outputs the DDL required to drop the given table. This method also
* drops foreign keys to the table.
*
* @param database The database
* @param table The table
*/
public void dropTable(Database database, Table table) throws IOException
{
// we're dropping the foreignkeys to the table first
for (int idx = database.getTableCount() - 1; idx >= 0; idx--)
{
Table otherTable = database.getTable(idx);
ForeignKey[] fks = otherTable.getForeignKeys();
for (int fkIdx = 0; (fks != null) && (fkIdx < fks.length); fkIdx++)
{
if (fks[fkIdx].getForeignTable().equals(table))
{
writeExternalForeignKeyDropStmt(otherTable, fks[fkIdx]);
}
}
}
// and the foreign keys from the table
dropExternalForeignKeys(table);
writeTableComment(table);
dropTable(table);
}
/**
* Outputs the DDL to drop the table. Note that this method does not drop
* foreign keys to this table. Use {@link #dropTable(Database, Table)}
* if you want that.
*
* @param table The table to drop
*/
public void dropTable(Table table) throws IOException
{
print("DROP TABLE ");
printIdentifier(getTableName(table));
printEndOfStatement();
}
/**
* Creates external foreignkey drop statements.
*
* @param table The table
*/
public void dropExternalForeignKeys(Table table) throws IOException
{
if (!getPlatformInfo().isForeignKeysEmbedded())
{
for (int idx = 0; idx < table.getForeignKeyCount(); idx++)
{
writeExternalForeignKeyDropStmt(table, table.getForeignKey(idx));
}
}
}
/**
* Creates the SQL for inserting an object into the specified table.
* If values are given then a concrete insert statement is created, otherwise an
* insert statement usable in a prepared statement is build.
*
* @param table The table
* @param columnValues The columns values indexed by the column names
* @param genPlaceholders Whether to generate value placeholders for a
* prepared statement
* @return The insertion sql
*/
public String getInsertSql(Table table, Map columnValues, boolean genPlaceholders)
{
StringBuffer buffer = new StringBuffer("INSERT INTO ");
boolean addComma = false;
buffer.append(getDelimitedIdentifier(getTableName(table)));
buffer.append(" (");
for (int idx = 0; idx < table.getColumnCount(); idx++)
{
Column column = table.getColumn(idx);
if (columnValues.containsKey(column.getName()))
{
if (addComma)
{
buffer.append(", ");
}
buffer.append(getDelimitedIdentifier(column.getName()));
addComma = true;
}
}
buffer.append(") VALUES (");
if (genPlaceholders)
{
addComma = false;
for (int idx = 0; idx < columnValues.size(); idx++)
{
if (addComma)
{
buffer.append(", ");
}
buffer.append("?");
addComma = true;
}
}
else
{
addComma = false;
for (int idx = 0; idx < table.getColumnCount(); idx++)
{
Column column = table.getColumn(idx);
if (columnValues.containsKey(column.getName()))
{
if (addComma)
{
buffer.append(", ");
}
buffer.append(getValueAsString(column, columnValues.get(column.getName())));
addComma = true;
}
}
}
buffer.append(")");
return buffer.toString();
}
/**
* Creates the SQL for updating an object in the specified table.
* If values are given then a concrete update statement is created, otherwise an
* update statement usable in a prepared statement is build.
*
* @param table The table
* @param columnValues Contains the values for the columns to update, and should also
* contain the primary key values to identify the object to update
* in case <code>genPlaceholders</code> is <code>false</code>
* @param genPlaceholders Whether to generate value placeholders for a
* prepared statement (both for the pk values and the object values)
* @return The update sql
*/
public String getUpdateSql(Table table, Map columnValues, boolean genPlaceholders)
{
StringBuffer buffer = new StringBuffer("UPDATE ");
boolean addSep = false;
buffer.append(getDelimitedIdentifier(getTableName(table)));
buffer.append(" SET ");
for (int idx = 0; idx < table.getColumnCount(); idx++)
{
Column column = table.getColumn(idx);
if (!column.isPrimaryKey() && columnValues.containsKey(column.getName()))
{
if (addSep)
{
buffer.append(", ");
}
buffer.append(getDelimitedIdentifier(column.getName()));
buffer.append(" = ");
if (genPlaceholders)
{
buffer.append("?");
}
else
{
buffer.append(getValueAsString(column, columnValues.get(column.getName())));
}
addSep = true;
}
}
buffer.append(" WHERE ");
addSep = false;
for (int idx = 0; idx < table.getColumnCount(); idx++)
{
Column column = table.getColumn(idx);
if (column.isPrimaryKey() && columnValues.containsKey(column.getName()))
{
if (addSep)
{
buffer.append(" AND ");
}
buffer.append(getDelimitedIdentifier(column.getName()));
buffer.append(" = ");
if (genPlaceholders)
{
buffer.append("?");
}
else
{
buffer.append(getValueAsString(column, columnValues.get(column.getName())));
}
addSep = true;
}
}
return buffer.toString();
}
/**
* Creates the SQL for deleting an object from the specified table.
* If values are given then a concrete delete statement is created, otherwise an
* delete statement usable in a prepared statement is build.
*
* @param table The table
* @param pkValues The primary key values indexed by the column names, can be empty
* @param genPlaceholders Whether to generate value placeholders for a
* prepared statement
* @return The delete sql
*/
public String getDeleteSql(Table table, Map pkValues, boolean genPlaceholders)
{
StringBuffer buffer = new StringBuffer("DELETE FROM ");
boolean addSep = false;
buffer.append(getDelimitedIdentifier(getTableName(table)));
if ((pkValues != null) && !pkValues.isEmpty())
{
buffer.append(" WHERE ");
for (Iterator it = pkValues.entrySet().iterator(); it.hasNext();)
{
Map.Entry entry = (Map.Entry)it.next();
Column column = table.findColumn((String)entry.getKey());
if (addSep)
{
buffer.append(" AND ");
}
buffer.append(getDelimitedIdentifier(entry.getKey().toString()));
buffer.append(" = ");
if (genPlaceholders)
{
buffer.append("?");
}
else
{
buffer.append(column == null ? entry.getValue() : getValueAsString(column, entry.getValue()));
}
addSep = true;
}
}
return buffer.toString();
}
/**
* Generates the string representation of the given value.
*
* @param column The column
* @param value The value
* @return The string representation
*/
protected String getValueAsString(Column column, Object value)
{
if (value == null)
{
return "NULL";
}
StringBuffer result = new StringBuffer();
// TODO: Handle binary types (BINARY, VARBINARY, LONGVARBINARY, BLOB)
switch (column.getTypeCode())
{
case Types.DATE:
result.append(getPlatformInfo().getValueQuoteToken());
if (!(value instanceof String) && (getValueDateFormat() != null))
{
// TODO: Can the format method handle java.sql.Date properly ?
result.append(getValueDateFormat().format(value));
}
else
{
result.append(value.toString());
}
result.append(getPlatformInfo().getValueQuoteToken());
break;
case Types.TIME:
result.append(getPlatformInfo().getValueQuoteToken());
if (!(value instanceof String) && (getValueTimeFormat() != null))
{
// TODO: Can the format method handle java.sql.Date properly ?
result.append(getValueTimeFormat().format(value));
}
else
{
result.append(value.toString());
}
result.append(getPlatformInfo().getValueQuoteToken());
break;
case Types.TIMESTAMP:
result.append(getPlatformInfo().getValueQuoteToken());
// TODO: SimpleDateFormat does not support nano seconds so we would
// need a custom date formatter for timestamps
result.append(value.toString());
result.append(getPlatformInfo().getValueQuoteToken());
break;
case Types.REAL:
case Types.NUMERIC
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -