mybatis+spring+struts2框架整合

jopen 8年前發布 | 30K 次閱讀 JEE框架

1、MyBatis-Spring簡介:

MyBatis-Spring幫助你無縫地整合MyBatis代碼到Spring中。使用這個類庫中的類,Spring將會加載必要的MyBatis工廠類和session 類。

這個類庫也提供一個簡單的方式來注入MyBatis數據映射器和SqlSession到業務層的bean中。而且它也會處理事務,翻譯MyBatis

異常到Spring的DataAccessException異常(數據訪問異常,譯者注)。最終,它不依賴于MyBatis,Spring或MyBatis-Spring來構建應用程序代碼。

2、要使用MyBatis-Spring模塊,你只需要包含mybatis-spring-1.0.0.jar(現在已經更新到mybatis-spring-1.2.1)文件,并在類路徑中加入依賴關系。

要和Spring一起使用MyBatis,你需要在Spring應用上下文中定義至少兩樣東西:一個SqlSessionFactory和至少一個數據映射器類。 
  在MyBatis-Spring中,SqlSessionFactoryBean是用于創建SqlSessionFactory的。要配置這個工廠bean,

放置下面的代碼在Spring的XML配置文件中:


<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean"> 
<property name="dataSource" ref="dataSource" /> 
</bean>


要注意SqlSessionFactory需要一個DataSource(數據源)。這可以是任意

的DataSource,配置它就和配置其它Spring數據庫連接一樣。如下:


<!-- 數據庫配置文件位置 -->
    <context:property-placeholder location="classpath:jdbc.properties" />

    <!-- 配置dbcp數據源 -->
    <bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close">
        <property name="driverClassName" value="${jdbc.driverClassName}" />
        <property name="url" value="${jdbc.url}" />
        <property name="username" value="${jdbc.username}" />
        <property name="password" value="${jdbc.password}" />
        <!-- 隊列中的最小等待數 -->
        <property name="minIdle" value="${jdbc.minIdle}"></property>
        <!-- 隊列中的最大等待數 -->
        <property name="maxIdle" value="${jdbc.maxIdle}"></property>
        <!-- 最長等待時間,單位毫秒 -->
        <property name="maxWait" value="${jdbc.maxWait}"></property>
        <!-- 最大活躍數 -->
        <property name="maxActive" value="${jdbc.maxActive}"></property>
        <property name="initialSize" value="${jdbc.initialSize}"></property>
    </bean>


假設你有一個如下編寫的數據映射器類:

public interface userMapper

{
    public Login login(Login login);
}

那么可以使用MapperFactoryBean,像下面這樣來把接口加入到Spr ing中:

<bean id="userMapper" class="org.mybatis.spring.mapper.MapperFactoryBean"> 
<property name="mapperInterface" value="org.mybatis.spring.sample.mapper.UserMapper" /> 
<property name="sqlSessionFactory" ref="sqlSessionFactory" /> 
</bean>

要注意指定的映射器類必須是一個接口,而不是具體的實現類。在這個示例中,使用MyBatis的映射器XML文件來指定sql語句,

但是用注解用來指定SQL語句也是可以的。

一旦配置好,你可以用注入其它任意Spring的bean相同的方式直接注入映射器到你的business/ser vice對象中。

MapperFactoryBean處理SqlSession的創建和關閉它。如果使用了Spring 的事務,那么當事務完成時,

session 將會提交或回滾。最終,任何異常都會被翻譯成Spring的DataAccessException異常。

調用MyBatis數據方法現在只需一行代碼(一般是在使用工廠模式的Service實現的時候): 

public class FooServiceImpl implements FooService { 
private UserMapper userMapper; 
public void setUserMapper(UserMapper userMapper) { 
this.userMapper = userMapper; 
} 
public User doSomeBusinessStuff(String userId) { 
return this.userMapper.getUser(userId); 
} 
}

3、現在還簡單介紹一下上面的SqlSessionFactoryBean,這個是核心的:

3.1、在基本的MyBatis中,session 工廠可以使用SqlSessionFactoryBuilder.來創建。

在MyBatis-Spring中,使用了SqlSessionFactoryBean來替代。
要創建工廠bean,放置下面的代碼在Spring的XML配置文件中:

<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean"> 
<property name="dataSource" ref="dataSource" /> 
</bean>

要注意SqlSessionFactoryBean實現了Spring的FactoryBean接口。這就說明由Spring最終創建的bean不是SqlSessionFactoryBean本
身,而是工廠類的getObject()返回的方法的結果。這種情況下,Spring將會在應用啟動時為你創建SqlSessionFactory對象,

然后將它以SqlSessionFactory為名來存儲。在Java中,相同的代碼是:

SqlSessionFactoryBean factoryBean = new SqlSessionFactoryBean(); 
SqlSessionFactory sessionFactory = factoryBean.getObject();

在一般的MyBatis-Spring用法中,你不需要直接使用SqlSessionFactoryBean或和其對

應的SqlSessionFactory。相反,session工廠將會被注入到MapperFactoryBean或其它擴
展了SqlSessionDaoSupport的DAO(也就是數據訪問對象)中。

3.1、現在再看看數據源的配置及一些屬性:

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

<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean"> 
<property name="dataSource" ref="dataSource" /> 
<property name="mapperLocations" value="classpath*:sample/config/mappers/**/*.xml" /> 
</bean>

這會從類路徑下加載在sample.config.mappers 包和它的子包中所有的MyBatis映射器XML文件。

下面寫上詳細的一些簡單配置:

spring的配置文件如下:

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xmlns:p="http://www.springframework.org/schema/p"
    xmlns:aop="http://www.springframework.org/schema/aop" 
    xmlns:tx="http://www.springframework.org/schema/tx"
    xsi:schemaLocation="http://www.springframework.org/schema/beans 
    http://www.springframework.org/schema/beans/spring-beans-3.2.xsd
    http://www.springframework.org/schema/aop 
    http://www.springframework.org/schema/aop/spring-aop-3.2.xsd
    http://www.springframework.org/schema/tx 
    http://www.springframework.org/schema/tx/spring-tx-3.2.xsd"
    default-autowire="byName">

    <!-- 加載數據庫配置文件,如果是Sqlserver數據庫,請修改此值為Sqlserver.config -->
    <bean id="config"
        class="org.springframework.beans.factory.config.PreferencesPlaceholderConfigurer">
        <property name="locations">
            <list>
                <value>
                    classpath:config/Oracle.properties
                </value>
            </list>
        </property>
    </bean>

    <!-- 獲取數據源 dataSource -->
    <bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource"
        destroy-method="close">
        <property name="driverClassName" value="${driverClassName}" />
        <property name="url" value="${url}" />
        <property name="username" value="${username}" />
        <property name="password" value="${password}" />
    </bean>

    <!-- 管理SqlSession,自動打開,關閉,提交,回滾等 -->
    <bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
        <property name="configLocation">
            <value>classpath:config/mybatis.xml</value>
        </property>
        <property name="dataSource" ref="dataSource"/>
    </bean>

    <bean id="sqlSession" class="org.mybatis.spring.SqlSessionTemplate">
        <constructor-arg index="0" ref="sqlSessionFactory" />
    </bean> 

 <!--    <bean name="transactionManager" class="org.springframework.jdbc.datasource.DateSourceTransactionManager">
        <property name="dataSource" ref="dataSource"/>
    </bean>

    <tx:advice id="txAdvice" transaction-manager="transactionManager">
       <tx:attributes>
           <tx:method name="select*" read-only="true"/>
           <tx:method name="query*" read-only="true"/>
           <tx:method name="get*" read-only="true"/>
           <tx:method name="find*" read-only="true"/>
           </tx:attributes>
    </tx:advice>

    <aop:config>
       <aop:pointcut expression="execution(* net.business.*.*(..))" id="aopConfig"/>
       <aop:advisor advice-ref="txAdvice" pointcut-ref="aopConfig"/>
    </aop:config> -->

</beans>

Sqlserver數據庫Sqlserver.properties如下:

driverClassName=com.microsoft.sqlserver.jdbc.SQLServerDriver
url=jdbc:sqlserver://localhost:1433; DatabaseName=dataName
username=sa
password=sa

mybatis的配置文件mybatis.xml 如下:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Config 3.0//EN" "http://mybatis.org/dtd/mybatis-3-config.dtd" >
<configuration>
   <!-- 參數設置 -->
    <settings>
        <!-- 這個配置使全局的映射器啟用或禁用緩存 -->
        <setting name="cacheEnabled" value="true" />
        <!-- 全局啟用或禁用延遲加載。當禁用時,所有關聯對象都會即時加載 -->
        <setting name="lazyLoadingEnabled" value="true" />
        <!-- 當啟用時,有延遲加載屬性的對象在被調用時將會完全加載任意屬性。否則,每種屬性將會按需要加載 -->
        <setting name="aggressiveLazyLoading" value="true" />
        <!-- 允許或不允許多種結果集從一個單獨的語句中返回(需要適合的驅動) -->
        <setting name="multipleResultSetsEnabled" value="true" />
        <!-- 使用列標簽代替列名。不同的驅動在這方便表現不同。參考驅動文檔或充分測試兩種方法來決定所使用的驅動 -->
        <setting name="useColumnLabel" value="true" />
        <!-- 允許JDBC支持生成的鍵。需要適合的驅動。如果設置為true則這個設置強制生成的鍵被使用,盡管一些驅動拒絕兼容但仍然有效(比如Derby) -->
        <setting name="useGeneratedKeys" value="true" />
        <!-- 指定MyBatis如何自動映射列到字段/屬性。PARTIAL只會自動映射簡單,沒有嵌套的結果。FULL會自動映射任意復雜的結果(嵌套的或其他情況) -->
        <setting name="autoMappingBehavior" value="PARTIAL" />
        <!-- 配置默認的執行器。SIMPLE執行器沒有什么特別之處。REUSE執行器重用預處理語句。BATCH執行器重用語句和批量更新 -->
        <setting name="defaultExecutorType" value="SIMPLE" />
        <!-- 設置超時時間,它決定驅動等待一個數據庫響應的時間 -->
        <setting name="defaultStatementTimeout" value="25000" />
    </settings>

    <!-- 別名定義 -->
    <typeAliases>
        <typeAlias alias="Login" type="net.system.Login" />
    </typeAliases>
    <!-- 映射文件,存放sql語句的配置文件 -->
    <mappers>
        <mapper resource="net/system/Login.xml" />
    </mappers>   

</configuration>


4、使用SqlSession 

上面的說明中還有最重要的沒有提了,那就是SqlSession 的實現了。

在MyBatis中,你可以使用SqlSessionFactory來創建SqlSession。一旦你獲得一個
session 之后,你可以使用它來執行映射語句,提交或回滾連接,最后,當不再需要它的時
候,你可以關閉session。使用MyBatis-Spring之后,你不再需要直接使用SqlSessionFactory
了,因為你的bean可以通過一個線程安全的SqlSession來注入,基于Spring的事務配置
來自動提交,回滾,關閉session。 
  注意通常不必直接使用SqlSession。在大多數情況下MapperFactoryBean,將會在bean
中注入所需要的映射器。下一章節中的MapperFactoryBean會解釋這個細節。

這里主要介紹兩種,SqlSessionTemplate和SqlSessionSupport。

4.1、SqlSessionTemplate:

SqlSessionTemplate是MyBatis-Spring的核心。這個類負責管理MyBatis的SqlSession,
調用MyBatis的SQL方法,翻譯異常。SqlSessionTemplate是線程安全的,可以被多個DAO
所共享使用。 
  當調用SQL方法時,包含從映射器getMapper()方法返回的方法,SqlSessionTemplate
將會保證使用的SqlSession是和當前Spring的事務相關的。此外,它管理session的生命
周期,包含必要的關閉,提交或回滾操作。 
  SqlSessionTemplate實現了SqlSession,這就是說要對MyBatis的SqlSession進行簡易替換。 
SqlSessionTemplate通常是被用來替代默認的MyBatis實現的DefaultSqlSession,
因為它不能參與到Spring 的事務中也不能被注入,因為它是線程不安全的。相同應用程序
中兩個類之間的轉換可能會引起數據一致性的問題。 
SqlSessionTemplate對象可以使用SqlSessionFactory作為構造方法的參數來創建。

<!-- 配置mybitasSqlSessionFactoryBean -->
    <bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
        <property name="dataSource" ref="dataSource" />
        <property name="configLocation" value="classpath:mybatis.xml"></property>
    </bean>

    <!-- 配置SqlSessionTemplate -->
    <bean id="sqlSessionTemplate" class="org.mybatis.spring.SqlSessionTemplate">
        <constructor-arg name="sqlSessionFactory" ref="sqlSessionFactory" />
    </bean>

接下來看看去證明實現呢?

public class UserDaoImpl implements UserDao {
    private SqlSessionTemplate sqlSessionTemplate;
    public User findUserByid(Integer userId) {
        return sqlSessionTemplate.selectOne(FIND_USER_BYID, userId);
    }
    public List<User> findAll() {
        return sqlSessionTemplate.selectList(SELECT_ALL_USER);
    }
    public User userLogin(User user) {
        return sqlSessionTemplate.selectOne(USER_LOGIN, user);
    }
}

如下注入SqlSessionTemplate:

<bean id="userDao" class="org.mybatis.spring.sample.dao.UserDaoImpl"> 
<property name="sqlSession" ref="sqlSessionTemplate"/> 
</bean>

4.2、SqlSessionSupport:

qlSessionDaoSupport 是一個抽象的支持類,用來為你提供SqlSession。調用
getSqlSession()方法你會得到一個SqlSessionTemplate,之后可以用于執行SQL方法,
就像下面這樣:

public class UserDaoImpl extends SqlSessionDaoSupport implements UserDao { 
public User getUser(String userId) { 
return (User) getSqlSession() 
.selectOne("org.mybatis.spring.sample.mapper.UserMapper.getUser", userId); 
} 
}

假設類UserMapperImpl是SqlSessionDaoSupport的子類,它可以在Spring中進行如下的配置:

<bean id="userMapper" class="org.mybatis.spring.sample.mapper.UserMapperImpl"> 
<!--注入SqlSessionTemplate實例 -->  
   <property name="sqlSessionTemplate" ref="sqlSession" />   
   <!--也可直接注入SqlSessionFactory實例,二者都指定時,SqlSessionFactory失效 -->  
   <!-- <property name="sqlSessionFactory" ref="sqlSessionFactory" />   -->  
</bean>

當然還有兩種session配置了 就是:MapperFactoryBean和MapperScannerConfigurer:

這兩種就不介紹了,當然了還有事務管理也沒有說明了。


來自: http://blog.csdn.net//u011067360/article/details/17754291

 本文由用戶 jopen 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!