Class SpringSQLSchemaUpdate

All Implemented Interfaces:
SchemaUpdate<Connection>, Aware, BeanFactoryAware, BeanNameAware, InitializingBean

public class SpringSQLSchemaUpdate extends AbstractSpringSchemaUpdate<Connection>
Spring-enabled SQL SchemaUpdate.

The 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 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 Also: