关于mybatis3中@SelectProvider的使用问题
mybatis3中增加了使用注解来配置mapper的新特性,本篇文章主要介绍其中几个@provider的使用方式,他们是:@selectprovider、@updateprovider、@insertprovider和@deleteprovider。
1.使用@selectprovider
@selectprovider是声明在方法基本上的,这个方法定义在mapper对应的的interface上。
public interface usermapper { @selectprovider(type = sqlprovider.class, method = "selectuser") @resultmap("usermap") public user getuser(long userid); }
上例中是个很简单的mapper接口,其中定义了一个方法:getuser,这个方法根据提供的用户id来查询用户信息,并返回一个user实体bean。
这是一个很简单很常用的查询场景:根据key来查询记录并将结果封装成实体bean。其中:
@selectprovider注解用于生成查询用的sql语句,有别于@select注解,@selectprovide指定一个class及其方法,并且通过调用class上的这个方法来获得sql语句。在我们这个例子中,获取查询sql的方法是sqlprovider.selectuser。
@resultmap注解用于从查询结果集recordset中取数据然后拼装实体bean。
2.定义拼装sql的类
@selectprovide中type参数指定的class类,必须要能够通过无参的构造函数来初始化。
@selectprovide中method参数指定的方法,必须是public的,返回值必须为string,可以为static。
public class sqlprovider { public string selectuser(long userid) { return "select * from user where userid=" + userid; } }
3.无参数@selectprovide方法##
在mapper接口方法上和@selectprovide指定类方法上,均无参数:
usermapper.java: @selectprovider(type = sqlprovider.class, method = "selectalluser") @resultmap("usermap") public list<user> getalluser();
sqlprovider.java: public string selectalluser() { return "select * from user"; }
4.一个参数的@selectprovide方法
对于只有一个参数的情况,可以直接使用,参见前面的getuser和selectuser。
但是,如果在getuser方法中,对userid方法使用了@param注解的话,那么相应selectuser方法必须接受map<string, object>做为参数:
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.更多参数的@selectprovide方法
在超过一个参数的情况下,@selectprovide方法必须接受map<string, object>做为参数,
如果参数使用了@param注解,那么参数在map中以@param的值为key,如下例中的userid;
如果参数没有使用@param注解,那么参数在map中以参数的顺序为key,如下例中的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方法类中,不要使用重载,也就是说,不要使用方法名相同参数不同的方法,以避免发生诡异问题。
实例
@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(); } } }
到此这篇关于mybatis3中@selectprovider的使用技巧的文章就介绍到这了,更多相关mybatis3中@selectprovider使用内容请搜索以前的文章或继续浏览下面的相关文章希望大家以后多多支持!
下一篇: Oracle手动建库安装部署超详细教程
推荐阅读
-
在Python中关于中文编码问题的处理建议
-
Python中循环后使用list.append()数据被覆盖问题的解决
-
使用jQuery快速解决input中placeholder值在ie中无法支持的问题
-
平面设计中字库使用的问题解答
-
Winform中在使用VS+svn进行协同开发时添加引用时的相对路径和绝对路径的问题
-
Python的Flask框架中SQLAlchemy使用时的乱码问题解决
-
深入解读php中关于抽象(abstract)类和抽象方法的问题分析
-
Android 使用volley过程中遇到的问题解决办法
-
Android关于WebView中无法定位的问题解决
-
关于Oracle12c中无scott用户的问题