在spring,mybatis整合配置中走的弯路(1)
在接触一个新东西,总免不了走一些弯路,也正是在这些弯路中,我们不断的成长。
从git上把之前写的代码扒下来,看看我在当初使用spring与mybatis中所走的弯路,路过的君子也可引以为戒。
<!-- 事务管理器 --> <bean id="txManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager"> <property name="dataSource" ref="dataSource" /> </bean> <!-- 事务支持 --> <tx:annotation-driven transaction-manager="txManager" /> <bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean"> <property name="dataSource" ref="dataSource" />
<!--引入mybatis的表映射配置文件-->
<property name="mapperLocations" value="classpath*:mappers/*.xml" />
<!--mybatis的一个配置文件,在这个文件里加了一个分页拦截扩展,以下贴出这个文件内容--> <property name="configLocation" value="classpath:mybatisConfig.xml"></property> </bean> <bean id="sqlSession" class="com.oa.bo.MySqlSessionFactory"> <property name="sessionFactory" ref="sqlSessionFactory"></property> 这里把sqlSessionFactory注入,后面把这部代码贴出来,看一下神一样的实现^_^ </bean>
mybatisConfig.xml
<configuration> <properties> <property name="dialect" value="MYSQL" /> </properties> <plugins> <plugin interceptor="com.oa.utils.pager.PaginationInterceptor"> 这里做一个拦截器,来处理分页的查询 </plugin> </plugins> </configuration>
MySqlSessionFactory的实现代码,不要太崇拜哟。
public class MySqlSessionFactory { static Logger log = Logger.getRootLogger(); final static String CACHENAME = ConstVar.FEREVER_CACHE; final static String CACHEKEY = "SqlSessionFactory"; private SqlSessionFactory sqlSessionFactory; public SqlSessionFactory getSessionFactory() { Object object = EhCacheUtil.getInstance().get(CACHENAME, CACHEKEY); if (object != null) { log.info("从缓存区取值"); sqlSessionFactory = (SqlSessionFactory) object; } else { log.info("没有缓存~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~!"); } return sqlSessionFactory; } public void setSessionFactory(SqlSessionFactory sqlSessionFactory) { this.sqlSessionFactory = sqlSessionFactory; log.info("对象的值:" + sqlSessionFactory); EhCacheUtil.getInstance().put(CACHENAME, CACHEKEY, sqlSessionFactory); } public SqlSession getSqlSession() { return getSessionFactory().openSession(); } }
这里把session存在ehcache永久缓存里了,明眼人一看这就有问题。但具体的问题,没有实测,没有具体数据,也就不便乱说了。
下面在每个业务逻辑上这样使用
public abstract class BaseBoImp extends MySqlSessionFactory implements BaseBo { ...... } public class SysRoleBo extends BaseBoImp { Logger log = Logger.getRootLogger(); /** * 批量删除数据 */ public ReturnResult delByIds(String ids) { SqlSession session = getSqlSession(); ...... } ....... }
所有使用的都共用上面缓存里的session。
每次自己手动关闭,事务也是手动进行管理。
这些是开始实现的一个配置,后面会进行第二阶段的弯路之行。