欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

MyBatis中SqlSession生命周期的使用

 更新時間:2024年09月06日 08:54:40   作者:這孩子叫逆  
SqlSession是MyBatis的核心接口之一,本文主要介紹了MyBatis中SqlSession生命周期的使用,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧

SqlSession 是 MyBatis 的核心接口之一,用于執(zhí)行與數(shù)據(jù)庫的交互操作。它提供了執(zhí)行 SQL 語句的所有方法,包括插入、更新、刪除和查詢,還可以管理事務(wù)、獲取映射器(Mapper)接口的實例等。

SqlSession 的主要功能包括:

  • 執(zhí)行SQL操作:如 insert、update、delete、select 等方法,用于執(zhí)行對應(yīng)的 SQL 語句。

  • 事務(wù)管理:通過 commit() 和 rollback() 方法進行事務(wù)的提交與回滾。

  • 獲取Mapper:通過 getMapper(Class<T> type) 方法獲取映射器接口的實例,從而使用接口調(diào)用來執(zhí)行 SQL。

  • 緩存管理SqlSession 還負責管理一級緩存,它會自動緩存相同會話中的查詢結(jié)果,減少對數(shù)據(jù)庫的訪問。

如何管理SqlSession的生命周期?

SqlSession 不是線程安全的,它的生命周期應(yīng)由使用者自己管理。正確地管理 SqlSession 的生命周期對于避免資源泄漏和確保應(yīng)用程序的可靠性至關(guān)重要。以下是管理 SqlSession 生命周期的常用方法:

1. 手動管理 SqlSession

當你在沒有使用 Spring 的場景下,可以手動管理 SqlSession 的生命周期。通常,在執(zhí)行數(shù)據(jù)庫操作時,手動打開 SqlSession,執(zhí)行操作后立即關(guān)閉它。

示例代碼

import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
?
public class MyBatisExample {
?
    private SqlSessionFactory sqlSessionFactory;
?
    public MyBatisExample(SqlSessionFactory sqlSessionFactory) {
        this.sqlSessionFactory = sqlSessionFactory;
    }
?
    public void performDatabaseOperation() {
        SqlSession session = null;
        try {
            session = sqlSessionFactory.openSession(); // 打開 SqlSession
            UserMapper mapper = session.getMapper(UserMapper.class); // 獲取 Mapper
            User user = mapper.selectUserById(1); // 執(zhí)行 SQL 查詢
            System.out.println(user);
?
            session.commit(); // 提交事務(wù)
        } catch (Exception e) {
            if (session != null) {
                session.rollback(); // 發(fā)生異常時回滾事務(wù)
            }
            e.printStackTrace();
        } finally {
            if (session != null) {
                session.close(); // 關(guān)閉 SqlSession
            }
        }
    }
}

在這個例子中:

  • openSession() 方法用于打開一個 SqlSession。

  • 在 try 塊中執(zhí)行數(shù)據(jù)庫操作并調(diào)用 commit() 提交事務(wù)。

  • 如果發(fā)生異常,在 catch 塊中調(diào)用 rollback() 回滾事務(wù)。

  • 最后在 finally 塊中確保 SqlSession 被關(guān)閉,以釋放資源。

2. 使用 Spring 管理 SqlSession 的生命周期

在 Spring 環(huán)境中,通常不需要手動管理 SqlSession 的生命周期。Spring 整合 MyBatis 后,通過 SqlSessionTemplate 來管理 SqlSession 的生命周期,開發(fā)者只需關(guān)注業(yè)務(wù)邏輯,Spring 會自動管理事務(wù)和資源的關(guān)閉。

使用 Spring 的 MyBatis 整合

置 SqlSessionFactory 和 SqlSessionTemplate:

在 Spring 的配置類或 XML 中配置 SqlSessionFactory 和 SqlSessionTemplate。

@Configuration
@MapperScan("com.example.mapper")
public class MyBatisConfig {
?
    @Bean
    public DataSource dataSource() {
        // 配置數(shù)據(jù)源
    }
?
    @Bean
    public SqlSessionFactory sqlSessionFactory(DataSource dataSource) throws Exception {
        SqlSessionFactoryBean factoryBean = new SqlSessionFactoryBean();
        factoryBean.setDataSource(dataSource);
        return factoryBean.getObject();
    }
?
    @Bean
    public SqlSessionTemplate sqlSessionTemplate(SqlSessionFactory sqlSessionFactory) {
        return new SqlSessionTemplate(sqlSessionFactory);
    }
}

在 Mapper 接口中使用

在 Spring 中使用 MyBatis 時,只需定義 Mapper 接口,無需顯式管理 SqlSession。

@Repository
public interface UserMapper {
    User selectUserById(int id);
}

然后在服務(wù)類中自動注入 Mapper 接口,直接調(diào)用方法執(zhí)行數(shù)據(jù)庫操作:

@Service
public class UserService {
?
    @Autowired
    private UserMapper userMapper;
?
    public User getUserById(int id) {
        return userMapper.selectUserById(id);
    }
}

在這種模式下,SqlSession 的生命周期完全由 Spring 管理,SqlSessionTemplate 會自動打開和關(guān)閉 SqlSession,并管理事務(wù)。

3. 正確的事務(wù)管理

  • 手動管理事務(wù):在手動管理 SqlSession 時,事務(wù)控制需要通過 commit() 和 rollback() 來完成。

  • Spring 管理事務(wù):通過 Spring 配置事務(wù)管理器,使用 @Transactional 注解來管理事務(wù),無需顯式調(diào)用 commit() 和 rollback(),Spring 會在方法成功執(zhí)行后自動提交事務(wù),或在發(fā)生異常時自動回滾事務(wù)。

4. 避免 SqlSession 泄漏

無論是在手動管理還是使用 Spring 管理 SqlSession,都要確保 SqlSession 在使用后能夠正確關(guān)閉,以避免數(shù)據(jù)庫連接泄漏。對于手動管理的情況,使用 try-finally 結(jié)構(gòu)確保關(guān)閉 SqlSession。對于 Spring 管理的情況,依賴 Spring 自動處理。

總結(jié)

  • SqlSession 是 MyBatis 與數(shù)據(jù)庫交互的核心接口,提供了執(zhí)行 SQL 語句、事務(wù)管理和獲取 Mapper 的功能。

  • 手動管理 SqlSession 時,必須在使用后及時關(guān)閉,以避免資源泄漏。使用 try-finally 結(jié)構(gòu)是推薦的方式。

  • 在 Spring 環(huán)境中,通常通過 SqlSessionTemplate 來管理 SqlSession,開發(fā)者不需要手動處理 SqlSession 的打開和關(guān)閉,Spring 會自動管理事務(wù)和資源。

  • 正確的事務(wù)管理 是確保數(shù)據(jù)一致性和避免資源泄漏的關(guān)鍵,在手動管理和 Spring 管理模式下有不同的實現(xiàn)方式。

到此這篇關(guān)于MyBatis中SqlSession生命周期的使用的文章就介紹到這了,更多相關(guān)MyBatis SqlSession生命周期內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家! 

相關(guān)文章

  • 100行java寫的微信跳一跳輔助程序

    100行java寫的微信跳一跳輔助程序

    本篇文章給大家分享了用java寫的一個微信跳一跳輔助腳本程序,有興趣的朋友參考學習下。
    2018-01-01
  • Java中Lombok的@Builder注解注意事項

    Java中Lombok的@Builder注解注意事項

    這篇文章主要介紹了Java中Lombok的@Builder注解注意事項,使用Lombok也會造成很多問題,尤其@Builder 有個很大的坑,已經(jīng)見過好幾次由于使用@Builder注解導(dǎo)致默認值失效的問題,如果測試時沒有在意這個問題,就很容易引發(fā)線上問題,需要的朋友可以參考下
    2023-12-12
  • 聊聊finally中的代碼一定會執(zhí)行嗎

    聊聊finally中的代碼一定會執(zhí)行嗎

    通常在面試中,只要是疑問句一般答案都是“否定”的,因為如果是“確定”和“正?!钡?那面試官就沒有必要再問了嘛,本文想和大家聊聊finally中的代碼一定會執(zhí)行嗎?,感興趣的朋友跟著小編一起來看看吧
    2023-12-12
  • Netty分布式高性能工具類同線程下回收對象解析

    Netty分布式高性能工具類同線程下回收對象解析

    這篇文章主要為大家介紹了Netty分布式高性能工具類同線程下回收對象解析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2022-03-03
  • 詳解Struts2動態(tài)方法調(diào)用

    詳解Struts2動態(tài)方法調(diào)用

    這篇文章主要介紹了詳解Struts2動態(tài)方法調(diào)用,涉及調(diào)用方法的代碼,具有一定參考價值,需要的朋友可以了解下。
    2017-09-09
  • 詳解SpringCloud Ribbon 負載均衡通過服務(wù)器名無法連接的神坑

    詳解SpringCloud Ribbon 負載均衡通過服務(wù)器名無法連接的神坑

    這篇文章主要介紹了詳解SpringCloud Ribbon 負載均衡通過服務(wù)器名無法連接的神坑,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2019-06-06
  • 初學者Android studio安裝圖文詳解

    初學者Android studio安裝圖文詳解

    本文給大家分享android studio 安裝圖文詳解包括下載安裝及遇到的問題,非常不錯,具有參考借鑒價值,需要的朋友參考下吧
    2017-09-09
  • springboot3.4和mybatis plus的版本問題的解決

    springboot3.4和mybatis plus的版本問題的解決

    本文主要介紹了springboot3.4和mybatis plus的版本問題的解決,主要由于Spring Boot 3.4與MyBatis-Plus版本不匹配導(dǎo)致分頁功能問題,下面就來解決這個問題,感興趣的可以了解一下
    2025-03-03
  • Java Chassis3注冊中心分區(qū)隔離技術(shù)解密

    Java Chassis3注冊中心分區(qū)隔離技術(shù)解密

    這篇文章主要為大家介紹了Java Chassis3注冊中心分區(qū)隔離技術(shù)解密,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2024-01-01
  • Java中基于推、拉模式的sentinel規(guī)則持久化詳解

    Java中基于推、拉模式的sentinel規(guī)則持久化詳解

    這篇文章主要介紹了Java中基于推、拉模式的sentinel規(guī)則持久化詳解,推模式是sentinelDashboard?把規(guī)則推給Nacos,Nacos監(jiān)聽規(guī)則的變化推給微服務(wù),拉模式是sentinelDashboard?把規(guī)則直接給微服務(wù),?Nacos定時的同步微服務(wù)端的規(guī)則,需要的朋友可以參考下
    2023-09-09

最新評論