Java tutorial
/* * Copyright 2015 The Solmix Project * * This is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as * published by the Free Software Foundation; either version 2.1 of * the License, or (at your option) any later version. * * This software is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * http://www.gnu.org/licenses/ * or see the FSF site: http://www.fsf.org. */ package org.solmix.datax.mybatis; import java.io.IOException; import java.sql.Connection; import java.sql.SQLException; import java.util.LinkedHashMap; import java.util.List; import java.util.Map; import java.util.Properties; import javax.annotation.PostConstruct; import javax.sql.DataSource; import org.apache.ibatis.builder.xml.XMLConfigBuilder; import org.apache.ibatis.builder.xml.XMLMapperBuilder; import org.apache.ibatis.executor.ErrorContext; import org.apache.ibatis.mapping.DatabaseIdProvider; import org.apache.ibatis.mapping.Environment; import org.apache.ibatis.plugin.Interceptor; import org.apache.ibatis.reflection.factory.ObjectFactory; import org.apache.ibatis.reflection.wrapper.ObjectWrapperFactory; import org.apache.ibatis.session.Configuration; import org.apache.ibatis.session.ExecutorType; import org.apache.ibatis.session.SqlSession; import org.apache.ibatis.session.SqlSessionFactory; import org.apache.ibatis.session.SqlSessionFactoryBuilder; import org.apache.ibatis.session.TransactionIsolationLevel; import org.apache.ibatis.transaction.jdbc.JdbcTransactionFactory; import org.apache.ibatis.type.TypeHandler; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.solmix.commons.util.ArrayUtils; import org.solmix.commons.util.Assert; import org.solmix.commons.util.StringUtils; import org.solmix.datax.mybatis.page.PageInterceptor; import org.solmix.runtime.Container; import org.solmix.runtime.ContainerAware; import org.solmix.runtime.resource.InputStreamResource; import org.solmix.runtime.resource.ResourceManager; /** * * @author solmix.f@gmail.com * @version $Id$ 2015810 */ public class SqlSessionFactoryBean implements SqlSessionFactory, ContainerAware { private static final Logger LOGGER = LoggerFactory.getLogger(SqlSessionFactoryBean.class); private String configLocation; private List<String> mapperLocations; private DataSource dataSource; private Properties configurationProperties; private SqlSessionFactory sqlSessionFactory; private SqlSessionFactoryBuilder sqlSessionFactoryBuilder = new SqlSessionFactoryBuilder(); private Interceptor[] plugins; private TypeHandler<?>[] typeHandlers; private String typeHandlersPackage; private Class<?>[] typeAliases; private String typeAliasesPackage; private Class<?> typeAliasesSuperType; private DatabaseIdProvider databaseIdProvider; private ObjectFactory objectFactory; private ObjectWrapperFactory objectWrapperFactory; private String environment = SqlSessionFactoryBean.class.getSimpleName(); private Container container; @PostConstruct public void init() throws IOException { Assert.assertNotNull(dataSource, "datasource must be not null"); Assert.assertNotNull(sqlSessionFactoryBuilder, "SqlSessionFactoryBuilder must be not null"); this.sqlSessionFactory = buildSqlSessionFactory(); } @Override public void setContainer(Container container) { this.container = container; } /** * @return * @throws IOException */ private SqlSessionFactory buildSqlSessionFactory() throws IOException { ResourceManager rm = container.getExtension(ResourceManager.class); Configuration configuration; XMLConfigBuilder xmlConfigBuilder = null; if (this.configLocation != null) { InputStreamResource isr = rm.getResourceAsStream(configLocation); xmlConfigBuilder = new XMLConfigBuilder(isr.getInputStream(), null, this.configurationProperties); configuration = xmlConfigBuilder.getConfiguration(); } else { if (LOGGER.isDebugEnabled()) { LOGGER.debug("Property 'configLocation' not specified, using default MyBatis Configuration"); } configuration = new Configuration(); configuration.setVariables(this.configurationProperties); } if (this.objectFactory != null) { configuration.setObjectFactory(this.objectFactory); } if (this.objectWrapperFactory != null) { configuration.setObjectWrapperFactory(this.objectWrapperFactory); } if (!StringUtils.isEmpty(this.typeAliasesPackage)) { String[] typeAliasPackageArray = StringUtils.split(this.typeAliasesPackage, ","); for (String packageToScan : typeAliasPackageArray) { configuration.getTypeAliasRegistry().registerAliases(packageToScan, typeAliasesSuperType == null ? Object.class : typeAliasesSuperType); if (LOGGER.isDebugEnabled()) { LOGGER.debug("Scanned package: '" + packageToScan + "' for aliases"); } } } if (!ArrayUtils.isEmptyArray(this.typeAliases)) { for (Class<?> typeAlias : this.typeAliases) { configuration.getTypeAliasRegistry().registerAlias(typeAlias); if (LOGGER.isDebugEnabled()) { LOGGER.debug("Registered type alias: '" + typeAlias + "'"); } } } if (!ArrayUtils.isEmptyArray(this.plugins)) { for (Interceptor plugin : this.plugins) { configuration.addInterceptor(plugin); if (LOGGER.isDebugEnabled()) { LOGGER.debug("Registered plugin: '" + plugin + "'"); } } } addDefaultInterceptor(configuration); if (!StringUtils.isEmpty(this.typeHandlersPackage)) { String[] typeHandlersPackageArray = StringUtils.split(this.typeHandlersPackage, ","); for (String packageToScan : typeHandlersPackageArray) { configuration.getTypeHandlerRegistry().register(packageToScan); if (LOGGER.isDebugEnabled()) { LOGGER.debug("Scanned package: '" + packageToScan + "' for type handlers"); } } } if (!ArrayUtils.isEmptyArray(this.typeHandlers)) { for (TypeHandler<?> typeHandler : this.typeHandlers) { configuration.getTypeHandlerRegistry().register(typeHandler); if (LOGGER.isDebugEnabled()) { LOGGER.debug("Registered type handler: '" + typeHandler + "'"); } } } if (xmlConfigBuilder != null) { try { xmlConfigBuilder.parse(); if (LOGGER.isDebugEnabled()) { LOGGER.debug("Parsed configuration file: '" + this.configLocation + "'"); } } catch (Exception ex) { throw new IOException("Failed to parse config resource: " + this.configLocation, ex); } finally { ErrorContext.instance().reset(); } } configuration .setEnvironment(new Environment(this.environment, new JdbcTransactionFactory(), this.dataSource)); if (this.databaseIdProvider != null) { try { configuration.setDatabaseId(this.databaseIdProvider.getDatabaseId(this.dataSource)); } catch (SQLException e) { throw new IOException("Failed getting a databaseId", e); } } if (!ArrayUtils.isEmptyArray(this.mapperLocations)) { Map<String, InputStreamResource> resources = new LinkedHashMap<String, InputStreamResource>(); for (String mapperLocation : this.mapperLocations) { if (mapperLocation == null) { continue; } InputStreamResource[] rs = rm.getResourcesAsStream(mapperLocation); for (InputStreamResource r : rs) { resources.put(r.getURI().toString(), r); } } for (String key : resources.keySet()) { try { XMLMapperBuilder xmlMapperBuilder = new XMLMapperBuilder(resources.get(key).getInputStream(), configuration, key, configuration.getSqlFragments()); xmlMapperBuilder.parse(); } catch (Exception e) { throw new IOException("Failed to parse mapping resource: '" + key + "'", e); } finally { ErrorContext.instance().reset(); } if (LOGGER.isDebugEnabled()) { LOGGER.debug("Parsed mapper file: '" + key + "'"); } } } else { if (LOGGER.isDebugEnabled()) { LOGGER.debug("Property 'mapperLocations' was not specified or no matching resources found"); } } return this.sqlSessionFactoryBuilder.build(configuration); } /** * @param configuration */ protected void addDefaultInterceptor(Configuration configuration) { configuration.addInterceptor(new PageInterceptor()); if (LOGGER.isDebugEnabled()) { LOGGER.debug("Registered plugin: '" + PageInterceptor.class.getName() + "'"); } } public void setConfigLocation(String configLocation) { this.configLocation = configLocation; } public void setEnvironment(String environment) { this.environment = environment; } public void setMapperLocations(List<String> mapperLocations) { this.mapperLocations = mapperLocations; } public void setDataSource(DataSource dataSource) { this.dataSource = dataSource; } public void setConfigurationProperties(Properties configurationProperties) { this.configurationProperties = configurationProperties; } public void setSqlSessionFactory(SqlSessionFactory sqlSessionFactory) { this.sqlSessionFactory = sqlSessionFactory; } public void setSqlSessionFactoryBuilder(SqlSessionFactoryBuilder sqlSessionFactoryBuilder) { this.sqlSessionFactoryBuilder = sqlSessionFactoryBuilder; } public void setPlugins(Interceptor[] plugins) { this.plugins = plugins; } public void setTypeHandlers(TypeHandler<?>[] typeHandlers) { this.typeHandlers = typeHandlers; } public void setTypeHandlersPackage(String typeHandlersPackage) { this.typeHandlersPackage = typeHandlersPackage; } public void setTypeAliases(Class<?>[] typeAliases) { this.typeAliases = typeAliases; } public void setTypeAliasesPackage(String typeAliasesPackage) { this.typeAliasesPackage = typeAliasesPackage; } public void setTypeAliasesSuperType(Class<?> typeAliasesSuperType) { this.typeAliasesSuperType = typeAliasesSuperType; } public void setDatabaseIdProvider(DatabaseIdProvider databaseIdProvider) { this.databaseIdProvider = databaseIdProvider; } public void setObjectFactory(ObjectFactory objectFactory) { this.objectFactory = objectFactory; } public void setObjectWrapperFactory(ObjectWrapperFactory objectWrapperFactory) { this.objectWrapperFactory = objectWrapperFactory; } @Override public SqlSession openSession() { return sqlSessionFactory.openSession(); } @Override public SqlSession openSession(boolean autoCommit) { return sqlSessionFactory.openSession(autoCommit); } @Override public SqlSession openSession(Connection connection) { return sqlSessionFactory.openSession(connection); } @Override public SqlSession openSession(TransactionIsolationLevel level) { return sqlSessionFactory.openSession(level); } @Override public SqlSession openSession(ExecutorType execType) { return sqlSessionFactory.openSession(execType); } @Override public SqlSession openSession(ExecutorType execType, boolean autoCommit) { return sqlSessionFactory.openSession(execType, autoCommit); } @Override public SqlSession openSession(ExecutorType execType, TransactionIsolationLevel level) { return sqlSessionFactory.openSession(execType, level); } @Override public SqlSession openSession(ExecutorType execType, Connection connection) { return sqlSessionFactory.openSession(execType, connection); } @Override public Configuration getConfiguration() { return sqlSessionFactory.getConfiguration(); } }