Myibatis和spring的集成(與事務配置) 二

[color=brown]昨天已經把主要的類和配置文件貼上了,今天來分析一下,我也是從用ibatis再到MyIbatis

用過來的,MyBatis 的前身就是 iBatis 兩者還很有區別,也有很大的改進,MyBatis 對
sql的支持更好,更加靈活.

1.如何和spring集成到一起?

第一步肯定是在applicationContext.xml中增加相應的配置,有spring容器來管理

Myibatis,那麼這個jar是必不可少的 mybatis-spring-1.0.1-SNAPSHOT.jar由於

Spring 3.0僅支持 iBatis2。那麼,我們就想將 MyBatis3 的支持添加到 Spring3.0

中。不幸的是,Spring 3.0 的開發在 MyBatis 3.0 官方發佈前就結束了。所以這個jar

不是spring官方的,應該是MyBatis團隊的後續開發的在 MyBatis-Spring 中,

SqlSessionFactoryBean 是用於創建 SqlSessionFactory 的。要配置這個工bean,

放置下面的代碼在 Spring 的 applicationContext.xml 配置文件中[/color]



<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
<property name="dataSource" ref="dataSource" />
<property name="configLocation" value="classpath:/config/ibatisConfig.xml" />
<property name="typeAliasesPackage" value="com.ibatis.model" />
<property name="mapperLocations" value="classpath*:com/ibatis/mapper/*.xml" />
</bean>

<bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
<property name="basePackage" value="com.ibatis.dao" />
</bean>

[color=brown]要注意 SqlSessionFactory 需要一個 DataSource,這可以是任意的 DataSource,配置它就和配置其它 Spring 數據庫連接一樣SqlSessionFactoryBean 實現了 Spring 的 FactoryBean 接口,這就說明由 Spring 最終創建的 bean不是SessionFactoryBean 本身,而是工廠類的 getObject()返回的方法的結果。這種情況下,Spring 將會在應用啓動時爲你創建 SqlSessionFactory 對象,然後將它以 SqlSessionFactory 爲名來存儲.

在一般的 MyBatis-Spring 用法中,你不需要直接使用 SqlSessionFactoryBean 或和其對應的 SqlSessionFactory。相反,session 工廠將會被注入到apperFactoryBean 或其它擴展了 SqlSessionDaoSupport 的 DAO

[b]SqlSessionFactory的幾個主要屬性:[/b]
有一個單獨的必須屬性,就是 JDBC 的 DataSource。這可以是任意的 DataSource,其配置應該和其它 Spring 數據庫連接是一樣的。 一個通用的屬性是 configLocation,它是用來指定 MyBatis 的 XML 配置文件路徑的。如果基本的MyBatis 配置需要改變,那麼這就是一個需要它的地方。通常這會是<settings>或<typeAliases>的部分。要注意這個配置文件不需要是一個完整的 MyBatis 配置。確定地說,任意環境,數據源和 MyBatis 的事務管理器都會被忽略SqlSessionFactoryBean 會創建它自己的,使用這些值定製 MyBatis 的 Environment 時是需要的。如果yBatis 映射器 XML 文件在和映射器類相同的路徑下不存在,那麼另外一個需要配置文件的原因就是它了。使用這個配置,有兩種選擇。第一是手動在 MyBatis 的 XML 配置文件中使用<mappers>部分來指定類路徑。第二是使用工廠 bean 的 mapperLocations 屬性。

[b]屬性mapperLocations [/b]
使用一個資源位置的 list。這個屬性可以用來指定 MyBatis 的 XML映射器文件的位置。它的值可以包含 Ant 樣式來加載一個目錄中所有文件,或者從基路徑下遞歸搜索所有路徑。classpath*:com/ibatis/mapper/*.xml

[b]屬性typeAliasesPackage[/b]
從名字看來是[類型的別名]包,猜也就是把這個包下面的類默認生成一個別名,就類名全稱,配置這個以後,在以後我們的映射文件*Mapper.xml中就可以使用它,不用在 resultType="com.*.*.Person"什麼的,可以直接使用類名即可,
resultType="Person".

[b]屬性configLocation[/b]
是用來加載mybatis-config.xml文件(文件名可以任意)用來修改一些Myibatis的默認屬性和核心配置,比如我們在用到存儲過程時候返回的遊標[CURSOR],但是我們想把這個遊標變成一個List<Map<String,Object>>的集合,那麼我可以寫個類來繼承BaseTypeHandler這個類來實現處理,方法如下:
在mybatis-config.xml 添加
[/color]

<typeHandlers>
<typeHandler javaType="Map" jdbcType="CURSOR" handler="com.ibatis.typeHandler.ResultSetTypeHandler"/>
</typeHandlers>


那麼,ResultSetTypeHandler這個類就是具體的實現代碼如下:

package com.ibatis.typeHandler;


import java.sql.CallableStatement;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.ResultSetMetaData;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import org.apache.commons.lang.StringUtils;
import org.apache.ibatis.type.BaseTypeHandler;
import org.apache.ibatis.type.JdbcType;

/**
* 存儲過程的遊標解析器
* @author wujj
*/
public class ResultSetTypeHandler extends BaseTypeHandler<List<Map<String, Object>>> {

@Override
public List<Map<String, Object>> getNullableResult(ResultSet arg0, String arg1) throws SQLException {
return null;
}

@Override
public List<Map<String, Object>> getNullableResult(CallableStatement cs, int columnIndex) throws SQLException {

List<Map<String, Object>> result = new ArrayList<Map<String, Object>>();

ResultSet rs = (ResultSet) cs.getObject(columnIndex);

if (!rs.isClosed()) {

ResultSetMetaData data = rs.getMetaData();
int columnCnt = data.getColumnCount();

while (rs.next()) {
Map<String, Object> rowMap = new HashMap<String, Object>();
for (int i = 1; i <= columnCnt; i++) {
String colName = data.getColumnName(i).toLowerCase();
Object colValue = rs.getObject(colName);
// TODO 類型處理
rowMap.put(colName, colValue == null ? StringUtils.EMPTY : colValue.toString());
}
result.add(rowMap);
}
}

return result;
}

@Override
public void setNonNullParameter(PreparedStatement arg0, int arg1, List<Map<String, Object>> arg2, JdbcType arg3) throws SQLException {
}

}

還可以用添加一寫類似於攔截器的功能,比如在某個Service執行update時候攔截,等等...
今天先寫到這裏,這個是sqlSessionFactory 裏面主要屬性的介紹.明天繼續....
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章