本文档为一个系列,后面章节:
- 小书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>
应用测试
@Testpublic 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
@Testpublic 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深入浅出系列》