1. 程式人生 > >MyBatis【二】快速入門

MyBatis【二】快速入門

1.MyBatis框架的引入

我們來看看傳統的程式設計方式中使用jdbc的問題:

  • 1.資料庫連線頻繁的建立和關閉,缺點:浪費資料庫的資源,影響操作效率。解決方法:使用資料庫連線池如c3p0.
  • 2.sql語句是硬編碼(不利用系統維護),如果需求變更需要修改sql,這時候就需要修改java程式碼,然後需要重新編譯,系統不易維護。解決方法:將sql語句統一配置在檔案中。這樣以後修改sql時就不需要修改java程式碼了。
  • 3.我們通過preparedStatement物件向佔位符設定引數,存在硬編碼(引數位置、引數)問題,系統不易維護。解決方法:將sql中的佔位符及對應的引數型別配置在配置檔案中,能夠自動輸入的對映。
  • 4.遍歷查詢結果集存在硬編碼(列名)。解決方法:自動進行sql查詢結果向java物件的對映(輸出對映)。

2.MyBatis介紹

MyBatis 本是apache的一個開源專案iBatis, 2010年這個專案由apache software foundation 遷移到了google code,並且改名為MyBatis,實質上Mybatis對ibatis進行一些改進。 目前mybatis在github上託管。

MyBatis是一個優秀的持久層框架,它對jdbc的操作資料庫的過程進行封裝,使開發者只需要關注 SQL 本身,而不需要花費精力去處理例如註冊驅動、建立connection、建立statement、手動設定引數、結果集檢索等jdbc繁雜的過程程式碼。

MyBatis通過xml或註解的方式將要執行的各種statement(statement、preparedStatemnt、CallableStatement)配置起來,並通過java物件和statement中的sql進行對映生成最終執行的sql語句,最後由mybatis框架執行sql並將結果對映成java物件並返回。

3.MyBatis架構

這裡寫圖片描述
接下來我將通過對一張使用者表進行增、刪、改、查帶你快速入門MyBatis。

4.MyBatis快速入門

4.1準備開發環境

1.建立測試專案,普通java專案或是web專案都可。

2.匯入jar包:mybatis-3.1.1.jar(低於這個版本的jar包需要匯入很多依賴包)和mysql-connection-java

3.建立資料庫和相應的表,SQL指令碼如下:

createdatabase mybatis;

use mybatis;

createtableuser(
id intprimarykey auto_increment,
username varchar(50),
birthday date,
sex varchar(20),
address carchar(50)
);

insertintouservalues(null,'xxw','1996-10-17','male',null);

insertintouservalues(null,'wyr','1997-04-24','female',null);
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16

到此,環境配置就告一段落。

4.2使用MyBatis查詢表中資料(通過id查詢)

1.新增Mybatis的配置檔案SqlMapConfig.xml

在src目錄下建立一個SqlMapConfig.xml檔案(檔名稱隨便起),內容如下:

這裡寫圖片描述
2.定義表所需要的實體類User.java

程式碼如下:

public class User
{
    private int id;
    private String username;
    private Date birthday;
    private String sex;
    private String address;

    public int getId() {
        return id;
    }

    public void setId(int id)
    {
        this.id = id;
    }

    public String getUsername() {
        return username;
    }

    public void setUsername(String username) {
        this.username = username;
    }

    public Date getBirthday(){
        return birthday;
    }

    public void setBirthday(Date birthday) {
        this.birthday = birthday;
    }

    public String getSex() {
        return sex;
    }

    public void setSex(String sex) {
        this.sex = sex;
    }

    public String getAddress(){
        return address;
    }

    public void setAddress(String address) {
        this.address = address;
    }

    @Override
    public String toString() {
        return "domain.User{" +
               "id=" + id +
               ", username='" + username + '\'' +
               ", birthday=" + birthday +
               ", sex='" + sex + '\'' +
               ", address='" + address + '\'' +
               '}';
    }
   }
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60

3.定義操作user表的sql對映檔案User.xml
這裡我們沒將檔案命名為userMapper.xml,後面我們會改。

User.xml檔案內容如下:

這裡寫圖片描述

在User.xml中寫SQL語句,在引數處使用佔位符#{},應該注意的是大括號{}中傳入的資料應該與User.java中的屬性對應,檔案中各個屬性的解釋見圖中註釋處。

4.在SqlMapConfig檔案中註冊User.xml檔案
在SqlMapConfig.xml中新增一個欄位,並在裡面傳入User.xml檔案路徑。

這裡寫圖片描述

整體結構如下:

這裡寫圖片描述

5.接下來我們便可以藉助上面MyBatis架構圖來編寫測試類了

這裡寫圖片描述

注意,我是藉助junit.jar包來編寫的測試類。輸出結果如下:

這裡寫圖片描述

上面我們是通過id來對錶進行查詢,接下來我要講講如何通過姓名來模糊查詢表。

4.3使用MyBatis根據使用者名稱模糊查詢使用者資訊

1.需要在User.xml檔案中新增如下欄位:

這裡寫圖片描述

此時,我們在傳入引數的地方不再使用佔位符#{}而是使用${},二者區別如下:

  • #{}:1.表示一個佔位符,向佔位符輸入引數,mybatis自動進行java型別和jdbc型別的轉換。2.程式設計師不需要考慮引數的型別,比如:傳入字串,mybatis最終拼接好的sql就是引數兩邊加單引號。3.#{}接收pojo(Plain Old Java Object Java資料物件)資料,可以使用OGNL(就是el表示式)解析出pojo的屬性值。
  • ${}:1.表示sql的拼接,通過接收参数,将参数的内容不加任何修饰拼接在sql中。2.” role=”presentation” style=”position: relative;”>sql2.接收引數,將引數的內容不加任何修飾拼接在sql中。2.{}也可以接收pojo資料,可以使用OGNL解析出pojo的屬性值。3.缺點:不能防止sql注入。

2.測試類程式碼如下:

這裡寫圖片描述

注意,此時我們通過name查詢出來的語句為多條,故此時我們應該選擇呼叫sqlSession物件的selectList()方法返回多條記錄,輸出我們查詢到的第一條記錄即可。若使用selectOne()方法,當返回的記錄為多條時就會發生異常。

這樣我們便完成了查詢時將sql結果輸出對映到Java物件中。那如何將Java物件輸入對映到sql語句中,接下來我們就來講通過MyBatis實現增、刪、改資料庫。

4.4使用MyBatis向表中插入一條記錄

1.在User.xml中新增如下欄位:

這裡寫圖片描述

貌似關鍵字為value和values都可以…

2.編寫測試類:

這裡寫圖片描述

此時檢視資料庫:

這裡寫圖片描述

發現數據已被插入。

擴充套件:主鍵返回:

在測試類中,我們沒有給User物件的id屬性設定值,所以我們在測試類中嘗試輸出User物件的id時會輸出id=0,但是該物件通過輸入對映在資料庫中是有對應的id值的(因為我們為該欄位設定了自增長屬性)。那麼我們想輸出該物件在記錄中的id時,又該怎麼做呢?只需在User.xml檔案中的< insert>標籤中新增< selectKey>標籤即可,屬性解釋見圖:

這裡寫圖片描述

此時我們在測試類中便可輸出該User物件插入在表中的記錄id值了。

這裡我們由於在建表時設定了id欄位為自增長,採用自增長的形式生成主鍵,所以我們在傳入User物件的id屬性時可以將該屬性設定為null。那麼當我們使用uuid生成主鍵時又該怎麼做呢?

只需在User.xml中新增如下欄位:
這裡寫圖片描述

屬性值”before”的意思表示在執行插入操作時,會先呼叫uuid()函式生成uuid得到主鍵,然後將主鍵設定到User物件中,再將User物件插入到資料庫。所以此時我們在測試類中也可以不對User的id屬性進行設定值。

4.5使用MyBatis實現刪除表中資料

接下來的操作就很輕鬆了,因為跟上述操作差不多。

1.在User.xml檔案中新增如下欄位:

這裡寫圖片描述

2.編寫測試類:

這裡寫圖片描述

執行程式後便可發現數據庫中的該資料已被刪除。

4.6使用MyBatis實現更新表中資料

1.在User.xml檔案中新增如下欄位:

這裡寫圖片描述

2.編寫測試類:

這裡寫圖片描述

執行程式後便可發現數據庫中的該資料已被更新。

5.MyBatis開發流程小結

寫過上述程式碼,我們便可以對MyBatis的開發流程進行一下總結了,流程如下:

  • 1.編寫SqlMapConfig.xml
  • 2.編寫mapper.xml(每個欄位定義一個statement)
  • 3.程式設計通過配置檔案建立SqlSessionFactory
  • 4.通過SqlSessionFactory獲取SqlSession物件。
  • 5.通過SqlSession操作資料庫。(如果執行新增、更新、刪除需要呼叫SqlSession.commit())
  • 6.SqlSesion使用完成要關閉。

關於MyBatis配置的一些優化及高階知識請見我後面的文章。