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
控制台:
可以看到和以前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的更多功能还请查看官方文档,我这里只是抛砖引玉而已,人家写得更好更全面。