日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

mybatis-spring 入门到实例

發(fā)布時間:2023/12/3 编程问答 35 豆豆
生活随笔 收集整理的這篇文章主要介紹了 mybatis-spring 入门到实例 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

入門

安裝

在pom.xml中導(dǎo)入mybatis-spring.jar包

快速入門

要把spring和mybatis一起使用,需要定義兩樣東西:SqlsessionFactory 和 至少一個數(shù)據(jù)庫映射器類。

SqlSessionFactoryBean 是用于創(chuàng)建 SqlSessionFactory 的,需要一個Datasource參數(shù)。

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

假如定義了一個如下的mapper接口:

public interface UserMapper {@Select("SELECT * FROM users WHERE id = #{userId}")User getUser(@Param("userId") String userId); }

可以使用MapperFactoryBean,把接口加入到Spring中:

<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>

注意:所指定的映射器類必須是一個接口,而不是具體的實現(xiàn)類。上面例子用的是注解,也可以用xml配置的形式。

一旦配置好,可以用相同的方式直接注入映射器到 business/service 對象中。MapperFactoryBean 處理 SqlSession 的創(chuàng)建和關(guān)閉它。如果使用 了 Spring 的事務(wù),那么當事務(wù)完成時,session 將會提交或回滾。最終,任何異常都會被翻 譯成 Spring 的 DataAccessException 異常。

最后調(diào)用Mybatis數(shù)據(jù)方法只需一行代碼:

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); }

SqlSessionFactoryBean

要創(chuàng)建工廠 bean,放置下面的代碼在 Spring 的 XML 配置文件中:

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

屬性

SqlSessionFactory 有一個單獨的必須屬性— JDBC 的 DataSource。

一個通用的屬性是 configLocation,它是用來指定 MyBatis 的 XML 配置文件路徑的。 如果基本的 MyBatis 配置需要改變, 那么這就是一個需要配置文件的地方。

和spring結(jié)合的mybatis配置文件不需要一個完整的 MyBatis 配置。任意環(huán)境,數(shù)據(jù)源 和 MyBatis 的事務(wù)管理器都會被忽略。SqlSessionFactoryBean 會創(chuàng)建它自己的 sqlSessionFactory。

另一個需要配置文件的地方,是mybatis映射器xml文件和映射器類不在同一路徑。有兩個選擇:第一是手動在 MyBatis 的 XML 配 置文件中使用部分來指定類路徑。第二是使用工廠 bean 的 mapperLocations 屬 性。

mapperLocations 屬性使用一個資源位置的 list。

<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 包和它的子包中所有的 映射器 文件。

從1.3.0后,configuration 屬性加入。它規(guī)定不用xml配置文件直接插入configuration標簽。

<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean"><property name="dataSource" ref="dataSource" /><property name="configuration"><bean class="org.apache.ibatis.session.Configuration"><property name="mapUnderscoreToCamelCase" value="true"/></bean></property> </bean>

事務(wù)

一個使用 MyBatis-Spring 的主要原因是它允許 MyBatis 參與到 Spring 的事務(wù)管理中。MyBatis-Spring 利用了存在于 Spring 中的 DataSourceTransactionManager。

可以通過配置Spring的PlatformTransaction,來配置自己的事務(wù)。

在事務(wù)處理期間,一個單獨的 SqlSession 對象將被創(chuàng)建和使用。當事務(wù)完成時,這個 session 會以合適的方式提交或回滾。

標準配置

開啟Spring事務(wù)處理, 創(chuàng)建一個 DataSourceTransactionManager 對象。

<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager"><property name="dataSource" ref="dataSource" /> </bean>

要注意, 為事務(wù)管理器指定的 DataSource 必須和用來創(chuàng)建 SqlSessionFactoryBean 的 是同一個數(shù)據(jù)源,否則事務(wù)管理器就無法工作了。

容器管理事務(wù)

如果你想讓 Spring 參與到容器管理事務(wù)(CMT)中,那么 Spring 應(yīng)該使用 JtaTransactionManager 或它的容 器指定的子類來配置

<tx:jta-transaction-manager />

如果你想使用CMT , 而不想使用Spring的事務(wù)管理。 必須配置SQLSessionFactory來使用MyBatis 的 ManagedTransactionFactory 。

<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean"><property name="dataSource" ref="dataSource" /><property name="transactionFactory"><bean class="org.apache.ibatis.transaction.managed.ManagedTransactionFactory" /></property> </bean>

編程式事務(wù)管理

你 不 能 在 Spring 管 理 的 SqlSession 上 調(diào) 用 SqlSession.commit() , SqlSession.rollback() 或 SqlSession.close() 方 法 。 如 果 這 樣 做 了 , 就 會 拋 出 UnsupportedOperationException 異常。注意在使用注入的映射器時不能訪問那些方法。

如果你想編程式地控制事務(wù),這段代碼展示了使用 PlatformTransactionManager 來處理事務(wù)

DefaultTransactionDefinition def = new DefaultTransactionDefinition(); def.setPropagationBehavior(TransactionDefinition.PROPAGATION_REQUIRED);TransactionStatus status = txManager.getTransaction(def); try {userMapper.insertUser(user); } catch (MyException ex) {txManager.rollback(status);throw ex; } txManager.commit(status);

使用SQLSession

在 MyBatis 中,你可以使用 SqlSessionFactory 來創(chuàng)建 SqlSession。一旦你獲得一個 session 之后,你可以使用它來執(zhí)行映射語句,提交或回滾連接,最后,當不再需要它的時 候, 你可以關(guān)閉 session。 使用 MyBatis-Spring 之后, 你不再需要直接使用 SqlSessionFactory 了,因為你的 bean 可以通過一個線程安全的 SqlSession 來注入,基于 Spring 的事務(wù)配置 來自動提交,回滾,關(guān)閉 session。

SqlSessionTemplate

SqlSessionTemplate 是 MyBatis-Spring 的核心。
這個類負責管理 MyBatis 的 SqlSession, 調(diào)用 MyBatis 的 SQL 方法, 翻譯異常。 SqlSessionTemplate 是線程安全的, 可以被多個 DAO 所共享使用。它管理 session 的生命 周期,包含必要的關(guān)閉,提交或回滾操作。

SqlSessionTemplate 實現(xiàn)了 SqlSession 接口,在代碼中無需對 MyBatis 的 SqlSession 替換。SqlSessionTemplate 通常是被用來替代默認的 MyBatis 實現(xiàn)的 DefaultSqlSession。

SqlSessionTemplate 對象可以使用 SqlSessionFactory 作為構(gòu)造方法的參數(shù)來創(chuàng)建。

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

1、這個 bean 現(xiàn)在可以直接注入到 DAO bean 中。你需要在 bean 中添加一個 SqlSession 屬性。

public class UserDaoImpl implements UserDao {private SqlSession sqlSession;public void setSqlSession(SqlSession sqlSession) {this.sqlSession = sqlSession;}public User getUser(String userId) {return (User) sqlSession.selectOne("org.mybatis.spring.sample.mapper.UserMapper.getUser", userId);} }

注入SqlSessionTemplate:

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

2、SqlSessionTemplate 有一個使用 ExecutorType 作為參數(shù)的構(gòu)造方法。這允許你用來 創(chuàng)建對象。

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

現(xiàn)在你所有語句都可以批量操作。

public void insertUsers(User[] users) {for (User user : users) {sqlSession.insert("org.mybatis.spring.sample.mapper.UserMapper.insertUser", user);}}

SqlSessionDaoSupport

SqlSessionDaoSupport 是 一 個 抽象 的支 持 類, 用來 為你 提供 SqlSession 。 調(diào)用getSqlSession()方法你會得到一個 SqlSessionTemplate,之后可以用于執(zhí)行 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);} }

通常 MapperFactoryBean 是這個類的首選,因為它不需要額外的代碼。 但是,你要在dao中做其他事情,那么這個類就很有用。

SqlSessionDaoSupport 需要一個 sqlSessionFactory 或 sqlSessionTemplate 屬性來 設(shè) 置 。

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

<bean id="userMapper" class="org.mybatis.spring.sample.mapper.UserDaoImpl"><property name="sqlSessionFactory" ref="sqlSessionFactory" /> </bean>

五 注入映射器

為了代替手工使用 SqlSessionDaoSupport 或 SqlSessionTemplate 編寫數(shù)據(jù)訪問對象 (DAO)的代碼,MyBatis-Spring 提供了一個動態(tài)代理的實現(xiàn):MapperFactoryBean這個類 可以讓你直接注入數(shù)據(jù)映射器接口到你的 service 層 bean 中。當使用映射器時,你僅僅如調(diào) 用你的 DAO 一樣調(diào)用它們就可以了,但是你不需要編寫任何 DAO 實現(xiàn)的代碼,因為 MyBatis-Spring 將會為你創(chuàng)建代理。

使用注入的映射器代碼,在 MyBatis,Spring 或 MyBatis-Spring 上面不會有直接的依賴。 MapperFactoryBean 創(chuàng)建的代理控制開放和關(guān)閉 session翻譯任意的異常到 Spring 的 DataAccessException 異常中。此外,如果需要或參與到一個已經(jīng)存在活動事務(wù)中,代理將 會開啟一個新的 Spring 事務(wù)。

MapperFactoryBean

加入到Spring

<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>

mapperInterface說明 MapperFactoryBean 創(chuàng)建的代理類實現(xiàn)了 UserMapper 接口,并且注入到應(yīng)用程序中。

如果 XML 文件在類路徑的 位置和映射器類相同時, 它會被 MapperFactoryBean 自動解析。不需要再mybatis的配置文件中指定映射器路徑,除非在不同目錄。

可以直接在 business/service 對象中以注入Spring bean 的方式直接注入映 射器:

<bean id="fooService" class="org.mybatis.spring.sample.mapper.FooServiceImpl"><property name="userMapper" ref="userMapper" /> </bean>

這個 bean 可以直接在應(yīng)用程序邏輯中使用:

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);} }

注意,上面沒有Session的引用,打開或 關(guān)閉 session 的代碼,MyBatis-Spring 會來關(guān)心它的。

MapperScannerConfigurer

沒有必要在 Spring 的 XML 配置文件中注冊所有的映射器。相反,你可以使用一個 MapperScannerConfigurer , 它 將 會 查 找 類 路 徑 下 的 映 射 器 并 自 動 將 它 們 創(chuàng) 建 成 MapperFactoryBean。

創(chuàng)建 MapperScannerConfigurer

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

basePackage 屬性是讓你為映射器接口文件設(shè)置基本的包路徑。 可以使用分號或逗號 作為分隔符設(shè)置多于一個的包路徑。每個映射器將會在指定的包路徑中遞歸地被搜索到。

注 意 , 沒有必要去指定 SqlSessionFactory 或 SqlSessionTemplate , 因 為 MapperScannerConfigurer 將會創(chuàng)建 MapperFactoryBean,之后自動裝配。但是,如果你使 用了一個 以上的 DataSource ,那 么自動 裝配可 能會失效。 這種 情況下 ,你可 以使用 sqlSessionFactoryBeanName 或 sqlSessionTemplateBeanName 屬性來設(shè)置正確的 bean 名 稱來使用。

bean 的名稱是必須的,而不是 bean 的引用,因 此,value 屬性在這里替代通常的 ref:

<property name="sqlSessionFactoryBeanName" value="sqlSessionFactory" />

六 使用Mybatis API

使用 MyBatis-Spring,你可以繼續(xù)直接使用 MyBatis 的 API。僅僅在代碼中使用 Spring 中 的 SqlSessionFactoryBean 來創(chuàng)建一個 SqlSessionFactory。

public class UserMapperSqlSessionImpl implements UserMapper {// SqlSessionFactory would normally be set by SqlSessionDaoSupportprivate SqlSessionFactory sqlSessionFactory;public void setSqlSessionFactory(SqlSessionFactory sqlSessionFactory) {this.sqlSessionFactory = sqlSessionFactory;}public User getUser(String userId) {// note standard MyBatis API usage - opening and closing the session manuallySqlSession session = sqlSessionFactory.openSession();try {return (User) session.selectOne("org.mybatis.spring.sample.mapper.UserMapper.getUser", userId);} finally {session.close();}} }

小心使用此選項, 因為錯誤的使用會產(chǎn)生運行時錯誤, 或者更糟糕的數(shù)據(jù)一致性的問題。 這些是告誡:
1.它不會參與到 Spring 的事務(wù)之中。
2.如果 SqlSession 使用 DataSource,它也會被 Spring 事務(wù)管理器使用,而且當前 有事務(wù)在進行時,這段代碼會拋出異常。
3.MyBatis 的 DefaultSqlSession 是線程不安全的。如果在 bean 中注入了它,就會 發(fā)生錯誤。
使用 DefaultSqlSession 創(chuàng)建的映射器也不是線程安全的。如果你將它們注入到 bean 中,是會發(fā)生錯誤的。
4.你必須保證在 finally 塊中來關(guān)閉 SqlSession。

實例代碼

https://github.com/mybatis/spring/tree/master/src/test/java/org/mybatis/spring/sample

Spring單元測試

https://blog.csdn.net/u013041642/article/details/71430293

import org.junit.Test; import org.junit.runner.RunWith; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.test.context.ContextConfiguration; import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;import com.zx.dao.UserDao; import com.zx.domain.User; import com.zx.mapper.UserMapper;/*** Example of MyBatis-Spring batch integration usage.*/ @RunWith(SpringJUnit4ClassRunner.class) @ContextConfiguration(locations="classpath:application-base.xml") public class UserDaoTest{@Autowiredprotected UserDao userDao;@Autowiredprotected UserMapper userMapper;@Testpublic void testSelect() {User user = this.userMapper.selectOne(1);System.out.println(user);} }

總結(jié)

以上是生活随笔為你收集整理的mybatis-spring 入门到实例的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。