Spring整合Mybatis

来源:https://www.cnblogs.com/wangjr1994/archive/2020/03/21/12541834.html
-Advertisement-
Play Games

Spring 整合 Mybatis 在開始使用 MyBatis Spring 之前,需要先熟悉 Spring 和 MyBatis 這兩個框架和有關它們的術語。 MyBatis Spring 需要以下版本: | MyBatis Spring | MyBatis | Spring 框架 | Spring ...


Spring 整合 Mybatis

在開始使用 MyBatis-Spring 之前,需要先熟悉 Spring 和 MyBatis 這兩個框架和有關它們的術語。

MyBatis-Spring 需要以下版本:

MyBatis-Spring MyBatis Spring 框架 Spring Batch Java
2.0 3.5+ 5.0+ 4.0+ Java 8+
1.3 3.4+ 3.2.2+ 2.1+ Java 6+

導入對應的 Maven 依賴

<dependencies>
    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-webmvc</artifactId>
        <version>5.2.4.RELEASE</version>
    </dependency>
    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-jdbc</artifactId>
        <version>5.2.4.RELEASE</version>
    </dependency>
    <dependency>
        <groupId>org.aspectj</groupId>
        <artifactId>aspectjweaver</artifactId>
        <version>1.9.5</version>
    </dependency>
    <dependency>
        <groupId>mysql</groupId>
        <artifactId>mysql-connector-java</artifactId>
        <version>8.0.17</version>
    </dependency>
    <dependency>
        <groupId>org.mybatis</groupId>
        <artifactId>mybatis</artifactId>
        <version>3.5.2</version>
    </dependency>
    <dependency>
        <groupId>org.mybatis</groupId>
        <artifactId>mybatis-spring</artifactId>
        <version>2.0.4</version>
    </dependency>
</dependencies>

測試代碼如下,dao:

public interface UserMapper {
    List<User> queryUsers();
}

對應的 xml 還是和 Mybatis一樣

<select id="queryUsers" resultType="user">
    select * from user
</select>

pojo:

public class User {
    private int id;
    private String name;
    private String pwd;
    ...

下麵創建一個 xml 使用 spring 的方式來創建 Mybatis所需要的對象

SqlSessionFactory 需要一個 DataSource(數據源)。 這可以是任意的 DataSource,只需要和配置其它 Spring 資料庫連接一樣配置它就可以了。上面導入了 spring-jdbc 這個依賴,所以這個地方就使用 spring 的 DriverManagerDataSource 來創建數據源

<bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
    <property name="driverClassName" value="com.mysql.cj.jdbc.Driver"/>
    <property name="url" value="jdbc:mysql://localhost:3306/mybatis_db?serverTimezone=UTC"/>
    <property name="username" value="root"/>
    <property name="password" value="123456"/>
</bean>

創建SqlSessionFactory ,並指定對應的 Mybatis 配置文件及 Mapper.xml

<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
    <property name="dataSource" ref="dataSource" />
    <property name="configLocation" value="mybatis-config.xml"/>
    <property name="mapperLocations" value="com/youzi/dao/*.xml"/>
</bean>

mybatis-config.xml 在這個地方沒有完全捨棄,可以用來配置 Mybatis 的相關設置及細節

<?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>
    <typeAliases>
        <package name="com.youzi.pojo"/>
    </typeAliases>
</configuration>

整合之後使用 SqlSessionTemplate 的方式創建 sqlSession

SqlSessionTemplate 是 MyBatis-Spring 的核心。作為 SqlSession 的一個實現,這意味著可以使用它無縫代替你代碼中已經在使用的 SqlSessionSqlSessionTemplate 是線程安全的,可以被多個 DAO 或映射器所共用使用。

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

添加一個 Dao 實現類

public class UserMapperImpl implements UserMapper {

    private SqlSessionTemplate sqlSession;

    public void setSqlSession(SqlSessionTemplate sqlSession) {
        this.sqlSession = sqlSession;
    }

    @Override
    public List<User> queryUsers() {
        return sqlSession.getMapper(UserMapper.class).queryUsers();
    }
}

sqlSession 註入 UserMapperImpl

<bean id="userMapper" class="com.youzi.dao.UserMapperImpl">
    <property name="sqlSession" ref="sqlSession"/>
</bean>

到此就可以直接使用 spring 獲取 userMapper ,完整的 xml 文件如下

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

    <bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
        <property name="driverClassName" value="com.mysql.cj.jdbc.Driver"/>
        <property name="url" value="jdbc:mysql://localhost:3306/mybatis_db?serverTimezone=UTC"/>
        <property name="username" value="root"/>
        <property name="password" value="123456"/>
    </bean>

    <bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
        <property name="dataSource" ref="dataSource" />
        <property name="configLocation" value="mybatis-config.xml"/>
        <property name="mapperLocations" value="com/youzi/dao/*.xml"/>
    </bean>

    <bean id="sqlSession" class="org.mybatis.spring.SqlSessionTemplate">
        <constructor-arg index="0" ref="sqlSessionFactory"/>
    </bean>
    
    <bean id="userMapper" class="com.youzi.dao.UserMapperImpl">
        <property name="sqlSession" ref="sqlSession"/>
    </bean>

</beans>

另一種方式:

使用 SqlSessionDaoSupport 創建 SqlSessionSqlSessionDaoSupport 是一個抽象的支持類,用來為你提供 SqlSession。調用 getSqlSession() 方法你會得到一個 SqlSessionTemplate,之後可以用於執行 SQL 方法

public class UserMapperImpl extends SqlSessionDaoSupport implements UserMapper {
    @Override
    public List<User> getUsers() {
        return getSqlSession().getMapper(UserMapper.class).getUsers();
    }
}
<bean id="userMapper" class="com.youzi.dao.UserMapperImpl">
    <property name="sqlSessionFactory" ref="sqlSessionFactory"/>
</bean>

事務

聲明式事務配置--使用 aop 的方式 Spring-tx 模塊實現事務管理

添加tx名字空間

xmlns:aop="http://www.springframework.org/schema/aop" 
xmlns:tx="http://www.springframework.org/schema/tx"  
xsi:schemaLocation="http://www.springframework.org/schema/aop 
    http://www.springframework.org/schema/aop/spring-aop-3.0.xsd  
    http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-3.0.xsd"
<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
    <property name="dataSource" ref="dataSource"/>
</bean>

<tx:advice id="txAdvice" transaction-manager="transactionManager">
    <tx:attributes>
        <tx:method name="*" propagation="REQUIRED"/>
    </tx:attributes>
</tx:advice>

<aop:config>
    <aop:pointcut id="txPointCut" expression="execution(* com.youzi.dao.*.*(..))"/>
    <aop:advisor advice-ref="txAdvice" pointcut-ref="txPointCut"/>
</aop:config>
事務傳播行為類型 說明
REQUIRED 如果當前沒有事務,就新建一個事務,如果已經存在一個事務中,加入到這個事務中。這是最常見的選擇。
SUPPORTS 支持當前事務,如果當前沒有事務,就以非事務方式執行。
MANDATORY 使用當前的事務,如果當前沒有事務,就拋出異常。
REQUIRES_NEW 新建事務,如果當前存在事務,把當前事務掛起。
NOT_SUPPORTED 以非事務方式執行操作,如果當前存在事務,就把當前事務掛起。
NEVER 以非事務方式執行,如果當前存在事務,則拋出異常。
NESTED 如果當前存在事務,則在嵌套事務內執行。如果當前沒有事務,則執行與PROPAGATION_REQUIRED類 似的操作。

您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 在家實在閑的沒事兒乾,翻出來了大三上學期的EDA課的小實驗,也就是設計一個二愣子交通燈啦,只會自己按設定好的時間閃,紅燈、綠燈,黃燈和轉向燈; 各燈顯示時長:哎呀~ 懶得寫了,後面程式里都有。 晶元:FPGA、Cylone IV E 系列的 EP4CE6E22C8,144引腳。 外置時鐘:1Hz 以 ...
  • Android車載地圖測試,涉及:高德地圖100m比例尺下,拖動地圖進行移圖操作2個小時, 預期結果:移圖正常,地圖渲染正常,不會出現卡死卡滯界面異常等情況。 準備階段 1. 在高德地圖App界面,調整比例尺到100m 2. adb shell input swipe x1 y1 x2 y2 , 可 ...
  • 根據老師講的思路寫的,沒有百度,所以也不知道完不完全正確,但目前測試都還好,都可以正常排序。 1 #include <iostream> 2 using namespace std; 3 4 void quickSort(double *q ,int n) //一個double型數組還有一個代表這個 ...
  • "本文原文鏈接地址:http://nullpointer.pw/mapstruct%E6%9C%80%E4%BD%B3%E5%AE%9E%E8%B7%B5.html" 前言 按照日常開發習慣,對於不同領域層使用不同JavaBean對象傳輸數據,避免相互影響,因此基於資料庫實體對象User衍生出比如U ...
  • 大家在學習Python的時候,有人會問“Python要學到什麼程度才能出去找工作”,對於在Python培訓機構學習Python的同學來說這都不是問題,因為按照Python課程大綱來,一般都不會有什麼問題,而對於自學Python來說,那就比較難掌握,冒然出去找工作非常容易受打擊,從而失去學習Pytho ...
  • 1、Go 語言最主要的特性 自動垃圾回收 更豐富的內置類型 函數多返回值 錯誤處理 匿名函數和閉包 類型和介面 併發編程 反射 語言交互性 2、$GOPATH目錄約定有三個子目錄 src存放源代碼(比如:.go .c .h .s等) 按照golang預設約定,go run,go install等命令 ...
  • 關鍵詞:鄭州 二本 物理專業 先前端實習生 後Java程式員 更多文章收錄在碼雲倉庫:https://gitee.com/bingqilinpeishenme/Java Tutorials 前言 沒有正式復工,就一直在老家待著,已經很長時間沒有在三月份時候待在老家了,好久好久,從08年去縣城上高中開 ...
  • 問題背景 使用mybatis-plus進行資料庫交互,預設開啟null不更新設置,在新增數據後,編輯頁面將欄位值清除後(date類型,int類型,為避免預設值傳入,model全部使用包裝類型初始化為null)無法將null值更新至資料庫 單個解決方案 通過UpdateWrapper的set方法強制字 ...
一周排行
    -Advertisement-
    Play Games
  • .Net8.0 Blazor Hybird 桌面端 (WPF/Winform) 實測可以完整運行在 win7sp1/win10/win11. 如果用其他工具打包,還可以運行在mac/linux下, 傳送門BlazorHybrid 發佈為無依賴包方式 安裝 WebView2Runtime 1.57 M ...
  • 目錄前言PostgreSql安裝測試額外Nuget安裝Person.cs模擬運行Navicate連postgresql解決方案Garnet為什麼要選擇Garnet而不是RedisRedis不再開源Windows版的Redis是由微軟維護的Windows Redis版本老舊,後續可能不再更新Garne ...
  • C#TMS系統代碼-聯表報表學習 領導被裁了之後很快就有人上任了,幾乎是無縫銜接,很難讓我不想到這早就決定好了。我的職責沒有任何變化。感受下來這個系統封裝程度很高,我只要會調用方法就行。這個系統交付之後不會有太多問題,更多應該是做小需求,有大的開發任務應該也是第二期的事,嗯?怎麼感覺我變成運維了?而 ...
  • 我在隨筆《EAV模型(實體-屬性-值)的設計和低代碼的處理方案(1)》中介紹了一些基本的EAV模型設計知識和基於Winform場景下低代碼(或者說無代碼)的一些實現思路,在本篇隨筆中,我們來分析一下這種針對通用業務,且只需定義就能構建業務模塊存儲和界面的解決方案,其中的數據查詢處理的操作。 ...
  • 對某個遠程伺服器啟用和設置NTP服務(Windows系統) 打開註冊表 HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\W32Time\TimeProviders\NtpServer 將 Enabled 的值設置為 1,這將啟用NTP伺服器功 ...
  • title: Django信號與擴展:深入理解與實踐 date: 2024/5/15 22:40:52 updated: 2024/5/15 22:40:52 categories: 後端開發 tags: Django 信號 松耦合 觀察者 擴展 安全 性能 第一部分:Django信號基礎 Djan ...
  • 使用xadmin2遇到的問題&解決 環境配置: 使用的模塊版本: 關聯的包 Django 3.2.15 mysqlclient 2.2.4 xadmin 2.0.1 django-crispy-forms >= 1.6.0 django-import-export >= 0.5.1 django-r ...
  • 今天我打算整點兒不一樣的內容,通過之前學習的TransformerMap和LazyMap鏈,想搞點不一樣的,所以我關註了另外一條鏈DefaultedMap鏈,主要調用鏈為: 調用鏈詳細描述: ObjectInputStream.readObject() DefaultedMap.readObject ...
  • 後端應用級開發者該如何擁抱 AI GC?就是在這樣的一個大的浪潮下,我們的傳統的應用級開發者。我們該如何選擇職業或者是如何去快速轉型,跟上這樣的一個行業的一個浪潮? 0 AI金字塔模型 越往上它的整個難度就是職業機會也好,或者說是整個的這個運作也好,它的難度會越大,然後越往下機會就會越多,所以這是一 ...
  • @Autowired是Spring框架提供的註解,@Resource是Java EE 5規範提供的註解。 @Autowired預設按照類型自動裝配,而@Resource預設按照名稱自動裝配。 @Autowired支持@Qualifier註解來指定裝配哪一個具有相同類型的bean,而@Resourc... ...