在接觸一個新東西,總免不了走一些彎路,也正是在這些彎路中,我們不斷的成長。
從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。
每次自己手動關閉,事務也是手動進行管理。
這些是開始實現的一個配置,後面會進行第二階段的彎路之行。