從零開始,初識Mybatis-Plus

寫在開始:一個搬磚程序員的隨緣記錄

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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章