diff --git a/src/main/java/org/mybatis/spring/SqlSessionFactoryBean.java b/src/main/java/org/mybatis/spring/SqlSessionFactoryBean.java index c42679fae9..1674a2de99 100644 --- a/src/main/java/org/mybatis/spring/SqlSessionFactoryBean.java +++ b/src/main/java/org/mybatis/spring/SqlSessionFactoryBean.java @@ -36,6 +36,7 @@ import org.apache.ibatis.plugin.Interceptor; import org.apache.ibatis.reflection.factory.ObjectFactory; import org.apache.ibatis.reflection.wrapper.ObjectWrapperFactory; +import org.apache.ibatis.scripting.LanguageDriver; import org.apache.ibatis.session.Configuration; import org.apache.ibatis.session.SqlSessionFactory; import org.apache.ibatis.session.SqlSessionFactoryBuilder; @@ -125,6 +126,10 @@ public class SqlSessionFactoryBean private Class typeAliasesSuperType; + private LanguageDriver[] scriptingLanguageDrivers; + + private Class defaultScriptingLanguageDriver; + // issue #19. No default provider. private DatabaseIdProvider databaseIdProvider; @@ -435,6 +440,28 @@ public void setEnvironment(String environment) { this.environment = environment; } + /** + * Set scripting language drivers. + * + * @param scriptingLanguageDrivers + * scripting language drivers + * @since 2.0.2 + */ + public void setScriptingLanguageDrivers(LanguageDriver... scriptingLanguageDrivers) { + this.scriptingLanguageDrivers = scriptingLanguageDrivers; + } + + /** + * Set a default scripting language driver class. + * + * @param defaultScriptingLanguageDriver + * A default scripting language driver class + * @since 2.0.2 + */ + public void setDefaultScriptingLanguageDriver(Class defaultScriptingLanguageDriver) { + this.defaultScriptingLanguageDriver = defaultScriptingLanguageDriver; + } + /** * {@inheritDoc} */ @@ -519,6 +546,15 @@ protected SqlSessionFactory buildSqlSessionFactory() throws Exception { }); } + if (!isEmpty(this.scriptingLanguageDrivers)) { + Stream.of(this.scriptingLanguageDrivers).forEach(languageDriver -> { + targetConfiguration.getLanguageRegistry().register(languageDriver); + LOGGER.debug(() -> "Registered scripting language driver: '" + languageDriver + "'"); + }); + } + Optional.ofNullable(this.defaultScriptingLanguageDriver) + .ifPresent(targetConfiguration::setDefaultScriptingLanguage); + if (this.databaseIdProvider != null) {// fix #64 set databaseId before parse mapper xmls try { targetConfiguration.setDatabaseId(this.databaseIdProvider.getDatabaseId(this.dataSource)); diff --git a/src/test/java/org/mybatis/spring/SqlSessionFactoryBeanTest.java b/src/test/java/org/mybatis/spring/SqlSessionFactoryBeanTest.java index abcb81d70e..27a156e346 100644 --- a/src/test/java/org/mybatis/spring/SqlSessionFactoryBeanTest.java +++ b/src/test/java/org/mybatis/spring/SqlSessionFactoryBeanTest.java @@ -29,6 +29,10 @@ import org.apache.ibatis.reflection.factory.ObjectFactory; import org.apache.ibatis.reflection.wrapper.DefaultObjectWrapperFactory; import org.apache.ibatis.reflection.wrapper.ObjectWrapperFactory; +import org.apache.ibatis.scripting.LanguageDriver; +import org.apache.ibatis.scripting.LanguageDriverRegistry; +import org.apache.ibatis.scripting.defaults.RawLanguageDriver; +import org.apache.ibatis.scripting.xmltags.XMLLanguageDriver; import org.apache.ibatis.session.Configuration; import org.apache.ibatis.session.ExecutorType; import org.apache.ibatis.session.SqlSessionFactory; @@ -440,6 +444,42 @@ void testAddCache() { assertThat(this.factoryBean.getCache().getId()).isEqualTo("test-cache"); } + @Test + void testScriptingLanguageDriverEmpty() throws Exception { + setupFactoryBean(); + this.factoryBean.setScriptingLanguageDrivers(); + LanguageDriverRegistry registry = this.factoryBean.getObject().getConfiguration().getLanguageRegistry(); + assertThat(registry.getDefaultDriver()).isInstanceOf(XMLLanguageDriver.class); + assertThat(registry.getDefaultDriverClass()).isEqualTo(XMLLanguageDriver.class); + } + + @Test + void testScriptingLanguageDriver() throws Exception { + setupFactoryBean(); + this.factoryBean.setScriptingLanguageDrivers(new MyLanguageDriver1(), new MyLanguageDriver2()); + LanguageDriverRegistry registry = this.factoryBean.getObject().getConfiguration().getLanguageRegistry(); + assertThat(registry.getDefaultDriver()).isInstanceOf(XMLLanguageDriver.class); + assertThat(registry.getDefaultDriverClass()).isEqualTo(XMLLanguageDriver.class); + assertThat(registry.getDriver(MyLanguageDriver1.class)).isNotNull(); + assertThat(registry.getDriver(MyLanguageDriver2.class)).isNotNull(); + assertThat(registry.getDriver(XMLLanguageDriver.class)).isNotNull(); + assertThat(registry.getDriver(RawLanguageDriver.class)).isNotNull(); + } + + @Test + void testScriptingLanguageDriverWithDefault() throws Exception { + setupFactoryBean(); + this.factoryBean.setScriptingLanguageDrivers(new MyLanguageDriver1(), new MyLanguageDriver2()); + this.factoryBean.setDefaultScriptingLanguageDriver(MyLanguageDriver1.class); + LanguageDriverRegistry registry = this.factoryBean.getObject().getConfiguration().getLanguageRegistry(); + assertThat(registry.getDefaultDriver()).isInstanceOf(MyLanguageDriver1.class); + assertThat(registry.getDefaultDriverClass()).isEqualTo(MyLanguageDriver1.class); + assertThat(registry.getDriver(MyLanguageDriver1.class)).isNotNull(); + assertThat(registry.getDriver(MyLanguageDriver2.class)).isNotNull(); + assertThat(registry.getDriver(XMLLanguageDriver.class)).isNotNull(); + assertThat(registry.getDriver(RawLanguageDriver.class)).isNotNull(); + } + private void assertDefaultConfig(SqlSessionFactory factory) { assertConfig(factory, SqlSessionFactoryBean.class.getSimpleName(), org.mybatis.spring.transaction.SpringManagedTransactionFactory.class); @@ -464,4 +504,10 @@ private void assertConfig(SqlSessionFactory factory, String environment, assertThat(factory.getConfiguration().getSqlFragments().size()).isEqualTo(0); } + private static class MyLanguageDriver1 extends RawLanguageDriver { + } + + private static class MyLanguageDriver2 extends RawLanguageDriver { + } + }