本節(jié)主要介紹 MyBatis 執(zhí)行 SQL 語句的兩種方式和它們的區(qū)別。
MyBatis 有兩種執(zhí)行 SQL 語句的方式,如下:
通過 SqlSession 發(fā)送 SQL
通過 SqlSession 獲取 Mapper 接口,通過 Mapper 接口發(fā)送 SQL
有映射器之后就可以通過 SqlSession 發(fā)送 SQL 了。我們以 getWebsite 這條 SQL 為例看看如何發(fā)送 SQL。
Website website = (Website)sqlSession.selectOne("net.biancheng.mapper.WebsiteMapper.getWebsite",1);
MyBatis 常用的查詢方法有 2 種,分別為 selectOne 和 selectList。
selectOne 方法表示使用查詢并且只返回一個(gè)對象,必須指定查詢條件。只能查詢 0 或 1 條記錄,大于 1 條記錄則運(yùn)行錯(cuò)誤。常用格式如下(也有其它重載方法,根據(jù)需要選擇)。
sqlSession.selectOne(String arg0, Object arg1)
selectList 方法表示使用查詢并且返回一個(gè)列表??梢圆樵?0 或 N 條記錄。常用格式如下。
sqlSession.selectOne(String arg0)
也可指定參數(shù):
sqlSession.selectList(String arg0, Object arg1)
以上語法格式中,String 對象由一個(gè)命名空間加 SQL id 組合而成,它完全定位了一條 SQL,這樣 MyBatis 就會找到對應(yīng)的 SQL。Object 對象為需要傳遞的參數(shù),也就是查詢條件。
selectOne 實(shí)現(xiàn)的 selectList 都可以實(shí)現(xiàn),即 list 中只有一個(gè)對象。但 selectList 能實(shí)現(xiàn)的,selectOne 不一定能實(shí)現(xiàn)。
如果 MyBatis 中只有一個(gè) id 為 getWbsite 的 SQL,那么也可以簡寫為:
Website website = (Website)sqlSession.selectOne("getWbsite",1);
這是 MyBatis 前身 iBatis 所留下的方式。
SqlSession 還可以獲取 Mapper 接口,通過 Mapper 接口發(fā)送 SQL,如下所示。
WebsiteMapper websiteMapper = sqlSession.getMapper(WebsiteMapper.class); Website website = websiteMapper.getWebsite(1);
通過 SqlSession 的 getMapper 方法獲取一個(gè) Mapper 接口,然后就可以調(diào)用它的方法了。因?yàn)?XML 文件或者接口注解定義的 SQL 都可以通過“類的全限定名+方法名”查找,所以 MyBatis 會啟用對應(yīng)的 SQL 運(yùn)行,并返回結(jié)果。
上面分別講解了 MyBatis 兩種發(fā)送 SQL 的方式,一種用 SqlSession 直接發(fā)送,另外一種通過 SqlSession 獲取 Mapper 接口再發(fā)送。筆者建議采用 Mapper 接口發(fā)送 SQL 的方式,理由如下:
使用 Mapper 接口編程可以消除 SqlSession 帶來的功能性代碼,提高可讀性,而 SqlSession 發(fā)送 SQL,需要一個(gè) SQL id 去匹配 SQL,比較晦澀難懂。
使用 Mapper 接口,類似 websiteMapper.getWebsite(1) 則是完全面向?qū)ο蟮恼Z言,更能體現(xiàn)業(yè)務(wù)的邏輯。
使用 websiteMapper.getWebsite(1) 方式,IDE 會提示錯(cuò)誤和校驗(yàn),而使用 sqlSession.selectOne("getWebsite",1L) 語法,只有在運(yùn)行中才能知道是否會產(chǎn)生錯(cuò)誤。
目前使用 Mapper 接口編程已成為主流,尤其在 Spring 中運(yùn)用 MyBatis 時(shí),Mapper 接口的使用就更為簡單,所以本教程使用 Mapper 接口的方式討論 MyBatis。