Java tutorial
/******************************************************************************* * Copyright (c) 2010 PSS Corporation and others. * All rights reserved. This program and the accompanying materials * are made available under the terms of the Eclipse Public License v1.0 * which accompanies this distribution, and is available at * http://www.eclipse.org/legal/epl-v10.html * * Contributors: * PSS Corporation - initial API and implementation *******************************************************************************/ package org.pssframework.dao; import java.io.IOException; import java.io.InputStreamReader; import java.io.Reader; import java.util.HashMap; import java.util.Map; import javax.sql.DataSource; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.apache.ibatis.builder.xml.XMLMapperBuilder; import org.apache.ibatis.mapping.Environment; import org.apache.ibatis.parsing.XNode; import org.apache.ibatis.session.Configuration; import org.apache.ibatis.session.SqlSessionFactory; import org.apache.ibatis.session.SqlSessionFactoryBuilder; import org.apache.ibatis.transaction.managed.ManagedTransactionFactory; import org.springframework.beans.factory.FactoryBean; import org.springframework.beans.factory.InitializingBean; import org.springframework.core.io.Resource; import org.springframework.jdbc.datasource.TransactionAwareDataSourceProxy; import org.springframework.util.Assert; public class SqlSessionFactoryFactoryBean implements FactoryBean, InitializingBean { Log logger = LogFactory.getLog(SqlSessionFactoryFactoryBean.class); private Resource configLocation; private Resource[] mapperLocations; private DataSource dataSource; private boolean useTransactionAwareDataSource = true; SqlSessionFactory sqlSessionFactory; public void afterPropertiesSet() throws Exception { Assert.notNull(configLocation, "configLocation must be not null"); sqlSessionFactory = createSqlSessionFactory(); } private SqlSessionFactory createSqlSessionFactory() throws IOException { Reader reader = new InputStreamReader(getConfigLocation().getInputStream()); try { SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(reader); Configuration conf = sqlSessionFactory.getConfiguration(); if (dataSource != null) { DataSource dataSourceToUse = this.dataSource; if (this.useTransactionAwareDataSource && !(this.dataSource instanceof TransactionAwareDataSourceProxy)) { dataSourceToUse = new TransactionAwareDataSourceProxy(this.dataSource); } conf.setEnvironment( new Environment("development", new ManagedTransactionFactory(), dataSourceToUse)); sqlSessionFactory = new SqlSessionFactoryBuilder().build(conf); } if (mapperLocations != null) { Map<String, XNode> sqlFragments = new HashMap<String, XNode>(); for (Resource r : mapperLocations) { logger.info("Loading iBatis3 mapper xml from file[" + r.getFile().getAbsolutePath() + "]"); Reader mapperReader = new InputStreamReader(r.getInputStream()); try { XMLMapperBuilder mapperBuilder = new XMLMapperBuilder(mapperReader, conf, r.getFile().getAbsolutePath(), sqlFragments); mapperBuilder.parse(); } finally { mapperReader.close(); } } } return sqlSessionFactory; } finally { reader.close(); } } public Object getObject() throws Exception { return sqlSessionFactory; } public DataSource getDataSource() { return dataSource; } public void setDataSource(DataSource dataSource) { this.dataSource = dataSource; } public Class<?> getObjectType() { return SqlSessionFactory.class; } public boolean isSingleton() { return true; } public Resource getConfigLocation() { return configLocation; } public void setConfigLocation(Resource configurationFile) { this.configLocation = configurationFile; } public void setMapperLocations(Resource[] mapperLocations) { this.mapperLocations = mapperLocations; } }