1. 程式人生 > 其它 >4.MyBatis執行SQL的兩種方式

4.MyBatis執行SQL的兩種方式

本節主要介紹 MyBatis 執行 SQL 語句的兩種方式和它們的區別。

MyBatis 有兩種執行 SQL 語句的方式,如下:

  1. 通過 SqlSession 傳送 SQL
  2. 通過 SqlSession 獲取 Mapper 介面,通過 Mapper 介面傳送 SQL

一、SqlSession傳送SQL

有對映器之後就可以通過 SqlSession 傳送 SQL 了。我們以 getWebsite 這條 SQL 為例看看如何傳送 SQL。

  • Website website = (Website)sqlSession.selectOne("net.biancheng.mapper.WebsiteMapper.getWebsite"
    ,1);

MyBatis 常用的查詢方法有 2 種,分別為 selectOne 和 selectList。

1)selectOne

selectOne 方法表示使用查詢並且只返回一個物件,必須指定查詢條件。只能查詢 0 或 1 條記錄,大於 1 條記錄則執行錯誤。常用格式如下(也有其它過載方法,根據需要選擇)。

  • sqlSession.selectOne(String arg0, Object arg1)

2)selectList

selectList 方法表示使用查詢並且返回一個列表。可以查詢 0 或 N 條記錄。常用格式如下。

  • sqlSession.selectOne(String
    arg0)

也可指定引數:

  • sqlSession.selectList(String arg0, Object arg1)

以上語法格式中,String 物件由一個名稱空間加 SQL id 組合而成,它完全定位了一條 SQL,這樣 MyBatis 就會找到對應的 SQL。Object 物件為需要傳遞的引數,也就是查詢條件。

selectOne 實現的 selectList 都可以實現,即 list 中只有一個物件。但 selectList 能實現的,selectOne 不一定能實現。

如果 MyBatis 中只有一個 id 為 getWbsite 的 SQL,那麼也可以簡寫為:

  • Website website = (Website )sqlSession.selectOne("getWbsite",1);

這是 MyBatis 前身 iBatis 所留下的方式。

二、Mapper介面傳送 SQL

SqlSession 還可以獲取 Mapper 介面,通過 Mapper 介面傳送 SQL,如下所示。

  • WebsiteMapper websiteMapper = sqlSession.getMapper(WebsiteMapper.class);
  • Website website = websiteMapper.getWebsite(1);

通過 SqlSession 的 getMapper 方法獲取一個 Mapper 介面,然後就可以呼叫它的方法了。因為 XML 檔案或者介面註解定義的 SQL 都可以通過“類的全限定名+方法名”查詢,所以 MyBatis 會啟用對應的 SQL 執行,並返回結果。

三、區別

上面分別講解了 MyBatis 兩種傳送 SQL 的方式,一種用 SqlSession 直接傳送,另外一種通過 SqlSession 獲取 Mapper 介面再發送。筆者建議採用 Mapper 介面傳送 SQL 的方式,理由如下:

  • 使用 Mapper 介面程式設計可以消除 SqlSession 帶來的功能性程式碼,提高可讀性,而 SqlSession 傳送 SQL,需要一個 SQL id 去匹配 SQL,比較晦澀難懂。
  • 使用 Mapper 介面,類似 websiteMapper.getWebsite(1) 則是完全面向物件的語言,更能體現業務的邏輯。
  • 使用 websiteMapper.getWebsite(1) 方式,IDE 會提示錯誤和校驗,而使用 sqlSession.selectOne("getWebsite",1L) 語法,只有在執行中才能知道是否會產生錯誤。


目前使用 Mapper 介面程式設計已成為主流,尤其在 Spring 中運用 MyBatis 時,Mapper 介面的使用就更為簡單,所以本教程使用 Mapper 介面的方式討論 MyBatis。