關(guān)于mybatis3中@SelectProvider的使用問(wèn)題
mybatis3中增加了使用注解來(lái)配置Mapper的新特性,本篇文章主要介紹其中幾個(gè)@Provider的使用方式,他們是:@SelectProvider、@UpdateProvider、@InsertProvider和@DeleteProvider。
1.使用@SelectProvider
@SelectProvider是聲明在方法基本上的,這個(gè)方法定義在Mapper對(duì)應(yīng)的的interface上。
public interface UserMapper { @SelectProvider(type = SqlProvider.class, method = "selectUser") @ResultMap("userMap") public User getUser(long userId); }
上例中是個(gè)很簡(jiǎn)單的Mapper接口,其中定義了一個(gè)方法:getUser,這個(gè)方法根據(jù)提供的用戶id來(lái)查詢用戶信息,并返回一個(gè)User實(shí)體bean。
這是一個(gè)很簡(jiǎn)單很常用的查詢場(chǎng)景:根據(jù)key來(lái)查詢記錄并將結(jié)果封裝成實(shí)體bean。其中:
@SelectProvider注解用于生成查詢用的sql語(yǔ)句,有別于@Select注解,@SelectProvide指定一個(gè)Class及其方法,并且通過(guò)調(diào)用Class上的這個(gè)方法來(lái)獲得sql語(yǔ)句。在我們這個(gè)例子中,獲取查詢sql的方法是SqlProvider.selectUser。
@ResultMap注解用于從查詢結(jié)果集RecordSet中取數(shù)據(jù)然后拼裝實(shí)體bean。
2.定義拼裝sql的類
@SelectProvide中type參數(shù)指定的Class類,必須要能夠通過(guò)無(wú)參的構(gòu)造函數(shù)來(lái)初始化。
@SelectProvide中method參數(shù)指定的方法,必須是public的,返回值必須為String,可以為static。
public class SqlProvider { public String selectUser(long userId) { return "select * from user where userId=" + userId; } }
3.無(wú)參數(shù)@SelectProvide方法##
在Mapper接口方法上和@SelectProvide指定類方法上,均無(wú)參數(shù):
UserMapper.java: @SelectProvider(type = SqlProvider.class, method = "selectAllUser") @ResultMap("userMap") public List<User> getAllUser();
SqlProvider.java: public String selectAllUser() { return "select * from user"; }
4.一個(gè)參數(shù)的@SelectProvide方法
對(duì)于只有一個(gè)參數(shù)的情況,可以直接使用,參見前面的getUser和selectUser。
但是,如果在getUser方法中,對(duì)userId方法使用了@Param注解的話,那么相應(yīng)selectUser方法必須接受Map<String, Object>做為參數(shù):
UserMapper.java: @SelectProvider(type = SqlProvider.class, method = "selectUser2") @ResultMap("userMap") public User getUser2(@Param("userId") long userId);
SqlProvider.java: public String selectUser2(Map<String, Object> para) { return "select * from user where userId=" + para.get("userId"); }
5.更多參數(shù)的@SelectProvide方法
在超過(guò)一個(gè)參數(shù)的情況下,@SelectProvide方法必須接受Map<String, Object>做為參數(shù),
如果參數(shù)使用了@Param注解,那么參數(shù)在Map中以@Param的值為key,如下例中的userId;
如果參數(shù)沒(méi)有使用@Param注解,那么參數(shù)在Map中以參數(shù)的順序?yàn)閗ey,如下例中的password:
UserMapper.java: @SelectProvider(type = SqlProvider.class, method = "selectUserCheck") @ResultMap("userMap") public User getUserCheck(@Param("userId") long userId, String password);
SqlProvider.java: public String selectUserCheck(Map<String, Object> para) { return "select * from user where userId=" + para.get("userId") + " and password='" + para.get("1") + "'"; }
6.一些限制
在Mapper接口和@SelectProvide方法類中,不要使用重載,也就是說(shuō),不要使用方法名相同參數(shù)不同的方法,以避免發(fā)生詭異問(wèn)題。
實(shí)例
@Repository public interface FqzRlMapInfoMapper { @SelectProvider(type = FqzRlMapInfoProvider.class, method = "findRelationInfos") List<RelationInfo> findRelationInfos(Collection<String> flags); class FqzRlMapInfoProvider { public String findRelationInfos(Collection<String> flags) { String inStr = String.join("','", flags); StringBuilder sb = new StringBuilder(); sb.append("select * from dm_screen_fqz_mapdata_2_b where 1=1 "); if (null == flags || flags.size() == 0) { sb.append(" and 1<>1 "); } else { sb.append(" and relate_flag in ('").append(inStr).append("')"); } return sb.toString(); } } }
到此這篇關(guān)于mybatis3中@SelectProvider的使用技巧的文章就介紹到這了,更多相關(guān)mybatis3中@SelectProvider使用內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
使用java代碼代替xml實(shí)現(xiàn)SSM教程
這篇文章主要介紹了使用java代碼代替xml實(shí)現(xiàn)SSM教程,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-12-12SpringBoot實(shí)現(xiàn)全局異常處理方法總結(jié)
在項(xiàng)目開發(fā)中出現(xiàn)異常時(shí)很平常不過(guò)的事情,我們處理異常也有很多種方式。本文將詳細(xì)為大家講解SpringBoot實(shí)現(xiàn)全局異常處理幾種方法,感興趣的可以學(xué)習(xí)一下2022-03-03Java面試之限流的實(shí)現(xiàn)方式小結(jié)
限流是指在各種應(yīng)用場(chǎng)景中,通過(guò)技術(shù)和策略手段對(duì)數(shù)據(jù)流量、請(qǐng)求頻率或資源消耗進(jìn)行有計(jì)劃的限制,本文為大家整理了常見的限流的實(shí)現(xiàn)方式,有需要的可以參考下2024-02-02Maven多模塊之父子關(guān)系的創(chuàng)建
這篇文章主要介紹了Maven多模塊之父子關(guān)系的創(chuàng)建,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2019-03-03SpringBoot源碼分析之bootstrap.properties文件加載的原理
本文通過(guò)訪問(wèn)看到bootstrap.properties中的信息獲取到了,同時(shí)age也被application.properties中的屬性覆蓋掉了。加載順序到底是什么?為什么會(huì)覆蓋呢?我們接下來(lái)分析下吧2021-12-12Java批量操作文件系統(tǒng)的實(shí)現(xiàn)示例
文件上傳和下載是java web中常見的操作,本文主要介紹了Java批量操作文件系統(tǒng)的實(shí)現(xiàn)示例,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2024-03-03JFinal實(shí)現(xiàn)偽靜態(tài)的方法
JFinal 是基于 Java 語(yǔ)言的極速 WEB + ORM 框架,其核心設(shè)計(jì)目標(biāo)是開發(fā)迅速、代碼量少、學(xué)習(xí)簡(jiǎn)單、功能強(qiáng)大、輕量級(jí)、易擴(kuò)展、Restful。這篇文章主要介紹了JFinal實(shí)現(xiàn)偽靜態(tài),需要的朋友可以參考下2018-04-04