mybatis使用注解替代xml配置时,遇到判断条件是否为null或者为空时,@Select很难搞定,不知道怎么办?

mybatis3中增加了使用注解来配置Mapper的新特性,使用 SelectProvider来动态生成sql。

典型的使用场景

1. 无参数@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     }
2.单个参数使用@SelectProvider

2.1.没有@Param注解的单个参数使用@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。

@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 }

2.2.带有@Param注解一个参数的@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     }

3.多参数的@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     }

4.一些限制
在Mapper接口和@SelectProvide方法类中,不要使用重载,也就是说,不要使用方法名相同参数不同的方法,以避免发生诡异问题。

参考文献:
【1】http://www.blogjava.net/dbstar/archive/2011/08/08/355825.html

转载于:https://www.cnblogs.com/davidwang456/p/6838020.html

mybatis使用注解替代xml配置,动态生成Sql相关推荐

  1. Mybatis中注解和xml可以同时使用吗?

    今天开始使用注解的方式写dao层的接口,注解比xml文件更加的方便,但是感觉不利于代码的维护,也不利于动态sql的书写,而且需要在全局配置文件中配置<mappers>标签,注解需要使用&l ...

  2. excel动态生成Sql语句

    文章目录 0. 前言 1. 先说结论 2. 例子 0. 前言 由于工作原因,无意中发现有时候有些数据来由形式是excel文件,需要把里面的值变成sql语句,然后去数据库中执行. 因此记录下如何让exc ...

  3. Spring Mybatis实例SqlSessionDaoSupport混用xml配置和注解

    2019独角兽企业重金招聘Python工程师标准>>> 一.表(这里用mysql,数据库名为yiibai) CREATE TABLE `user` (`id` int(10) UNS ...

  4. mybatis的注解开发之三种动态sql

    脚本sql XML配置方式的动态SQL我就不讲了,有兴趣可以自己了解,下面是用<script>的方式把它照搬过来,用注解来实现.适用于xml配置转换到注解配置 @Select(" ...

  5. Spring常用的的注解对应xml配置详解

    @Component(value="")注解:组件 标记在类上,也可以放在接口上 注解作用:把AccountDao实现类对象交由Spring IOC容器管理 相当于XML配置文件中 ...

  6. java xml annotation_Annotation与XML配置ID生成策略

    最常用:native 由不同DB生成不同的策略 其次:identity.sequence 一些用:uuid ------------------------------------------ XML ...

  7. mybatis 配置 mysql连接池_spring 5.x 系列第5篇 —— 整合 mybatis + druid 连接池 (xml配置方式)...

    项目目录结构 1. 导入依赖 创建 maven 工程,除了 Spring 的基本依赖外,还需要导入 Mybatis 和 Druid 的相关依赖: org.springframeworkgroupId& ...

  8. WCF读取配置动态生成客户端对象

    转载自CSDN的ALLsharps 原始链接:http://blog.csdn.net/allsharps/article/details/7356301 写一个类,用于动态生成WCFClient对象 ...

  9. Mybatis mapper代理SqlMapConfig.xml配置详解

    SqlMapConfig.xml是mybatis的全局配置文件: 1.mapper映射配置 >配置mapper的另外一种方式: <mappers> <mapper resour ...

最新文章

  1. 23张图,带你入门推荐系统
  2. 使用TESSERACT来识别字符
  3. toolbar.netcraft.com查询域名等信息
  4. PXE实现无人值守无盘安装Linux
  5. Node Sass does not yet support your current environment
  6. R 语言怎么保存工作目录到当前路径_【R语言基础】01.R语言软件环境搭建及常用操作...
  7. 一个地方越有钱,人们就越不想结婚?
  8. btoa java,JavaScript用btoa和atob来编码解码Base64
  9. go web框架_干货分享:六个知名的Go语言web框架
  10. 结构方程模型及PLS估计【评价】
  11. 网络操作系统和分布式操作系统的区别
  12. 无法启动此程序 因为计算机中丢失msvcr71.dll,msvcr71.dll丢失怎样修复?计算机中丢失msvcr71.dll的解决方法...
  13. linux -shell编程-循环语句
  14. 磁力云盒,自动静默关注店铺
  15. 【CS231n】斯坦福大学李飞飞视觉识别课程笔记(六):线性分类笔记(上)
  16. 中国第二家傲途格精选酒店开业;德意志酒店集团所有旗舰酒店合入全新总品牌 | 美通企业日报...
  17. 仿秒拍图床最新版_图床程序源码下载
  18. 博实转债上市价格预测
  19. laradock配置laravel 报错 Connection refused tcp://127.0.0.1:6379
  20. Pytorch数据使用列表的卷积层时报错及解决-RuntimeError: Input type (torch.cuda.HalfTensor) and weight type (torch.Floa

热门文章

  1. 两个列表合并去重_花生AI论文去重V1.4更新合并查同义词功能
  2. matlab 随机森林算法_(六)如何利用Python从头开始实现随机森林算法
  3. 本周测试服务器角色转移系统仅开放转入,5月24日维护公告 角色转移系统全服放出...
  4. mos管结电容等效模型_MOS管硬开关震荡分析“新能源汽车与电力电子技术”系列之十九...
  5. php读取html中元素属性,读写HTML元素的css 属性
  6. 用事件标志组实现多事件的单向同步
  7. php 读取 linux 文件,PHP读取大文件,linux读取日志
  8. YOLOv5-LibTorch
  9. 如何评价三国里的袁绍
  10. sql OFFSET 和 ORDINAL