小书MybatisPlus第3篇自定义SQL

39次阅读

共计 2375 个字符,预计需要花费 6 分钟才能阅读完成。

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

  • 小书 MybatisPlus 第 1 篇 - 整合 SpringBoot 疾速开始增删改查
  • 小书 MybatisPlus 第 2 篇 - 条件结构器的利用及总结

书接上回,尽管 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 = ? 

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

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

感觉对您有帮忙的话,帮我点赞、分享!您的反对是我不竭的创作能源!。另外,笔者最近一段时间输入了如下的精品内容,期待您的关注。

  • 《手摸手教你学 Spring Boot2.0》
  • 《Spring Security-JWT-OAuth2 一本通》
  • 《实战前后端拆散 RBAC 权限管理系统》
  • 《实战 SpringCloud 微服务从青铜到王者》
  • 《VUE 深入浅出系列》

正文完
 0