4.MyBatis執行SQL的兩種方式
本節主要介紹 MyBatis 執行 SQL 語句的兩種方式和它們的區別。
MyBatis 有兩種執行 SQL 語句的方式,如下:
- 通過 SqlSession 傳送 SQL
- 通過 SqlSession 獲取 Mapper 介面,通過 Mapper 介面傳送 SQL
一、SqlSession傳送SQL
有對映器之後就可以通過 SqlSession 傳送 SQL 了。我們以 getWebsite 這條 SQL 為例看看如何傳送 SQL。
- Website website = (Website)sqlSession.selectOne("net.biancheng.mapper.WebsiteMapper.getWebsite"
MyBatis 常用的查詢方法有 2 種,分別為 selectOne 和 selectList。
1)selectOne
selectOne 方法表示使用查詢並且只返回一個物件,必須指定查詢條件。只能查詢 0 或 1 條記錄,大於 1 條記錄則執行錯誤。常用格式如下(也有其它過載方法,根據需要選擇)。
- sqlSession.selectOne(String arg0, Object arg1)
2)selectList
selectList 方法表示使用查詢並且返回一個列表。可以查詢 0 或 N 條記錄。常用格式如下。
- sqlSession.selectOne(String
也可指定引數:
- 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。