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: