• 转:mybatis3中@SelectProvider的使用技巧


    mybatis3中@SelectProvider的使用技巧

    mybatis的原身是ibatis,现在已经脱离了apache基金会,新官网是http://www.mybatis.org/。

    mybatis3中增加了使用注解来配置Mapper的新特性,本篇文章主要介绍其中几个@Provider的使用方式,他们是:@SelectProvider、@UpdateProvider、@InsertProvider和@DeleteProvider。

    MyBatis 3 User Guide中的最后一章描述了注解的简单用法,但是对于这几个Provider的具体使用方式并没有说的很清楚,特别是参数传递的方式,完全没有提及,对于初次使用的同学来说,会造成不小的困扰。

    经过一些尝试后,我总结了一些Provider的使用经验,下面以@SelectProvider为例,依次描述几种典型的使用场景。

    1.使用@SelectProvider
    @SelectProvider是声明在方法基本上的,这个方法定义在Mapper对应的的interface上。
    1 public interface UserMapper {
    2     @SelectProvider(type = SqlProvider.class, method = "selectUser")
    3     @ResultMap("userMap")
    4     public User getUser(long userId);
    5 }
    上例中是个很简单的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。
    1 public class SqlProvider {
    2     public String selectUser(long userId) {
    3         return "select * from user where userId=" + userId;
    4     }
    5 }


    3.无参数@SelectProvide方法
    在Mapper接口方法上和@SelectProvide指定类方法上,均无参数:
    UserMapper.java:
    1     @SelectProvider(type = SqlProvider.class, method = "selectAllUser")
    2     @ResultMap("userMap")
    3     public List<User> getAllUser();
    SqlProvider.java:
    1     public String selectAllUser() {
    2         return "select * from user";
    3     }


    4.一个参数的@SelectProvide方法
    对于只有一个参数的情况,可以直接使用,参见前面的getUser和selectUser。
    但是,如果在getUser方法中,对userId方法使用了@Param注解的话,那么相应selectUser方法必须接受Map<String, Object>做为参数:
    UserMapper.java:
    1     @SelectProvider(type = SqlProvider.class, method = "selectUser2")
    2     @ResultMap("userMap")
    3     public User getUser2(@Param("userId") long userId);
    SqlProvider.java:
    1     public String selectUser2(Map<String, Object> para) {
    2         return "select * from user where userId=" + para.get("userId");
    3     }


    5.更多参数的@SelectProvide方法
    在超过一个参数的情况下,@SelectProvide方法必须接受Map<String, Object>做为参数,
    如果参数使用了@Param注解,那么参数在Map中以@Param的值为key,如下例中的userId;
    如果参数没有使用@Param注解,那么参数在Map中以参数的顺序为key,如下例中的password:
    UserMapper.java:
    1     @SelectProvider(type = SqlProvider.class, method = "selectUserCheck")
    2     @ResultMap("userMap")
    3     public User getUserCheck(@Param("userId") long userId, String password);
    SqlProvider.java:
    1     public String selectUserCheck(Map<String, Object> para) {
    2         return "select * from user where userId=" + para.get("userId") + " and password='" + para.get("1") + "'";
    3     }

    6.一些限制
    在Mapper接口和@SelectProvide方法类中,不要使用重载,也就是说,不要使用方法名相同参数不同的方法,以避免发生诡异问题。
  • 相关阅读:
    《Microsoft Sql server 2008 Internals》读书笔记第十一章DBCC Internals(2)
    《Microsoft Sql server 2008 Internals》读书笔记第十一章DBCC Internals(9)
    《Microsoft Sql server 2008 Internals》读书笔记第九章Plan Caching and Recompilation(10)
    CKEditor在asp.net环境下的使用一例
    《Microsoft Sql server 2008 Internals》读书笔记第五章Table(7)
    《Microsoft Sql server 2008 Internals》读书笔记第九章Plan Caching and Recompilation(11)
    千万数据的连续ID表,快速读取其中指定的某1000条数据?
    javascript中的float运算精度
    .Net与Java的互操作(.NET StockTrader微软官方示例应用程序)
    《Microsoft Sql server 2008 Internals》读书笔记第十一章DBCC Internals(6)
  • 原文地址:https://www.cnblogs.com/jhj117/p/5388748.html
Copyright © 2020-2023  润新知