走進JavaWeb技術世界14:Mybatis入門

本系列文章將整理到我在GitHub上的《Java面試指南》倉庫,更多精彩內容請到個人倉庫裏查看html

https://github.com/h2pl/Java-Tutorial前端

喜歡的話麻煩點下Star哈java

文章首發於個人我的博客:python

www.how2playlife.commysql

本文是微信公衆號【Java技術江湖】的《走進JavaWeb技術世界》其中一篇,本文部份內容來源於網絡,爲了把本文主題講得清晰透徹,也整合了不少我認爲不錯的技術博客內容,引用其中了一些比較好的博客文章,若有侵權,請聯繫做者。該系列博文會告訴你如何從入門到進階,從servlet到框架,從ssm再到SpringBoot,一步步地學習JavaWeb基礎知識,並上手進行實戰,接着瞭解JavaWeb項目中常常要使用的技術和組件,包括日誌組件、Maven、Junit,等等內容,以便讓你更完整地瞭解整個Java Web技術體系,造成本身的知識框架。爲了更好地總結和檢驗你的學習成果,本系列文章也會提供每一個知識點對應的面試題以及參考答案。android

若是對本系列文章有什麼建議,或者是有什麼疑問的話,也能夠關注公衆號【Java技術江湖】聯繫做者,歡迎你參與本系列博文的創做和修訂。git

前言

學習一個新東西前,若是能對他有一個比較直觀的印象與定位,那麼接下來的學習過程就會順暢不少。因此本文主要是我對Mybatis的一個簡單入門性的總結介紹(前提仍是須要些必要的概念認知)。PS:文末有參考列表程序員

Mybatis是什麼

Mybatis是一個持久層框架,用於數據的持久化。主要表現爲將SQL與POJO進行一個映射,將SQL從代碼中解耦。基本概念如圖:github

使用時,以User爲例,UserMapper定義了findById接口,該接口返回一個User對象,接口的實現爲一個xml配置文件。該xml文件中定義對應接口中的實現所須要的SQL。從而達到將SQL與代碼解耦的目標。面試

<?xml version="1.0" encoding="UTF-8"?>  
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"   
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">  

<mapper namespace="com.mybatis.UserMapper">  

    <select id="findById" parameterType="int" resultType="User">  
        select user_id id,user_name userName,user_age age from t_user where user_id=#{id}  
    </select>  

</mapper> 
複製代碼

        MyBatis 是Apache的一個Java開源項目,是一款優秀的持久層框架,它支持定製化 SQL、存儲過程以及高級映射。Mybatis能夠將Sql語句配置在XML文件中,避免將Sql語句硬編碼在Java類中。

特色

1.Mybatis經過參數映射方式,能夠將參數靈活的配置在SQL語句中的配置文件中,避免在Java類中配置參數(JDBC)

2.Mybatis經過輸出映射機制,將結果集的檢索自動映射成相應的Java對象,避免對結果集手工檢索(JDBC)

3.Mybatis能夠經過Xml配置文件對數據庫鏈接進行管理

核心類介紹

1.SqlSessionaFactoryBuilder :該類主要用於建立 SqlSessionFactory, 這個類能夠被實例化、使用和丟棄,一旦建立了 SqlSessionFactory,就再也不須要它了。 所以 SqlSessionFactoryBuilder 實例的最佳做用域是方法做用域(也就是局部方法變量)。

2.SqlSessionFactory :該類的做用了建立 SqlSession, 從名字上咱們也能看出, 該類使用了工廠模式, 每次應用程序訪問數據庫, 咱們就要經過 SqlSessionFactory 建立 SqlSession, 因此 SqlSessionFactory 和整個 Mybatis 的生命週期是相同的. 這也告訴咱們不能建立多個同一個數據的 SqlSessionFactory, 若是建立多個, 會消耗盡數據庫的鏈接資源, 致使服務器夯機. 應當使用單例模式. 避免過多的鏈接被消耗, 也方便管理。

3.SqlSession :SqlSession 至關於一個會話, 每次訪問數據庫都須要這樣一個會話, 你們可能會想起了 JDBC 中的 Connection, 很相似, 但仍是有區別的, 況且如今幾乎全部的鏈接都是使用的鏈接池技術, 用完後直接歸還而不會像 Session 同樣銷燬. 注意: 他是一個線程不安全的對象, 在設計多線程的時候咱們須要特別的小心, 操做數據庫須要注意其隔離級別, 數據庫鎖等高級特性, 此外, 每次建立的 SqlSession 都必須及時關閉它, 它長期存在就會使數據庫鏈接池的活動資源減小, 對系統性能的影響很大, 咱們通常在 finally 塊中將其關閉. 還有, SqlSession 存活於一個應用的請求和操做, 能夠執行多條 Sql, 保證事務的一致性。SqlSession在執行過程當中,有包含了幾大對象:

         3.1.Executor :執行器,由它調度 StatementHandler、ParameterHandler、ResultSetHandler 等來執行對應的 SQL。其中 StatementHandler 是最重要的。

         3.2.StatementHandler :做用是使用數據庫的 Statement(PreparedStatement)執行操做,它是四大對象的核心,起到承上啓下的做用,許多重要的插件都是經過攔截它來實現的。

         3.3.ParamentHandler :用來處理 SQL 參數的。

         3.4.ResultSetHandler :進行數據集的封裝返回處理的。

4.Mapper :映射器是一些由你建立的、綁定你映射的語句的接口。映射器接口的實例是從 SqlSession 中得到的, 他的做用是發送 SQL, 而後返回咱們須要的結果. 或者執行 SQL 從而更改數據庫的數據, 所以它應該在 SqlSession 的事務方法以內, 在 Spring 管理的 Bean 中, Mapper 是單例的。

功能架構:咱們把Mybatis的功能架構分爲三層

(1)API接口層:提供給外部使用的接口API,開發人員經過這些本地API來操縱數據庫。接口層一接收到調用請求就會調用數據處理層來完成具體的數據處理。

(2)數據處理層:負責具體的SQL查找、SQL解析、SQL執行和執行結果映射處理等。它主要的目的是根據調用的請求完成一次數據庫操做。

(3)基礎支撐層:負責最基礎的功能支撐,包括鏈接管理、事務管理、配置加載和緩存處理,這些都是共用的東西,將他們抽取出來做爲最基礎的組件。爲上層的數據處理層提供最基礎的支撐。

框架結構:

(1)加載配置:配置來源於兩個地方,一處是配置文件,一處是Java代碼的註解,將SQL的配置信息加載成爲一個個MappedStatement對象(包括了傳入參數映射配置、執行的SQL語句、結果映射配置),存儲在內存中。

(2)SQL解析:當API接口層接收到調用請求時,會接收到傳入SQL的ID和傳入對象(能夠是Map、JavaBean或者基本數據類型),Mybatis會根據SQL的ID找到對應的MappedStatement,而後根據傳入參數對象對MappedStatement進行解析,解析後能夠獲得最終要執行的SQL語句和參數。

(3)SQL執行:將最終獲得的SQL和參數拿到數據庫進行執行,獲得操做數據庫的結果。

(4)結果映射:將操做數據庫的結果按照映射的配置進行轉換,能夠轉換成HashMap、JavaBean或者基本數據類型,並將最終結果返回。

執行流程:

1.獲取SqlsessionFactory:根據配置文件(全局、sql映射)初始化configuration對象,

2.獲取sqlSession:建立一個DefaultSqlSession對象,包含Configuration及Executor(根據全局配置文件中defaultExecutorType建立對應的Executor)

3.獲取接口代理對象MapperProxy:DefaultSqlSession.getMapper拿到Mapper接口對應的MapperProxy

4.執行增刪改查

     一、調用DefaultSqlSession增刪改查

     二、建立StatementHandler (同時建立ParameterHandler,ResultSetHandler)

     三、調用StatementHandler預編譯參數以及設置參數值,使用ParameterHandler給sql設置參數

     四、調用StatementHandler增刪改查

     五、ResultSetHandler封裝結果

與Hibernate的異同

Mybatis開始逐漸流行起來,必然有其緣由,簡單瞭解了一下它與同爲持久層框架的Hibernate的異同。

  • 映射模式
    從上面的簡單概念能夠知道Mybatis實際上着力點在POJO與SQL的映射。而Hibernate則主要是POJO與數據庫表的對象關係映射。前者掌控力度更細,代碼量會相對多一點,後者靈活性則差一點,更爲自動化一些,與PHP裏的Eloquent屬於同類型。
  • 性能
    Mybatis基於原生JDBC,相比於對JDBC進行二次封裝的Hibernate性能會更好一點。
  • 開發與維護
    Hibernate配置好實體類後,使用起來是比較簡潔,舒服的,可是前期學習曲線比較陡,後期調優比較麻煩。Mybatis對SQL掌控的顆粒更細一點,相比較而言看上去簡陋些。因爲直接映射SQL,遷移性是個問題。

參考文章

https://blog.csdn.net/android_hl/article/details/53228348

微信公衆號

我的公衆號:黃小斜

黃小斜是跨考軟件工程的 985 碩士,自學 Java 兩年,拿到了 BAT 等近十家大廠 offer,從技術小白成長爲阿里工程師。

做者專一於 JAVA 後端技術棧,熱衷於分享程序員乾貨、學習經驗、求職心得和程序人生,目前黃小斜的CSDN博客有百萬+訪問量,知乎粉絲2W+,全網已有10W+讀者。

黃小斜是一個斜槓青年,堅持學習和寫做,相信終身學習的力量,但願和更多的程序員交朋友,一塊兒進步和成長!

原創電子書:關注公衆號【黃小斜】後回覆【原創電子書】便可領取我原創的電子書《菜鳥程序員修煉手冊:從技術小白到阿里巴巴Java工程師》

程序員3T技術學習資源: 一些程序員學習技術的資源大禮包,關注公衆號後,後臺回覆關鍵字 「資料」 便可免費無套路獲取。

考研複習資料:計算機考研大禮包,都是我本身考研複習時用的一些複習資料,包括公共課和專業的複習視頻,這裏也推薦給你們,關注公衆號後,後臺回覆關鍵字 「考研」 便可免費獲取。

mybatis新手上路

MyBatis簡介

Mybatis是Apache的一個Java開源項目,是一個支持動態Sql語句的持久層框架。Mybatis能夠將Sql語句配置在XML文件中,避免將Sql語句硬編碼在Java類中。與JDBC相比:

  1. Mybatis經過參數映射方式,能夠將參數靈活的配置在SQL語句中的配置文件中,避免在Java類中配置參數(JDBC)
  2. Mybatis經過輸出映射機制,將結果集的檢索自動映射成相應的Java對象,避免對結果集手工檢索(JDBC)
  3. Mybatis能夠經過Xml配置文件對數據庫鏈接進行管理。

MyBatis總體架構及運行流程

Mybatis總體構造由 數據源配置文件、Sql映射文件、會話工廠、會話、執行器和底層封裝對象組成。

1.數據源配置文件

經過配置的方式將數據庫的配置信息從應用程序中獨立出來,由獨立的模塊管理和配置。Mybatis的數據源配置文件包含數據庫驅動、數據庫鏈接地址、用戶名密碼、事務管理等,還能夠配置鏈接池的鏈接數、空閒時間等。

一個SqlMapConfig.xml基本的配置信息以下:

 
 
 
 
  
  
  
  
  
  
  
  
  
  
  
   
    
     
     
     
     
      
      
      
       
      
     
    
  
 
 
 
 

2.Sql映射文件

Mybatis中全部數據庫的操做都會基於該映射文件和配置的sql語句,在這個配置文件中能夠配置任何類型的sql語句。框架會根據配置文件中的參數配置,完成對sql語句以及輸入輸出參數的映射配置。

Mapper.xml配置文件大體以下:

 
 
 
 
  
  
  
  
  
  
  
  
 
 
 
 

3.會話工廠與會話

Mybatis中會話工廠SqlSessionFactory類能夠經過加載資源文件,讀取數據源配置SqlMapConfig.xml信息,從而產生一種能夠與數據庫交互的會話實例SqlSession,會話實例SqlSession根據Mapper.xml文件中配置的sql,對數據庫進行操做。

4.運行流程

會話工廠SqlSessionFactory經過加載資源文件獲取SqlMapConfig.xml配置文件信息,而後生成能夠與數據庫交互的會話實例SqlSession。

會話實例能夠根據Mapper配置文件中的Sql配置去執行相應的增刪改查操做。

在SqlSession會話實例內部,經過執行器Executor對數據庫進行操做,Executor依靠封裝對象Mappered Statement,它分裝了從mapper.xml文件中讀取的信息(sql語句,參數,結果集類型)。

Mybatis經過執行器與Mappered Statement的結合實現與數據庫的交互。

執行流程圖:

測試工程搭建

 1. 新建maven工程

2. 添加依賴pom.xml

 
 
 
 
  
  
  
  
    4.0.0 
  
  
  
  
  
    com.sl 
  
  
  
  
  
    mybatis-demo 
  
  
  
  
  
    0.0.1-SNAPSHOT 
  
  
  
  
   
   
     4.12 
    
   
     3.4.1 
    
   
     5.1.32 
    
   
     1.2.17 
    
  
  
  
  
   
    
    
    
      junit 
     
    
      junit 
     
    
      ${junit.version} 
     
     
    
    
    
    
      org.mybatis 
     
    
      mybatis 
     
    
      ${mybatis.version} 
     
    
    
    
    
      mysql 
     
    
      mysql-connector-java 
     
    
      ${mysql.version} 
     
    
    
    
    
      log4j 
     
    
      log4j 
     
    
      ${log4j.version} 
     
    
  
 
 
 
 

3.編寫數據源配置文件SqlMapConfig.xml

 
 
 
 
 
 
 
 
  
  
  
  
  
  
  
  
  
  
  
   
    
    
     
     
     
      
      
      
       
      
     
    
  
  
  
  
  
  
  
  
   
    
    
  
 
 
 
 

4.編寫SQL映射配置文件productMapper.xml

 
 
 
 
 
 
 
 

<select id="selectAllProduct" resultType="com.sl.po.Product"> select * from products </select>複製代碼

5.編寫測試代碼TestClient.java

//使用productMapper.xml配置文件public class TestClient { //定義會話SqlSessionSqlSession session =null;

@Before public void init() throws IOException { //定義mabatis全局配置文件
        String resource = "SqlMapConfig.xml"; //加載mybatis全局配置文件 //InputStream inputStream = TestClient.class.getClassLoader().getResourceAsStream(resource);
 InputStream inputStream = Resources.getResourceAsStream(resource);
        SqlSessionFactoryBuilder builder = new SqlSessionFactoryBuilder();
        SqlSessionFactory factory = builder.build(inputStream); //根據sqlSessionFactory產生會話sqlsession
        session = factory.openSession();    
    } //查詢全部user表全部數據
 @Test public void testSelectAllUser() {
        String statement = "com.sl.mapper.ProductMapper.selectAllProduct";
        List<Product> listProduct =session.selectList(statement); for(Product product:listProduct)
        {
            System.out.println(product);
        } //關閉會話
 session.close();    
    }複製代碼

}

public class Product { private int Id; private String Name; private String Description; private BigDecimal UnitPrice; private String ImageUrl; private Boolean IsNew; public int getId() { return Id;} public void setId(int id) { this.Id = id;} public String getName() { return Name;} public void setName(String name) { this.Name = name;} public String getDescription() { return Description;} public void setDescription(String description) { this.Description = description;} public BigDecimal getUnitPrice() { return UnitPrice;} public void setUnitPrice(BigDecimal unitprice) { this.UnitPrice = unitprice;} public String getImageUrl() { return Name;} public void setImageUrl(String imageurl) { this.ImageUrl = imageurl;} public boolean getIsNew() { return IsNew;} public void setIsNew(boolean isnew) { this.IsNew = isnew;}

@Override public String toString() { return "Product [id=" + Id + ", Name=" + Name + ", Description=" + Description + ", UnitPrice=" + UnitPrice + ", ImageUrl=" + ImageUrl + ", IsNew=" + IsNew+ "]";
    }
}</pre>複製代碼

6.運行測試用例

微信公衆號

我的公衆號:程序員黃小斜

​黃小斜是 985 碩士,阿里巴巴Java工程師,在自學編程、技術求職、Java學習等方面有豐富經驗和獨到看法,但願幫助到更多想要從事互聯網行業的程序員們。​做者專一於 JAVA 後端技術棧,熱衷於分享程序員乾貨、學習經驗、求職心得,以及自學編程和Java技術棧的相關乾貨。​黃小斜是一個斜槓青年,堅持學習和寫做,相信終身學習的力量,但願和更多的程序員交朋友,一塊兒進步和成長!

原創電子書:關注微信公衆號【程序員黃小斜】後回覆【原創電子書】便可領取我原創的電子書《菜鳥程序員修煉手冊:從技術小白到阿里巴巴Java工程師》這份電子書總結了我2年的Java學習之路,包括學習方法、技術總結、求職經驗和麪試技巧等內容,已經幫助不少的程序員拿到了心儀的offer!

程序員3T技術學習資源: 一些程序員學習技術的資源大禮包,關注公衆號後,後臺回覆關鍵字 「資料」 便可免費無套路獲取,包括Java、python、C++、大數據、機器學習、前端、移動端等方向的技術資料。

技術公衆號:Java技術江湖

若是你們想要實時關注我更新的文章以及分享的乾貨的話,能夠關注個人微信公衆號【Java技術江湖】

這是一位阿里 Java 工程師的技術小站。做者黃小斜,專一 Java 相關技術:SSM、SpringBoot、MySQL、分佈式、中間件、集羣、Linux、網絡、多線程,偶爾講點Docker、ELK,同時也分享技術乾貨和學習經驗,致力於Java全棧開發!

Java工程師必備學習資源:關注公衆號後回覆」Java「便可領取 Java基礎、進階、項目和架構師等免費學習資料,更有數據庫、分佈式、微服務等熱門技術學習視頻,內容豐富,兼顧原理和實踐,另外也將贈送做者原創的Java學習指南、Java程序員面試指南等乾貨資源

個人公衆號

相關文章
相關標籤/搜索