本文档为一个系列,前面章节:

书接上回,虽然Mybatis Plus帮我们提供了大量的默认方法,但我们为了实现多表关联查询,或者根据不同的查询条件传参,实现不同的动态SQL。在这种情况下我们还是需要自定义SQL,不管怎样我们需要首先通过配置指定Mapper.xml文件的存储位置。

mybatis-plus:
mapper-locations: classpath*:/mapper/*Mapper.xml

1、原始的自定义SQL方法

笔者认为:将多表关联查询或动态SQL写在XML文件里面进行维护,大多数场景下仍然是Mybatis最佳实践。单表的增删改查使用Mybatis Plus或者mybatis generator生成代码,是最佳实践。

  • UserMapper 接口放在@MapperScan配置的扫描路径下面。这种方法是Mybatis 为我们提供的,在Mybatis Plus里面仍然可以继续使用,丝毫不耽误!
  • 使用最原始的Mybatis SQL定义方式,在集成BaseMapper的基础上(mybatis plus),新定义一个接口方法findUser。
public interface UserMapper extends BaseMapper<User> {
List<User> findUser(@Param("name") String name, @Param("email") String email);
}

新定义一个UserMapper.xml,放在mybatis-plus.mapper-locations配置路径下面。下面的动态SQL表示:

  • 当参数name不为null或空串的时候,AND name = #{name}条件生效
  • 当参数email不为null或空串的时候,AND email = #{email}条件生效
<!--这个里面写动态SQL、多表关联查询都可以胜任-->
<select id="findUser" resultType="com.zimug.example.model.User">
SELECT id,name,age,email
FROM user
<trim prefix="WHERE" prefixOverrides="AND|OR" suffixOverrides="AND|OR">
<if test="name != null and name != '' " >
AND name = #{name}
</if>
<if test="email != null and email != '' " >
AND email= #{email}
</if>
</trim>
</select>

使用测试

@Test
public void testCustomSQL1() {
String name = "字母"; //name不为空
String email = ""; //email为空串
List<User> list = userMapper.findUser(name,email);
list.forEach(System.out::println);
}

最终执行的SQL为(因为email为空串,所以对应的查询条件在动态SQL中未被构建):

SELECT id,name,age,email
FROM user
WHERE name = ?

2、自定义接口方法使用Wrapper条件构造器

如果我们想在自定义的方法中,使用Wrapper条件构造器。可以参考下面的方式实现。这种方式虽然简单,但仍然只适用于单表(可以是多表关联查询,但查询条件也是基于单表的)。

  • 使用注解方式 + Wrapper , ${ew.customSqlSegment}是一个查询条件占位符,代表Wapper查询条件。
@Select("select * from `user` ${ew.customSqlSegment}")
List<User> selectAll(@Param(Constants.WRAPPER) Wrapper wrapper);
  • 使用xml 配置方式 + Wrapper
List<User> selectAll(@Param(Constants.WRAPPER) Wrapper wrapper);
<select id="selectAll" resultType="com.zimug.example.model.User">
select * from `user` ${ew.customSqlSegment}
</select>

通过Wapper传递查询参数

上面两种方式任意选择一种,参数都是Wrapper

@Test
public void testCustomSQL2() {
LambdaQueryWrapper<User> query = new LambdaQueryWrapper<>();
query.eq(User::getName, "字母"); List<User> list = userMapper.selectAll(query);
list.forEach(System.out::println);
}

最终执行的SQL为(和上文原始的XML动态SQL实现效果一致,但是查询条件的构造是针对单表的):

SELECT id,name,age,email
FROM user
WHERE name = ?

欢迎关注我的博客,里面有很多精品合集

  • 本文转载注明出处(必须带连接,不能只转文字):字母哥博客

觉得对您有帮助的话,帮我点赞、分享!您的支持是我不竭的创作动力! 。另外,笔者最近一段时间输出了如下的精品内容,期待您的关注。

小书MybatisPlus第3篇-自定义SQL的更多相关文章

  1. 小书MybatisPlus第4篇-表格分页与下拉分页查询

    本文为mybatis系列文档的第4篇,前三篇请访问下面的网址. 小书MybatisPlus第1篇-整合SpringBoot快速开始增删改查 小书MybatisPlus第2篇-条件构造器的应用及总结 小 ...

  2. 小书MybatisPlus第5篇-Active Record模式精讲

    本文为一个系列中的第五节,前四节访问如下地址: 小书MybatisPlus第1篇-整合SpringBoot快速开始增删改查 小书MybatisPlus第2篇-条件构造器的应用及总结 小书Mybatis ...

  3. 小书MybatisPlus第6篇-主键生成策略精讲

    本文为mybatis系列文档的第6篇,前5篇请访问下面的网址. 小书MybatisPlus第1篇-整合SpringBoot快速开始增删改查 小书MybatisPlus第2篇-条件构造器的应用及总结 小 ...

  4. 小书MybatisPlus第7篇-代码生成器的原理精讲及使用方法

    本文是本系列文章的第七篇,前6篇访问地址如下: 小书MybatisPlus第1篇-整合SpringBoot快速开始增删改查 小书MybatisPlus第2篇-条件构造器的应用及总结 小书Mybatis ...

  5. 小书MybatisPlus第8篇-逻辑删除实现及API细节精讲

    本文为Mybatis Plus系列文章的第8篇,前7篇访问地址如下: 小书MybatisPlus第1篇-整合SpringBoot快速开始增删改查 小书MybatisPlus第2篇-条件构造器的应用及总 ...

  6. 小书MybatisPlus第9篇-常用字段默认值自动填充

    本文为Mybatis Plus系列文章的第9篇,前8篇访问地址如下: 小书MybatisPlus第1篇-整合SpringBoot快速开始增删改查 小书MybatisPlus第2篇-条件构造器的应用及总 ...

  7. 小书MybatisPlus第1篇-整合SpringBoot快速开始增删改查

    Mybatis Plus官方文档已经很完善了,为什么还要写一个这样的文档? 官方文档注重知识结构的整理,没有注重学习者的学习顺序 官方文档中的案例注重API描述,比较适合学会mybatis plus之 ...

  8. 小书MybatisPlus第2篇-条件构造器的应用及总结

    一.条件构造器Wrapper Mybatis Plus为我们提供了如下的一些条件构造器,我们可以利用它们实现查询条件.删除条件.更新条件的构造. 条件构造器用于给如下的Mapper方法传参,通常情况下 ...

  9. 微信小程序地图控件篇 ---自定义图标被地图覆盖的问题

    今天在做微信小程序的时候遇到这个这样的问题  需要在地图上加个一个自定义的图标控件 类似这样的 刚开始的时候怎图片一直会被地图组件覆盖  ,要怎么解决这个问题  我去翻了下小程序的文档 有个cover ...

随机推荐

  1. Windows10 搭建 ElasticSearch 集群服务

    一.前言 集群的搭建需要多台机器,之前我使用 ubuntu 16.04 搭建过 hadoop 的单机模式和分布式模式,这个今后会写,今天先写一篇使用 < Windows10 搭建 Elastic ...

  2. lei muban

    #include<iostream> using namespace std; template <typename T> class Operator{ public: T ...

  3. css如何实现水平垂直居中

    方法 居中元素定宽高固定 PC兼容性 移动端兼容性 absolute + 负margin 是 ie6+, chrome4+, firefox2+ 安卓2.3+, iOS6+ absolute + ma ...

  4. laravel里的队列学习

    首先,我们要搞明白几个概念,从小到大依次有:队列任务,队列,连接. 他们属于依次被包含的关系,一个队列里有许多的队列任务,一个连接中可以有许多队列. 队列任务:对每个用户都会进行的操作,理解为队列任务 ...

  5. 自动完成 APP【字典树(Trie树)+dfs】

    自动完成 APP 传送门  来源:upc12786 题目描述 奶牛 Bessie 很喜欢用手机上网聊天,但她的蹄子太大,经常会按到好几个键造成不必要的麻烦(丢死人了,你下辈子还是不要当奶牛了).于是 ...

  6. MSSQL(DAC环境一下一些特殊的访问方式)

    MSSQL(在DAC环境下访问: 存储过程) Server name:      admin:计算机名\实例名                 or       admin:IP地址\实例名      ...

  7. 关于MYSQL的查询时间段、删除数据、查询目标行的命令用法。

    Q1.第一次工作写命令时,写了一个把一个表的数据插入到另一个表中,运行时命令长时间处于执行状态. A.第一次处理数据库大量数据,长时间按运行属于正常现象,这与学校中的小数据不同. Q2.如何查询数据库 ...

  8. mysql小数类型

    原文链接:https://blog.csdn.net/weixin_42047611/article/details/81449663 MySQL 中使用浮点数和定点数来表示小数. 浮点类型有两种,分 ...

  9. 上海开发票/v电13543443967

    关于事项:Iㄋ5一★4З44一★ㄋ9.б7开发票的准备资料必须要公司名称个人的话就用个人名字和身份证去税务柜台申请办理!公司的话要提供公司全称就是营业执照上的名称,纳税人税号,如果是开普通增值税发票的 ...

  10. SpringCloud教程第6篇:config(F版本)

    一.简介 在分布式系统中,由于服务数量巨多,为了方便服务配置文件统一管理,实时更新,所以需要分布式配置中心组件.在Spring Cloud中,有分布式配置中心组件spring cloud config ...