寫在開始:一個搬磚程序員的隨緣記錄
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項目
可以看之前的文章:SpringBoot項目快速搭建
項目結構:
1、Mybatis-Plus的依賴
<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>
2、在 Spring Boot 啓動類中添加 @MapperScan 註解,掃描 Mapper 文件夾:
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);
}
}
3、數據源配置
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
三、MyBatis-Plus
編寫實體類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;
}
1、Mybatis-Plus註解
上面用到幾個常用的Mybatis-plus註解
- @TableId
@TableId(type = IdType.AUTO)
描述:主鍵註解
- @TableField
@TableField(value = "create_date", fill = FieldFill.INSERT)
描述:只有進行新增操作纔會進行更新這個字段,用於創建時間類字段
@TableField(value = "update_date", fill = FieldFill.INSERT_UPDATE)
描述:只有進行新增操作纔會進行更新這個字段,用於修改時間類字段
主要在於fill的使用
- @TableLogic
需要在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註解
想了解更多註解可以去官網看文檔
2、條件構造器
1、eq
- 相當於=
- 例: eq(“name”, “小白”)—>name = ‘小白’
2、ne
- 不等於 !=
- 例: ne(“name”, “小白”)—>name != ‘小白’
3、gt
- 大於 >
- 例: gt(“age”, 18)—>age > 18
4、ge
- 大於等於 >=
- 例: ge(“age”, 18)—>age >= 18
5、lt
- 小於 <
- 例: lt(“age”, 18)—>age < 18
6、le
- 小於等於 <=
- 例: le(“age”, 18)—>age <= 18
3、CRUD 接口
增刪改查都有多種不同的方式,這裏只列舉常用的
1、save
描述:保存
// 插入一條記錄(選擇字段,策略插入)
boolean save(T entity);
2、remove
描述:刪除,有配置物理刪除就是物理刪除不會刪除數據
// 根據 entity 條件,刪除記錄
boolean remove(Wrapper<T> queryWrapper);
3、update
描述:修改
// 根據 whereEntity 條件,更新記錄
boolean update(T entity, Wrapper<T> updateWrapper);
4、getById
描述:根據id查詢詳情
// 根據 ID 查詢
T getById(Serializable id);
5、list
描述:查詢列表
// 查詢所有
List<T> list();
6、page
描述:分頁查詢
// 無條件翻頁查詢
IPage<T> page(IPage<T> page);
7、count
描述:查詢總條數
// 查詢總記錄數
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