前言 上篇SSM框架環境搭建篇,演示了我們進行web開發必不可少的一些配置和準備工作,如果這方面還有疑問的地方,可以先參考上一篇“SSM框架開發web項目系列(一) 環境搭建篇”。本文主要介紹MyBatis的基礎內容,包括基本概念、開發步驟、使用實例等。說起MyBatis,工作中做過SSH/SSM相 ...
前言
上篇SSM框架環境搭建篇,演示了我們進行web開發必不可少的一些配置和準備工作,如果這方面還有疑問的地方,可以先參考上一篇“SSM框架開發web項目系列(一) 環境搭建篇”。本文主要介紹MyBatis的基礎內容,包括基本概念、開發步驟、使用實例等。說起MyBatis,工作中做過SSH/SSM相關Web開發的或者正在學習MyBatis的人或多或少都會接觸到類似“MyBatis和Hibernate有什麼區別?”,“MyBatis和Hibernate哪個更好?”,“為什麼Mybatis用的人越來越多?”等等...記得面試問題,區別問的最多,有次被面試官問到更喜歡用哪一個?明明已經知道這個公司介紹用的是SSM了,我答了個Hibernate,並說先用的也是Hibernate,或許初戀的感覺過於深刻吧...誰好誰差這種主觀性問題,我們不爭論,但是不容質疑的是兩者都為企業級開發做出巨大貢獻。同時,帶著問題和求知欲去學習往往會讓學習效率大大提高,因為許多問題在困惑你的同時,也為你指引了方向。就正如你得會用它,理解它了,才知道它在某方面為什麼會不足。
MyBatis介紹
早些時候,Apache有一個開源項目iBatis,後來改名了叫Mybatis,所以我們在網上有時候會看到一些早期的文章有時候看到iBatis,其實是同一個東西。同時,大家可以看下MyBatis源碼工程結構,如下圖,也能發現這個問題。
MyBatis是一個半自動-ORM-持久層框架,下麵分別介紹這三個概念,如果瞭解的的可以直接跳過以節省時間。
首先持久層比較好理解,就是針對資料庫的各種操作持久化層面,我們用jdbc也可以對資料庫中表進行增刪可查;WEB開發分層結構中,類似的還有業務層、控制層,MyBatis所做用的層,主要是用於與資料庫打交道。
其次ORM(Object Relational Mapping,對象關係映射)是一種技術,也是思想,如果用過jdbc的原生方式操作數據的應該都知道,其中各種獲取和更新的操作都已有相關的API了,但是這個過程實在太繁瑣,獲取連接、構造語句、發送SQL和接收數據、最後是處理數據和關閉流等等...實際的工作開發中,顯然不太適用。也許是有人想到,最麻煩的地方在於獲取數據後的處理過程,為了簡化這一過程,以Java中面向對象的思維構造了這一個ORM關係模型,即每張數據表對應一個Java類,數據表中每一條記錄分別對應Java類的一個實體對象,數據表中每個欄位對應Java類中的一個屬性,這樣一來Java中一切皆對象,資料庫里的東西既然已經對應映射到Java概念中來,我們再用面向對象的思維去操作資料庫,就大大簡化了開發流程。
最後,解釋半自動,既然有半自動,應該就有全自動,例如Hibernate就是一個全自動的ORM持久層框架,它在建立資料庫和bean對象關係映射模型的同時,提供的api還會幫助我們自動生成和發送SQL語句去操作資料庫,而MyBatis略有不同,它也建立了對象關係映射模型,但是並不會幫助我們生成SQL語句,需要我們自己寫SQL語句,不少人可能會覺得別人都可以幫你自動生成了這還要自己寫,不是沒事找事嗎?但是恰恰相反,很多人因為這點喜歡上了MyBatis,靈活且透明,自己動手不解釋。
MyBatis重要對象
關於MyBatis的學習使用過程中,依次要註意的四個對象有SqlSessionFactoryBuilder、SqlSessionFactory、SqlSession、Mapper實例。
1.SqlSessionFactoryBuilder
SqlSessionFactoryBuilder是一個類,裡面定義許多重載的build方法,通過build方法可以獲取SqlSessionFactory對象,即SqlSession工廠實例
2.SqlSessionFactory
SqlSessionFactory是一個介面,看名字應該能明白是SqlSession工廠,裡面定義了許多重載的openSession方法,用於獲取SqlSession對象
3.SqlSession
SqlSession是一個很關鍵的介面,通過它我們可以執行發送SQL語句、獲得Mapper實例等等。以它的第一個方法為例, <T> T selectOne(String statement); 方法名很容易理解,獲取數據表的一條記錄(在Java中對應返回一個實體類對象),前面的泛型對應的就是實體類的類型,關於String類型的參數statement,用過原生的JDBC操作資料庫的應該不會陌生,在使用JDBC過程中,有個Statement對象,通過該對象的類似 ResultSet executeQuery(String sql) throws SQLException; 等方法可以發送SQL語句,方法里的字元串類型參數 sql 就是我們要發送的sql語句,而前面的String statement 同樣也是代表我們的sql語句。總的來說,selectOne中的statement代表sql語句,JDBC中的statement是能發送sql語句的對象實例,不可混淆。
4.Mapper實例
Mapper實例就是我們在dao層定義的定義的介面實例,我們在service層中註入dao對象時關聯的是該介面名,而實際上我們拿到了該介面實例也就是Mapper實例。而我們在web開發過程中,持久層的相關方法都定義在Mapper介面中,所以四個對象里我們在前面環境搭建篇比較容易發現的也就是這個Mapper實例所屬介面,即PersonMappr介面。Mapper實例可以通過SqlSession的getMapper方法獲得。
MyBatis配置文件