Mybatis-plus中自定义的sql语句调用QueryWrapper实现查询及分页IPage使用

一、引言

MP自带的条件构造器虽然很强大,有时候也避免不了写稍微复杂一点业务的sql,那么那么今天说说MP怎么自定义sql语句吧。另外,除了下文提到的通过queryWrapper实现筛选以外,调用查询时,如果你需要做分页,通过mybatisPlus提供的分页接口IPage,能够避免自己手写分页的sql语句,这么好用的东西,你还不入坑吗?详情点击:Mybatis-plus多表关联查询,多表分页查询

二、配置

自定义的sql当然是写在XML文件中的啦,那么首先来定义xml文件的位置,在yml配置文件如下


   
   
   
   
  1. mybatis-plus:
  2. # 如果是放在src/main/java目录下 classpath:/com/*/*/mapper/*Mapper.xml
  3. # 如果是放在resource目录 classpath:/mapper/**.xml
  4. mapper-locations: classpath:/mapper/**.xml

三、具体实现

使用注解实现:

在我们Mapper接口中定义自定义方法即可。


   
   
   
   
  1. /**
  2. * @Date: 2019/6/10 14:40
  3. * @Description: User对象持久层
  4. */
  5. public interface UserMapper extends BaseMapper<User> {
  6. /**
  7. *
  8. * 如果自定义的方法还希望能够使用MP提供的Wrapper条件构造器,则需要如下写法
  9. *
  10. * @param userWrapper
  11. * @return
  12. */
  13. @Select("SELECT * FROM user ${ew.customSqlSegment}")
  14. List selectByMyWrapper( @Param(Constants.WRAPPER) Wrapper userWrapper);
  15. /**
  16. * 和Mybatis使用方法一致
  17. * @param name
  18. * @return
  19. */
  20. @Select("SELECT * FROM user where name = #{name}")
  21. List selectByName( @Param("name") String name);
  22. }

使用xml文件实现:

使用xml一定要指定xml文件所在位置


   
   
   
   
  1. /**
  2. * @Date: 2019/6/10 14:40
  3. * @Description: User对象持久层
  4. */
  5. public interface UserMapper extends BaseMapper<User> {
  6. /**
  7. *
  8. * 如果自定义的方法还希望能够使用MP提供的Wrapper条件构造器,则需要如下写法
  9. *
  10. * @param userWrapper
  11. * @return
  12. */
  13. List selectByMyWrapper(@Param(Constants.WRAPPER) Wrapper userWrapper);
  14. /**
  15. * 和Mybatis使用方法一致
  16. * @param name
  17. * @return
  18. */
  19. List selectByName(@Param( "name") String name);
  20. }

   
   
   
   
  1. xml version="1.0" encoding="UTF-8" ?>
  2. <mapper namespace="com.example.demo.mapper.UserMapper">
  3. <select id="selectByName" resultType="com.example.demo.model.User">
  4. SELECT * FROM user where name = #{name}
  5. select>
  6. <select id="selectByMyWrapper" resultType="com.example.demo.model.User">
  7. SELECT * FROM user ${ew.customSqlSegment}
  8. select>
  9. mapper>

测试测试:


   
   
   
   
  1. /**
  2. * 自定义sql查询语句
  3. */
  4. @Test
  5. public void selectByMySelect() {
  6. List users = userMapper.selectByName( "王天风");
  7. users. forEach(System.out::println);
  8. }
  9. /**
  10. * 自定义sql使用Wrapper
  11. */
  12. @Test
  13. public void selectByMyWrapper() {
  14. QueryWrapper wrapper = new QueryWrapper();
  15. wrapper.like( "name", "雨").lt( "age", 40);
  16. List users = userMapper.selectByMyWrapper(wrapper);
  17. users. forEach(System.out::println);
  18. }

四、回答评论区提问

提问一:能否提供自定义Update语句与Wrapper的整合使用呢?


   
   
   
   
  1. /**
  2. *

  3. * 用户 Mapper 接口
  4. *

  5. *
  6. * @since 2019-06-14
  7. */
  8. public interface UserMapper extends BaseMapper<User> {
  9. /**
  10. * 自定Wrapper修改
  11. *
  12. * @param userWrapper 条件构造器
  13. * @param user 修改的对象参数
  14. * @return
  15. */
  16. int updateByMyWrapper(@Param(Constants.WRAPPER) Wrapper userWrapper, @Param("user") User user);
  17. }

   
   
   
   
  1. xml version="1.0" encoding="UTF-8" ?>
  2. <mapper namespace="com.example.demo.mapper.UserMapper">
  3. <update id="updateByMyWrapper">
  4. UPDATE user SET email = #{user.email} ${ew.customSqlSegment}
  5. update>
  6. mapper>

   
   
   
   
  1. @Test
  2. public void updateByMyWrapper() {
  3. // 条件构造器
  4. QueryWrapper wrapper = new QueryWrapper();
  5. wrapper.eq( "name", "admin");
  6. // 修改后的对象
  7. User user = new User();
  8. user.setEmail( "[email protected]");
  9. userMapper.updateByMyWrapper(wrapper, user);
  10. }

 

你可能感兴趣的:(SSM,Java)