public class MySQLDatabaseProvider extends DatabaseProvider
DatabaseProvider.RenderFieldOptions, DatabaseProvider.SqlListener
Modifier and Type | Field and Description |
---|---|
static String |
TRUNCATE_TO_255_CHARACTERS_FUNCTION |
logger, quoteRef, sqlLogger, typeManager
Constructor and Description |
---|
MySQLDatabaseProvider(DisposableDataSource dataSource) |
Modifier and Type | Method and Description |
---|---|
protected Set<String> |
getReservedWords()
Retrieves the set of all reserved words for the underlying database.
|
boolean |
isCaseSensitive()
Flag indicating whether or not the underlying database uses case-sensitive
identifiers.
|
void |
putNull(PreparedStatement stmt,
int index)
Stores an SQL
NULL value in the database. |
protected Iterable<SQLAction> |
renderAlterTableAddColumn(NameConverters nameConverters,
DDLTable table,
DDLField field)
Generates the database-specific DDL statements required to add
a column to an existing table.
|
protected Iterable<SQLAction> |
renderAlterTableChangeColumn(NameConverters nameConverters,
DDLTable table,
DDLField oldField,
DDLField field)
Generates the database-specific DDL statements required to change
the given column from its old specification to the given DDL value.
|
protected String |
renderAppend()
Generates any database-specific options which must be appended
to the end of a table definition.
|
protected String |
renderAutoIncrement()
Generates the DDL fragment required to specify an INTEGER field as
auto-incremented.
|
protected String |
renderConstraintsForTable(UniqueNameConverter uniqueNameConverter,
DDLTable table)
Renders the foreign key constraints in database-specific DDL for
the table in question.
|
SQLAction |
renderCreateCompositeIndex(String tableName,
String indexName,
List<String> fields)
Generates the database-specific DDL statement required to create
a new composite index.
|
protected SQLAction |
renderCreateIndex(IndexNameConverter indexNameConverter,
DDLIndex index)
Generates the database-specific DDL statement required to create
a new index.
|
protected String |
renderQueryLimit(Query query)
Renders the LIMIT portion of the query in the database-specific SQL
dialect.
|
protected String |
renderUnique(UniqueNameConverter uniqueNameConverter,
DDLTable table,
DDLField field)
Renders the
UNIQUE constraint as defined by the
database-specific DDL syntax. |
_getFunctionNameForField, _getTriggerNameForField, _renderDropFunctionForField, _renderDropSequenceForField, _renderDropTriggerForField, _renderFunctionForField, _renderSequenceForField, _renderTriggerForField, addSqlListener, commitTransaction, convertTypeToString, dispose, executeInsertReturningKey, executeUpdate, executeUpdateForAction, executeUpdatesForActions, findForeignKeysForField, getConnection, getDateFormat, getImportedKeys, getIndexes, getMaxIDLength, getSchema, getSequences, getTables, getTypeManager, handleBlob, handleUpdateError, hasIndex, hasIndex, insertReturningKey, isNumericType, isSchemaNotEmpty, loadQuoteString, onSql, parseValue, preparedStatement, preparedStatement, preparedStatement, processID, processOnClause, processOrderClause, processTableName, processWhereClause, putBoolean, querySelectFields, queryTableName, quote, quoteTableName, removeSqlListener, renderAccessories, renderAccessoriesForField, renderAction, renderAlterTableAddColumnStatement, renderAlterTableAddKey, renderAlterTableChangeColumnStatement, renderAlterTableDropColumn, renderAlterTableDropColumnStatement, renderAlterTableDropKey, renderDate, renderDropAccessories, renderDropAccessoriesForField, renderDropColumnActions, renderDropIndex, renderDropTableStatement, renderField, renderFieldDefault, renderFieldOptionsInAlterColumn, renderFields, renderFieldType, renderForeignKey, renderInsert, renderMetadataQuery, renderPrimaryKey, renderQuery, renderQueryGroupBy, renderQueryHaving, renderQueryJoins, renderQueryOrderBy, renderQuerySelect, renderQueryWhere, renderTable, renderValue, rollbackTransaction, setPostConnectionProperties, setQueryResultSetProperties, setQueryStatementProperties, shorten, shouldQuoteID, shouldQuoteTableName, startTransaction, withSchema
public static final String TRUNCATE_TO_255_CHARACTERS_FUNCTION
public MySQLDatabaseProvider(DisposableDataSource dataSource)
protected String renderAutoIncrement()
DatabaseProvider
Generates the DDL fragment required to specify an INTEGER field as
auto-incremented. For databases which do not support such flags (which
is just about every database exception MySQL), ""
is an
acceptable return value. This method should never return null
as it would cause the field rendering method to throw a NullPointerException
.
renderAutoIncrement
in class DatabaseProvider
protected String renderAppend()
DatabaseProvider
Generates any database-specific options which must be appended to the end of a table definition. The only database I am aware of which requires this is MySQL. For example:
CREATE TABLE test ( id INTEGER NOT NULL AUTO_INCREMENT, name VARCHAR(45), PRIMARY KEY(id) ) ENGINE=InnoDB;
The "ENGINE=InnoDB
" clause is what is returned by
this method. The default implementation simply returns
null
, signifying that no append should be rendered.
renderAppend
in class DatabaseProvider
null
protected String renderUnique(UniqueNameConverter uniqueNameConverter, DDLTable table, DDLField field)
DatabaseProvider
UNIQUE
constraint as defined by the
database-specific DDL syntax. This method is a delegate of other, more
complex methods such as DatabaseProvider.renderField(net.java.ao.schema.NameConverters, net.java.ao.schema.ddl.DDLTable, net.java.ao.schema.ddl.DDLField, net.java.ao.DatabaseProvider.RenderFieldOptions)
. The default
implementation just returns UNIQUE
. Implementations may
override this method to return an empty String
if the database
in question does not support the constraint.renderUnique
in class DatabaseProvider
UNIQUE
.protected String renderQueryLimit(Query query)
DatabaseProvider
Renders the LIMIT portion of the query in the database-specific SQL dialect. There is wide variety in database implementations of this particular SQL clause. In fact, many database do not support it at all.
Unfortunately, we live in the real world of proprietary database implementations that requires us to use database specific keywords or semantics to achieve these outcomes. Appropriate methods should be overridden in such cases.
An example return value: " LIMIT 10,2"
There is usually no need to call this method directly. Under normal
operations it functions as a delegate for DatabaseProvider.renderQuery(Query, TableNameConverter, boolean)
.
renderQueryLimit
in class DatabaseProvider
query
- The Query instance from which to determine the LIMIT properties.protected String renderConstraintsForTable(UniqueNameConverter uniqueNameConverter, DDLTable table)
DatabaseProvider
renderConstraintsForTable
in class DatabaseProvider
table
- The database-agnostic DDL representation of the table
in question.DatabaseProvider.renderForeignKey(DDLForeignKey)
protected Iterable<SQLAction> renderAlterTableAddColumn(NameConverters nameConverters, DDLTable table, DDLField field)
DatabaseProvider
@OnUpdate
annotation, chances are there will be a trigger and possibly a
function along with the ALTER statement. These "extra"
functions are properly ordered and will only be appended if
their values are not null
. Because of this, very
few database providers will need to override this method.
Each SQLAction
should have a corresponding undo action;
these will be executed in reverse order if the action needs to
be rolled back.
renderAlterTableAddColumn
in class DatabaseProvider
table
- The table which should receive the new column.field
- The column to add to the specified table.#renderFunctionForField(net.java.ao.schema.TriggerNameConverter, net.java.ao.schema.ddl.DDLTable, net.java.ao.schema.ddl.DDLField)
,
#renderTriggerForField(net.java.ao.schema.TriggerNameConverter, net.java.ao.schema.SequenceNameConverter, net.java.ao.schema.ddl.DDLTable, net.java.ao.schema.ddl.DDLField)
protected Iterable<SQLAction> renderAlterTableChangeColumn(NameConverters nameConverters, DDLTable table, DDLField oldField, DDLField field)
DatabaseProvider
Generates the database-specific DDL statements required to change the given column from its old specification to the given DDL value. This method will also generate the appropriate statements to remove old triggers and functions, as well as add new ones according to the requirements of the new field definition.
The default implementation of this method functions in the manner specified by the MySQL database. Some databases will have to perform more complicated actions (such as dropping and re-adding the field) in order to satesfy the same use-case. Such databases should print a warning to stderr to ensure that the end-developer is aware of such restrictions.
Thus, the specification for this method allows for data loss. Nevertheless, if the database supplies a mechanism to accomplish the task without data loss, it should be applied.
For maximum flexibility, the default implementation of this method
only deals with the dropping and addition of functions and triggers.
The actual generation of the ALTER TABLE statement is done in the
DatabaseProvider.renderAlterTableChangeColumnStatement(net.java.ao.schema.NameConverters, net.java.ao.schema.ddl.DDLTable, net.java.ao.schema.ddl.DDLField, net.java.ao.schema.ddl.DDLField, net.java.ao.DatabaseProvider.RenderFieldOptions)
method.
renderAlterTableChangeColumn
in class DatabaseProvider
table
- The table containing the column to change.oldField
- The old column definition.field
- The new column definition (defining the resultant DDL). @return An array of DDL statements to be executed.#getTriggerNameForField(net.java.ao.schema.TriggerNameConverter, net.java.ao.schema.ddl.DDLTable, net.java.ao.schema.ddl.DDLField)
,
#getFunctionNameForField(net.java.ao.schema.TriggerNameConverter, net.java.ao.schema.ddl.DDLTable, net.java.ao.schema.ddl.DDLField)
,
#renderFunctionForField(net.java.ao.schema.TriggerNameConverter, net.java.ao.schema.ddl.DDLTable, net.java.ao.schema.ddl.DDLField)
,
#renderTriggerForField(net.java.ao.schema.TriggerNameConverter, net.java.ao.schema.SequenceNameConverter, net.java.ao.schema.ddl.DDLTable, net.java.ao.schema.ddl.DDLField)
protected SQLAction renderCreateIndex(IndexNameConverter indexNameConverter, DDLIndex index)
DatabaseProvider
null
returned.renderCreateIndex
in class DatabaseProvider
index
- The index to create. This single instance contains all
of the data necessary to create the index, thus no separate
parameters (such as a DDLTable
) are required.public SQLAction renderCreateCompositeIndex(String tableName, String indexName, List<String> fields)
DatabaseProvider
renderCreateCompositeIndex
in class DatabaseProvider
tableName
- The name of the database tableindexName
- The name of the new indexfields
- List of fields that make up the indexpublic void putNull(PreparedStatement stmt, int index) throws SQLException
DatabaseProvider
NULL
value in the database. This method
is required due to the fact that not all JDBC drivers handle NULLs
in the same fashion. The default implementation calls PreparedStatement.setNull(int, int)
,
retrieving parameter type from metadata. Databases which require a
different implementation (e.g. PostgreSQL) should override this method.putNull
in class DatabaseProvider
stmt
- The statement in which to store the NULL
value.index
- The index of the parameter which should be assigned NULL
.SQLException
protected Set<String> getReservedWords()
DatabaseProvider
Set
instance returned from this
method should guarentee O(1) lookup times, otherwise ORM performance
will suffer greatly.getReservedWords
in class DatabaseProvider
public boolean isCaseSensitive()
DatabaseProvider
SchemaReader
utility. The default value is true
. Note that databases which
support both case-sensetive and case-insensetive identifiers (like MySQL) should
return true
for better all-around compatibility.isCaseSensitive
in class DatabaseProvider
true
if identifiers are case-sensetive,
false
otherwise.Copyright © 2007–2020 Atlassian. All rights reserved.