All Downloads are FREE. Search and download functionalities are using the official Maven repository.

com.ext_ext.mybatisext.SqlSessionFactoryBeanExt Maven / Gradle / Ivy

package com.ext_ext.mybatisext;

import java.io.IOException;
import java.lang.reflect.Field;

import org.apache.ibatis.logging.Log;
import org.apache.ibatis.logging.LogFactory;
import org.apache.ibatis.session.Configuration;
import org.apache.ibatis.session.SqlSessionFactory;
import org.mybatis.spring.SqlSessionFactoryBean;

import com.ext_ext.mybatisext.helper.SmartDate;
import com.ext_ext.mybatisext.helper.SmartDateTypeHandler;
import com.ext_ext.mybatisext.helper.SqlSessionFactoryHolder;
import com.ext_ext.mybatisext.interceptor.MyBatisInterceptor;

/**
 * @author songrubo
 * @version 2013年11月30日 下午1:11:48 扩展功能,mapper文件自动加载,空resultMap自动配置,mapper拦截
 */
public class SqlSessionFactoryBeanExt extends SqlSessionFactoryBean {

	private static final Log logger = LogFactory.getLog(SqlSessionFactoryBeanExt.class);

	private final Class superClass;

	private SqlSessionFactory sqlSessionFactory;

	private MyBatisInterceptor[] interceptors;


	public SqlSessionFactoryBeanExt() {
		superClass = SqlSessionFactoryBean.class;

	}


	public void setValue( String name, Object value ) {
		try {
			Field field = superClass.getDeclaredField(name);
			field.setAccessible(true);
			field.set(this, value);
		} catch ( Exception e ) {
			logger.error(e.getMessage(), e);
		}
	}


	@Override
	protected SqlSessionFactory buildSqlSessionFactory() throws IOException {
		SqlSessionFactory factory = super.buildSqlSessionFactory();

		try {
			Configuration config = factory.getConfiguration();
			Class classConfig = Configuration.class;
			// 拦截
			Field field = classConfig.getDeclaredField("mapperRegistry");
			field.setAccessible(true);
			field.set(config, new MapperRegistryExt(config, interceptors));
			// 日期格式处理
			config.getTypeHandlerRegistry().register(java.util.Date.class, SmartDateTypeHandler.class);
			config.getTypeHandlerRegistry().register(java.sql.Date.class, SmartDateTypeHandler.class);
			config.getTypeHandlerRegistry().register(SmartDate.class, SmartDateTypeHandler.class);
		} catch ( Exception e ) {
			logger.error(e.getMessage(), e);
		}
		return factory;
	}


	@Override
	public SqlSessionFactory getObject() throws Exception {
		if ( sqlSessionFactory == null ) {
			sqlSessionFactory = buildSqlSessionFactory();
			setValue("sqlSessionFactory", sqlSessionFactory);
			SqlSessionFactoryHolder.setSqlSessionFactory(sqlSessionFactory);
		}
		return sqlSessionFactory;
	}


	@Override
	public void afterPropertiesSet() throws Exception {
		// 重写,解决初始化两次的bug
	}


	public MyBatisInterceptor[] getInterceptors() {
		return interceptors;
	}


	public void setInterceptors( MyBatisInterceptor[] interceptors ) {
		this.interceptors = interceptors;
	}


}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy