Mybatis Plus 自定義SQL和分頁插件


一、使用條件構造器的自定義SQL

1、使用注解的方式

public interface UserMapper extends BaseMapper<User> {
    @Select("select * from user ${ew.customSqlSegment}")
    List<User> selectAll(@Param("ew") Wrapper<User> queryWrapper);
}

寫法就是參照源碼:@Param("ew") 也就是 @Param(Constants.WRAPPER)

測試

@Test
public void selectMy() {
    LambdaQueryWrapper<User> lambdaQuery = Wrappers.<User>lambdaQuery();
    lambdaQuery.likeRight(User::getName, "王")
            .and(lqw -> lqw.lt(User::getAge, 40).or().isNotNull(User::getEmail));
    List<User> list = userMapper.selectAll(lambdaQuery);
    list.forEach(System.out::println);
}

控制台輸出

DEBUG==>  Preparing: select * from user WHERE name LIKE ? AND ( age < ? OR email IS NOT NULL ) 
DEBUG==> Parameters: 王%(String), 40(Integer)
TRACE<==    Columns: id, name, age, email, manager_id, create_time
TRACE<==        Row: 1088248166370832385, 王天風, 25, wtf@baomidou.com, 1087982257332887553, 2019-02-05 11:12:22
DEBUG<==      Total: 1
User(id=1088248166370832385, name=王天風, age=25, email=wtf@baomidou.com, managerId=1087982257332887553, createTime=Tue Feb 05 11:12:22 CST 2019, remark=null)

2、使用xml文件的方式

public interface UserMapper extends BaseMapper<User> {
    List<User> selectAll(@Param(Constants.WRAPPER) Wrapper<User> queryWrapper);
}

xml文件內容,這里沒有where

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.mp.dao.UserMapper">
    <select id="selectAll" resultType="com.mp.entity.User">
        select * from user ${ew.customSqlSegment}
    </select>
</mapper>

注意需要掃描xml文件

# Mybatis Plus配置
mybatis-plus:
  mapper-locations: classpath*:mapper/**/*.xml

二、分頁插件

1、配置分頁插件

package com.mp.config;

import com.baomidou.mybatisplus.extension.plugins.PaginationInterceptor;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@Configuration
public class MybatisPlusConfig {
    @Bean
    public PaginationInterceptor paginationInterceptor() {
        return new PaginationInterceptor();
    }
}

2、使用Page類進行分頁

@Test
public void selectPage() {
    QueryWrapper<User> queryWrapper = new QueryWrapper<>();
    queryWrapper.ge("age", 20);

    Page page = new Page(1, 2);
    IPage iPage = userMapper.selectPage(page, queryWrapper);
    System.out.println("總頁數:" + iPage.getPages());
    System.out.println("總記錄數:" + iPage.getTotal());
    List<User> list = (List<User>)iPage.getRecords();
    list.forEach(System.out::println);
}

@Test
public void selectPage2() {
    QueryWrapper<User> queryWrapper = new QueryWrapper<>();
    queryWrapper.ge("age", 20);

    Page page = new Page(1, 2);
    IPage iPage = userMapper.selectMapsPage(page, queryWrapper);
    System.out.println("總頁數:" + iPage.getPages());
    System.out.println("總記錄數:" + iPage.getTotal());
    List<Map<String, Object>> list = (List<Map<String, Object>>) iPage.getRecords();
    list.forEach(System.out::println);
}

控制台輸出:

DEBUG==>  Preparing: SELECT COUNT(1) FROM user WHERE age >= ? 
DEBUG==> Parameters: 20(Integer)
TRACE<==    Columns: COUNT(1)
TRACE<==        Row: 6
DEBUG==>  Preparing: SELECT id,name,age,email,manager_id,create_time FROM user WHERE age >= ? LIMIT ?,? 
DEBUG==> Parameters: 20(Integer), 0(Long), 2(Long)
TRACE<==    Columns: id, name, age, email, manager_id, create_time
TRACE<==        Row: 1087982257332887553, 大boss, 40, boss@baomidou.com, null, 2019-01-11 14:20:20
TRACE<==        Row: 1088248166370832385, 王天風, 25, wtf@baomidou.com, 1087982257332887553, 2019-02-05 11:12:22
DEBUG<==      Total: 2
總頁數:3
總記錄數:6
User(id=1087982257332887553, name=大boss, age=40, email=boss@baomidou.com, managerId=null, createTime=Fri Jan 11 14:20:20 CST 2019, remark=null)
User(id=1088248166370832385, name=王天風, age=25, email=wtf@baomidou.com, managerId=1087982257332887553, createTime=Tue Feb 05 11:12:22 CST 2019, remark=null)

不查記錄數的分頁方式:new Page(1, 2, false);

@Test
public void selectPage() {
    QueryWrapper<User> queryWrapper = new QueryWrapper<>();
    queryWrapper.ge("age", 20);

    Page page = new Page(1, 2, false);
    IPage iPage = userMapper.selectPage(page, queryWrapper);
    System.out.println("總頁數:" + iPage.getPages());
    System.out.println("總記錄數:" + iPage.getTotal());
    List<User> list = (List<User>)iPage.getRecords();
    list.forEach(System.out::println);
}

控制台輸出:

DEBUG==>  Preparing: SELECT id,name,age,email,manager_id,create_time FROM user WHERE age >= ? LIMIT ?,? 
DEBUG==> Parameters: 20(Integer), 0(Long), 2(Long)
TRACE<==    Columns: id, name, age, email, manager_id, create_time
TRACE<==        Row: 1087982257332887553, 大boss, 40, boss@baomidou.com, null, 2019-01-11 14:20:20
TRACE<==        Row: 1088248166370832385, 王天風, 25, wtf@baomidou.com, 1087982257332887553, 2019-02-05 11:12:22
DEBUG<==      Total: 2
總頁數:0
總記錄數:0
User(id=1087982257332887553, name=大boss, age=40, email=boss@baomidou.com, managerId=null, createTime=Fri Jan 11 14:20:20 CST 2019, remark=null)
User(id=1088248166370832385, name=王天風, age=25, email=wtf@baomidou.com, managerId=1087982257332887553, createTime=Tue Feb 05 11:12:22 CST 2019, remark=null)

3、多表聯查的分頁

演示的單表但多表聯查也是一樣

public interface UserMapper extends BaseMapper<User> {
    IPage<User> selectUserPage(Page<User> page, @Param(Constants.WRAPPER) Wrapper<User> queryWrapper);
}

xml文件

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.mp.dao.UserMapper">
    <select id="selectUserPage" resultType="com.mp.entity.User">
        select * from user ${ew.customSqlSegment}
    </select>
</mapper>

測試

@Test
public void selectMyPage() {
    QueryWrapper<User> queryWrapper = new QueryWrapper<>();
    queryWrapper.ge("age", 20);

    Page page = new Page(1, 2);
    IPage iPage = userMapper.selectUserPage(page, queryWrapper);
    System.out.println("總頁數:" + iPage.getPages());
    System.out.println("總記錄數:" + iPage.getTotal());
    List<User> list = (List<User>) iPage.getRecords();
    list.forEach(System.out::println);
}

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM