SpringBoot整合MybatisPlus并实现条件构造器和分页插件

基本配置

引入mybatis-plus的依赖,在此之前最好把其他的mybatis依赖都删了,避免冲突。

<!-- https://mvnrepository.com/artifact/com.baomidou/mybatis-plus-boot-starter -->
<dependency>
    <groupId>com.baomidou</groupId>
    <artifactId>mybatis-plus-boot-starter</artifactId>
    <version>3.2.0</version>
</dependency>

修改application.yml全局配置文件,mybatis-plus配置方式和mybatis几乎一模一样,只是mybatis的升级版而已:

mybatis-plus:
    #要扫描的xml路径
    mapper-locations:
      classpath:mapping/*.xml
    #要扫描的包路径
    type-aliases-package: com.example.demo
    configuration:
      #开启驼峰命名
      map-underscore-to-camel-case: true
      #关缓存
      cache-enabled: false
      #打印sql信息到控制台(开发时用)
      log-impl: org.apache.ibatis.logging.stdout.StdOutImpl

简单测试

配置完成,下面写点东西来测试一下。
新建一张user表。
在这里插入图片描述
这里最好引入lombok以简化代码。

<dependency>
    <groupId>org.projectlombok</groupId>
    <artifactId>lombok</artifactId>
    <version>1.18.4</version>
</dependency>

先测试一下以前的mybatis功能。写一个根据id查询用户的逻辑。
新建user的bean。

package com.example.demo.bean;

import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import lombok.Data;

import java.io.Serializable;
import java.util.Date;

@Data
@TableName(value = "user")
public class User implements Serializable {

    private static final long serialVersionUID = 1L;

    /**
    * 主键id(IdType.AUTO表示数据库ID自增)
    */
    @TableId(value = "id",type = IdType.AUTO)
    private Integer id;
    /**
    * name
    */
    private String name;
    /**
    * password
    */
    private String password;
    /**
    * create_time
    */
    private Date createTime;

}

新建controller,为了简单就直接写在controller里了。

package com.example.demo.controller;

import com.example.demo.bean.User;
import com.example.demo.dao.UserDao;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.ResponseBody;

@Controller
public class UserController {

    @Autowired
    UserDao userDao;

    @GetMapping("/selectByPrimaryKey")
    @ResponseBody
    public User selectByPrimaryKey(Integer id){
        return userDao.selectByPrimaryKey(id);
    }
}

新建dao

package com.example.demo.dao;

import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.example.demo.bean.User;
import org.apache.ibatis.annotations.Mapper;

@Mapper
public interface UserDao extends BaseMapper<User> {
    User selectByPrimaryKey(Integer id);
}

新建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.example.demo.dao.UserDao">

    <select id="selectByPrimaryKey"  resultType="com.example.demo.bean.User">
        select * from user where id=#{id}
    </select>

</mapper>

运行项目请求selectByPrimaryKey接口,结果如下:
在这里插入图片描述
由于开启了sql信息打印,在控制台可以直接看到sql信息,调试起来相当方便。

mybatis-plus:
    configuration:
      #打印sql信息到控制台(开发时用)
      log-impl: org.apache.ibatis.logging.stdout.StdOutImpl

控制台:
在这里插入图片描述

扫描二维码关注公众号,回复: 11080342 查看本文章

可以看到和以前mybatis的使用基本一致。其实实现刚才那个接口mybatis-plus可以不用写xml。

修改刚才的controller,可以看到mybatis-plus已经为我们封装了很多基本的方法,直接调用即可。
在这里插入图片描述
比如刚才的selectByPrimaryKey接口就可以改成下面这样,以后一些基本的数据库操作也就不需要xml了,十分方便。

    @GetMapping("/selectByPrimaryKey")
    @ResponseBody
    public User selectByPrimaryKey(Integer id){
        return userDao.selectById(id);
    }

运行结果也是和刚才一样的。
在这里插入图片描述
还有更多的crud接口操作请查看mybatis-plus的官方文档 https://mp.baomidou.com/guide/crud-interface.html。
在这里插入图片描述

条件构造器简介

主要用于实现复杂的crud逻辑。

QueryWrapper条件构造器

QueryWrapper条件构造器主要用于查询。修改controller,增加selectByName接口,通过name查询用户。

    @GetMapping("/selectByName")
    @ResponseBody
    public User selectByName(String name){
        QueryWrapper<User> queryWrapper = new QueryWrapper<>();
        queryWrapper.eq("name", name);
        return userDao.selectOne(queryWrapper);
    }

运行项目,请求selectByName接口,效果显而易见。
在这里插入图片描述
还可以有更多的组合查询,修改controller,增加selectUserList接口。当前表示查询id为2或name为Jack的用户。

    @GetMapping("/selectUserList")
    @ResponseBody
    public List<User> selectUserList(){
        QueryWrapper<User> queryWrapper = new QueryWrapper<>();
        queryWrapper.eq("id",2).or().eq("name","Jack");
        return userDao.selectList(queryWrapper);
    }

查询结果无误:
在这里插入图片描述

UpdateWrapper条件构造器

UpdateWrapper条件构造器主要用于更新。修改controller,增加updateByName接口。当前表示更新name为Jack的用户的name。

    @GetMapping("/updateByName")
    @ResponseBody
    public Integer updateByName(String name){
        UpdateWrapper<User> updateWrapper = new UpdateWrapper<>();
        updateWrapper.set("name",name);
        updateWrapper.eq("name","Jack");
        return userDao.update(new User(),updateWrapper);
    }

当然也可以写成下面这样,效果也是一样的。

    @GetMapping("/updateByName")
    @ResponseBody
    public Integer updateByName(String name){
        UpdateWrapper<User> updateWrapper = new UpdateWrapper<>();
        updateWrapper.eq("name","Jack");
        User user=new User();
        user.setName(name);
        return userDao.update(user,updateWrapper);
    }

运行项目,请求updateByName接口,将Jack更新为Tom,update方法返回1表示更新成功。
在这里插入图片描述
查看数据库,可以看到确实更新成功了。
在这里插入图片描述

这里的展示只是冰山一角,还有更多的条件构造器操作请查看mybatis-plus的官方文档 https://mp.baomidou.com/guide/wrapper.html。
在这里插入图片描述

分页插件

要使用分页插件先要新建MybatisPlusConfig 配置类,注册PaginationInterceptor 的bean。

package com.example.demo.config;

import com.baomidou.mybatisplus.extension.plugins.PaginationInterceptor;
import com.baomidou.mybatisplus.extension.plugins.pagination.optimize.JsqlParserCountOptimize;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.transaction.annotation.EnableTransactionManagement;

@EnableTransactionManagement
@Configuration
public class MybatisPlusConfig {

    @Bean
    public PaginationInterceptor paginationInterceptor() {
        PaginationInterceptor paginationInterceptor = new PaginationInterceptor();
        // 设置请求的页面大于最大页后操作, true调回到首页,false 继续请求  默认false
        // paginationInterceptor.setOverflow(false);
        // 设置最大单页限制数量,默认 500 条,-1 不受限制
        // paginationInterceptor.setLimit(500);
        // 开启 count 的 join 优化,只针对部分 left join
        paginationInterceptor.setCountSqlParser(new JsqlParserCountOptimize(true));
        return paginationInterceptor;
    }
}

修改dao,增加分页映射接口selectPageVo。

package com.example.demo.dao;

import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.example.demo.bean.User;
import org.apache.ibatis.annotations.Mapper;

@Mapper
public interface UserDao extends BaseMapper<User> {
    User selectByPrimaryKey(Integer id);

    /**
     * <p>
     * 查询 : 根据state状态查询用户列表,分页显示
     * </p>
     *
     * @param page 分页对象,xml中可以从里面进行取值,传递参数 Page 即自动分页,必须放在第一位(你可以继承Page实现自己的分页对象)
     * @return 分页对象
     */
    IPage<User> selectPageVo(Page<?> page);
}

修改xml文件,增加id为selectPageVo的sql语句。

<?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.example.demo.dao.UserDao">

    <select id="selectByPrimaryKey"  resultType="com.example.demo.bean.User">
        select * from user where id=#{id}
    </select>

    <select id="selectPageVo" resultType="com.example.demo.bean.User">
        select * from user
    </select>
</mapper>

最后修改controller,增加selectPageVo接口。当前表示查询第一页,每页一条数据。

    @GetMapping("/selectPageVo")
    @ResponseBody
    public IPage<User> selectPageVo(){
        // 当前页,总条数 构造 page 对象
        Page<User> page = new Page<>(1, 1);
        // 不进行 count sql 优化,解决 MP 无法自动优化 SQL 问题,这时候你需要自己查询 count 部分
   	 	// page.setOptimizeCountSql(false);
    	// 当 total 为小于 0 或者设置 setSearchCount(false) 分页插件不会进行 count 查询
    	// 要点!! 分页返回的对象与传入的对象是同一个
        return userDao.selectPageVo(page);
    }

在这里插入图片描述
修改selectPageVo,查询第二页的内容。

    @GetMapping("/selectPageVo")
    @ResponseBody
    public IPage<User> selectPageVo(){
        // 当前页,总条数 构造 page 对象
        Page<User> page = new Page<>(2, 1);
        // 不进行 count sql 优化,解决 MP 无法自动优化 SQL 问题,这时候你需要自己查询 count 部分
   	 	// page.setOptimizeCountSql(false);
    	// 当 total 为小于 0 或者设置 setSearchCount(false) 分页插件不会进行 count 查询
    	// 要点!! 分页返回的对象与传入的对象是同一个
        return userDao.selectPageVo(page);
    }

在这里插入图片描述

可见分页生效了。至此SpringBoot整合MybatisPlus就基本完成了,肆无忌惮的使用吧。关于mybatis-plus的更多功能还请查看官方文档,我这里只是抛砖引玉而已,人家写得更好更全面。

发布了82 篇原创文章 · 获赞 9 · 访问量 6183

猜你喜欢

转载自blog.csdn.net/weixin_43424932/article/details/104302451