写在开始:一个搬砖程序员的随缘记录
MyBatis-Plus(简称 MP)是一个 MyBatis 的增强工具,在 MyBatis 的基础上只做增强不做改变,为简化开发、提高效率而生。
官网地址:MyBatis-Plus
之前写了MyBatis的使用,两者对比起来,MyBatis-Plus对比Mybatis用起来是比较方便,很多基本的操作都封装得很好,还有自定义自动生成基本代码的功能,下篇文章会讲到
CREATE TABLE `tb_user_dat` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`name` varchar(32) COLLATE utf8mb4_bin DEFAULT NULL COMMENT '姓名',
`sex` int(11) DEFAULT NULL COMMENT '性别 1:男 2:女',
`age` int(11) DEFAULT NULL COMMENT '年龄',
`create_time` datetime DEFAULT NULL COMMENT '创建时间',
`create_user` int(11) DEFAULT NULL COMMENT '创建人',
`update_time` datetime DEFAULT NULL COMMENT '修改时间',
`update_user` int(11) DEFAULT NULL COMMENT '修改人',
`is_delete` tinyint(1) DEFAULT '1' COMMENT '是否已删除 1:是 0:否',
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin;
可以看之前的文章:SpringBoot项目快速搭建
项目结构:
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-boot-starter</artifactId>
<version>3.3.1.tmp</version>
</dependency>
整体依赖
<properties>
<java.version>1.8</java.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web-services</artifactId>
</dependency>
<!-- lombok -->
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<optional>true</optional>
</dependency>
<!-- mysql -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-jdbc</artifactId>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
</dependency>
<!-- Mybatis-plus -->
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-boot-starter</artifactId>
<version>3.3.1.tmp</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
<exclusions>
<exclusion>
<groupId>org.junit.vintage</groupId>
<artifactId>junit-vintage-engine</artifactId>
</exclusion>
</exclusions>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
package com.cn.mybatisplus;
import org.mybatis.spring.annotation.MapperScan;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
/**
* @author demo
*/
@SpringBootApplication
@MapperScan("com.cn.mybatisplus.mapper")
public class MybatisPlusDemoApplication {
public static void main(String[] args) {
SpringApplication.run(MybatisPlusDemoApplication.class, args);
}
}
application.yml
server:
port: 8080 #端口号
spring:
datasource:
url: jdbc:mysql://localhost:3306/mybatis-plus?useUnicode=true&characterEncoding=utf-8 #数据库url
username: root #数据库用户名
password: admin #数据库密码
driver-class-name: com.mysql.jdbc.Driver
编写实体类TbUserDat.java
也可以使用Idea自带的database生成实体类
链接:IDEA一键生成表字段和基本代码
TbUserDat.java
package com.cn.mybatisplus.entity;
import com.baomidou.mybatisplus.annotation.*;
import com.fasterxml.jackson.annotation.JsonFormat;
import lombok.Data;
import org.springframework.format.annotation.DateTimeFormat;
import java.util.Date;
import java.io.Serializable;
/**
* (TbUserDat)实体类
* * @author makejava
* @since 2020-05-20 15:10:56
*/
@Data
public class TbUserDat implements Serializable {
private static final long serialVersionUID = 299266960321958614L;
/**
* id
*
* */
@TableId(type = IdType.AUTO)
private Integer id;
/**
* 姓名
*/
private String name;
/**
* 性别 1:男 2:女
*/
private Integer sex;
/**
* 年龄
*/
private Integer age;
/**
* 创建时间
*/
@DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
@JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd HH:mm:ss")
@TableField(value = "create_date", fill = FieldFill.INSERT)
private Date createTime;
/**
* 创建人
*/
private Integer createUser;
/**
* 修改时间
*/
@DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
@JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd HH:mm:ss")
@TableField(value = "update_date", fill = FieldFill.INSERT_UPDATE)
private Date updateTime;
/**
* 修改人
*/
private Integer updateUser;
/**
* 是否已删除 1:是 0:否
*/
@TableLogic
private Boolean isDelete;
}
上面用到几个常用的Mybatis-plus注解
@TableId(type = IdType.AUTO)
@TableField(value = "create_date", fill = FieldFill.INSERT)
描述:只有进行新增操作才会进行更新这个字段,用于创建时间类字段
@TableField(value = "update_date", fill = FieldFill.INSERT_UPDATE)
描述:只有进行新增操作才会进行更新这个字段,用于修改时间类字段
主要在于fill的使用
需要在application.yml中加入mybatis配置
mybatis-plus:
global-config:
db-config:
logic-delete-field: flag #全局逻辑删除字段值 3.3.0开始支持,详情看下面。
logic-delete-value: 1 # 逻辑已删除值(默认为 1)
logic-not-delete-value: 0 # 逻辑未删除值(默认为 0)
然后在实体类中物理删除字段上加上@TableLogic注解
想了解更多注解可以去官网看文档
增删改查都有多种不同的方式,这里只列举常用的
描述:保存
// 插入一条记录(选择字段,策略插入)
boolean save(T entity);
描述:删除,有配置物理删除就是物理删除不会删除数据
// 根据 entity 条件,删除记录
boolean remove(Wrapper<T> queryWrapper);
描述:修改
// 根据 whereEntity 条件,更新记录
boolean update(T entity, Wrapper<T> updateWrapper);
描述:根据id查询详情
// 根据 ID 查询
T getById(Serializable id);
描述:查询列表
// 查询所有
List<T> list();
描述:分页查询
// 无条件翻页查询
IPage<T> page(IPage<T> page);
描述:查询总条数
// 查询总记录数
int count();
分页插件:
启动类配置分页插件配置,加上注解
@EnableTransactionManagement
@Configuration
package com.cn.mybatisplus;
import com.baomidou.mybatisplus.extension.plugins.PaginationInterceptor;
import com.baomidou.mybatisplus.extension.plugins.pagination.optimize.JsqlParserCountOptimize;
import org.mybatis.spring.annotation.MapperScan;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.transaction.annotation.EnableTransactionManagement;
/**
* @author demo
*/
@SpringBootApplication
@EnableTransactionManagement
@Configuration
@MapperScan("com.cn.mybatisplus.mapper")
public class MybatisPlusDemoApplication {
public static void main(String[] args) {
SpringApplication.run(MybatisPlusDemoApplication.class, args);
}
@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;
}
}
service实现类方法
@Override
public IPage<TbUserDat> getUserPageList(Integer pageNum, Integer pageSize) {
//分页
Page<TbUserDat> page = new Page<>(pageNum,pageSize);
//加入筛选条件
QueryWrapper queryWrapper = new QueryWrapper();
queryWrapper.eq("is_delete", false);
Page<TbUserDat> tbUserDatPage = page(page, queryWrapper);
return tbUserDatPage;
}
基本业务全部代码:
controller:
package com.cn.mybatisplus.controller;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.cn.mybatisplus.entity.TbUserDat;
import com.cn.mybatisplus.service.MybatisPlusService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
import java.util.List;
/**
* @Author: demo
* @Date: 2020-05-20 15:02
*/
@RestController
public class MybatisPlusController {
@Autowired
private MybatisPlusService mybatisPlusService;
/**
* 查询用户列表
*
* @return
* */
@GetMapping("/user")
public List<TbUserDat> getUserList() {
return mybatisPlusService.getUserList();
}
/**
* 分页查询用户列表
*
* @param pageNum
* @param pageSize
* @return
* */
@GetMapping("/user/page")
public IPage<TbUserDat> getUserPageList(@RequestParam("pageNum") Integer pageNum, @RequestParam("pageSize") Integer pageSize) {
return mybatisPlusService.getUserPageList(pageNum, pageSize);
}
/**
* 根据id查询用户
*
* @param id
* @return
*/
@GetMapping("/user/{id}")
public TbUserDat getUserById(@PathVariable("id") Integer id) {
if (id == null) {
return null;
}
return mybatisPlusService.getUserById(id);
}
/**
* 新增用户
*
* @param tbUserDat
* @return
* */
@PostMapping("/user")
public Integer addUser(@RequestBody TbUserDat tbUserDat) {
return mybatisPlusService.addUser(tbUserDat);
}
/**
* 修改用户
*
* @param tbUserDat
* @return
* */
@PatchMapping("/user")
public Integer updateUser(@RequestBody TbUserDat tbUserDat) {
return mybatisPlusService.updateUser(tbUserDat);
}
/**
* 根据用户id删除用户
*
* @param id
* @return
* */
@DeleteMapping("/user/{id}")
public Integer deleteUser(@PathVariable("id") Integer id) {
return mybatisPlusService.deleteUser(id);
}
}
service:
package com.cn.mybatisplus.service;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.cn.mybatisplus.entity.TbUserDat;
import java.util.List;
/**
* @Author: demo
* @Date: 2020-05-20 15:01
*/
public interface MybatisPlusService {
/**
* 查询用户列表
*
* @return
* */
List<TbUserDat> getUserList();
/**
* 分页查询用户列表
*
* @param pageNum
* @param pageSize
* @return
* */
IPage<TbUserDat> getUserPageList(Integer pageNum, Integer pageSize);
/**
* 根据id查询用户
*
* @param id
* @return
* */
TbUserDat getUserById(Integer id);
/**
* 新增用户
*
* @param tbUserDat
* @return
* */
Integer addUser(TbUserDat tbUserDat);
/**
* 修改用户
*
* @param tbUserDat
* @return
* */
Integer updateUser(TbUserDat tbUserDat);
/**
* 根据用户id删除用户
*
* @param id
* @return
* */
Integer deleteUser(Integer id);
}
serviceImpl:
package com.cn.mybatisplus.service.impl;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.core.toolkit.ObjectUtils;
import com.baomidou.mybatisplus.core.toolkit.StringUtils;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.cn.mybatisplus.entity.TbUserDat;
import com.cn.mybatisplus.mapper.MybatisPlusMapper;
import com.cn.mybatisplus.service.MybatisPlusService;
import org.springframework.stereotype.Service;
import java.util.Date;
import java.util.List;
/**
* @Author: demo
* @Date: 2020-05-20 15:02
*/
@Service
public class MybatisPlusServiceImpl extends ServiceImpl<MybatisPlusMapper, TbUserDat> implements MybatisPlusService {
@Override
public List<TbUserDat> getUserList() {
List<TbUserDat> list = list();
return list;
}
@Override
public IPage<TbUserDat> getUserPageList(Integer pageNum, Integer pageSize) {
//分页
Page<TbUserDat> page = new Page<>(pageNum,pageSize);
//加入筛选条件
QueryWrapper queryWrapper = new QueryWrapper();
queryWrapper.eq("is_delete", false);
Page<TbUserDat> tbUserDatPage = page(page, queryWrapper);
return tbUserDatPage;
}
@Override
public TbUserDat getUserById(Integer id) {
//直接调用封装的方法
TbUserDat tbUserDat = getById(id);
return tbUserDat;
}
@Override
public Integer addUser(TbUserDat tbUserDat) {
tbUserDat.setCreateTime(new Date());
tbUserDat.setUpdateTime(new Date());
save(tbUserDat);
return tbUserDat.getId();
}
@Override
public Integer updateUser(TbUserDat tbUserDat) {
tbUserDat.setUpdateTime(new Date());
//两种方式
//第一种,根据id修改,需要校验id不能为空
if (tbUserDat.getId() == null) {
return -1;
}
updateById(tbUserDat);
//第二种,根据条件进行修改,这里需要注意eq后面的值需要和数据库的字段一致,不是实体类的字段名,注意,注意,注意
QueryWrapper<TbUserDat> queryWrapper = new QueryWrapper<>();
queryWrapper.eq("id", tbUserDat.getId());
update(tbUserDat, queryWrapper);
return tbUserDat.getId();
}
@Override
public Integer deleteUser(Integer id) {
//根据id删除id
removeById(id);
//根据条件删除id
QueryWrapper<TbUserDat> queryWrapper = new QueryWrapper<>();
queryWrapper.eq("id", id);
remove(queryWrapper);
return id;
}
}
下篇文章会介绍MybatisPlus代码生成器
Over