【Mybatis】 -- 應用分析

JDBC連接數據庫的問題

1.代碼重複
2.結果集處理複雜,需要手動處理,對應表的字段和類型
3連接管理複雜 ,需要手動打開和關閉連接
4.sql寫到了業務邏輯裏面 耦合度太高 不利於管理

mybatis特性

  • 使用連接池對連接進行管理
  • sql和代碼分離,集中管理
  • 參數映射和動態sql
  • 結果集映射
  • 緩存管理
  • 重複sql的提取
  • 插件機制

工作流程圖

在這裏插入圖片描述

核心對象的生命週期

在編程式使用的這個 demo 裏面,我們看到了 MyBatis 裏面的幾個核心對象:SqlSessionFactoryBuiler、SqlSessionFactory、SqlSession 和 Mapper 對象。這幾個核心對象在 MyBatis 的整個工作流程裏面的不同環節發揮作用。如果說我們不用容器,自己去管理這些對象的話,我們必須思考一個問題:什麼時候創建和銷燬這些對象?
在一些分佈式的應用裏面,多線程高併發的場景中,如果要寫出高效的代碼,必須瞭解這四個對象的生命週期。這四個對象的聲明週期的描述在官網上面也可以找到。
http://www.mybatis.org/mybatis-3/zh/getting-started.html

我們從每個對象的作用的角度來理解一下,只有理解了它們是幹什麼的,才知道什麼時候應該創建,什麼時候應該銷燬。

1)SqlSessionFactoryBuiler

首 先 是 SqlSessionFactoryBuiler 。 它 是 用 來 構 建 SqlSessionFactory 的 , 而qlSessionFactory 只需要一個,所以只要構建了這一個 SqlSessionFactory,它的使命就完成了,也就沒有存在的意義了。所以它的生命週期只存在於方法的局部。

2)SqlSessionFactory

SqlSessionFactory 是用來創建 SqlSession 的,每次應用程序訪問數據庫,都需要創建一個會話。因爲我們一直有創建會話的需要,所以 SqlSessionFactory 應該存在於應用的整個生命週期中(作用域是應用作用域)。創建 SqlSession 只需要一個實例來做這件事就行了,否則會產生很多的混亂,和浪費資源。所以我們要採用單例模式。

3)SqlSession

SqlSession 是一個會話,因爲它不是線程安全的,不能在線程間共享。所以我們在請求開始的時候創建一個 SqlSession 對象,在請求結束或者說方法執行完畢的時候要及時關閉它(一次請求或者操作中)。

4)Mapper

Mapper(實際上是一個代理對象)是從 SqlSession 中獲取的。BlogMapper mapper = session.getMapper(BlogMapper.class);
它的作用是發送 SQL 來操作數據庫的數據。它應該在一個 SqlSession 事務方法之內。
總結:
在這裏插入圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章