mybatis+spring+struts2框架整合
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