
org.dellroad.stuff.spring.SpringSQLSchemaUpdate Maven / Gradle / Ivy
Show all versions of dellroad-stuff-spring Show documentation
/*
* Copyright (C) 2011 Archie L. Cobbs. All rights reserved.
*/
package org.dellroad.stuff.spring;
import java.sql.Connection;
import java.util.ArrayList;
import java.util.List;
import org.dellroad.stuff.schema.DatabaseAction;
import org.dellroad.stuff.schema.SQLCommandList;
/**
* Spring-enabled SQL {@link org.dellroad.stuff.schema.SchemaUpdate}.
*
*
* The {@link #setSQLCommandList sqlCommandList} property is required.
*
*
* Instances can be created succintly in Spring using the <dellroad-stuff:sql-update>
custom XML element,
* which works just like <dellroad-stuff:sql>
except that it wraps the resulting {@link SQLCommandList}
* as a delegate inside an instance of this class.
*
*
* For example:
*
* <beans xmlns="http://www.springframework.org/schema/beans"
* xmlns:dellroad-stuff="http://dellroad-stuff.googlecode.com/schema/dellroad-stuff"
* xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
* xsi:schemaLocation="
* http://www.springframework.org/schema/beans
* http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
* http://dellroad-stuff.googlecode.com/schema/dellroad-stuff
* http://dellroad-stuff.googlecode.com/svn/wiki/schemas/dellroad-stuff-1.0.xsd">
*
* <!-- Schema update to add the 'phone' column to the 'User' table -->
* <dellroad-stuff:sql-update id="addPhone">ALTER TABLE User ADD phone VARCHAR(64)</dellroad-stuff:sql-update>
*
* <!-- Schema update to run some complicated external SQL script -->
* <dellroad-stuff:sql-update id="majorChanges" depends-on="addPhone" resource="classpath:majorChanges.sql"/>
*
* <!-- more beans... -->
*
* </beans>
*
*
*
* A multi-statement SQL script is normally treated as a set of individual updates. For example:
*
* <dellroad-stuff:sql-update id="renameColumn">
* ALTER TABLE User ADD newName VARCHAR(64);
* ALTER TABLE User SET newName = oldName;
* ALTER TABLE User DROP oldName;
* </dellroad-stuff:sql-update>
*
* This will create three separate update beans named renameColumn-00001
, renameColumn-00002
, and
* renameColumn-00003
. You can disable this behavior by adding the attribute single-action="true"
,
* in which case all three of the statements will be executed together in the same transaction and recorded under the name
* renameColumn
; this means that they must all complete successfully or you could end up with a partially
* completed update.
*
*
* Note that if the nested SQL script only contains one SQL statement, any single-action
attribute is
* ignored and the bean's given name (e.g., renameColumn
) is always used as the name of the single update.
*
* @see SQLCommandList
*/
public class SpringSQLSchemaUpdate extends AbstractSpringSchemaUpdate {
private SQLCommandList sqlCommandList;
@Override
public void afterPropertiesSet() throws Exception {
super.afterPropertiesSet();
if (this.sqlCommandList == null)
throw new Exception("no SQLCommandList configured");
}
/**
* Configure the {@link SQLCommandList}. This is a required property.
*
* @param sqlCommandList list of SQL statements that perform this update
* @see DatabaseAction
*/
public void setSQLCommandList(SQLCommandList sqlCommandList) {
this.sqlCommandList = sqlCommandList;
}
public SQLCommandList getSQLCommandList() {
return this.sqlCommandList;
}
@Override
public List> getDatabaseActions() {
return new ArrayList>(this.getSQLCommandList().split());
}
}