MyBatis-Plus开发流程:Spring Boot + MyBatis-Plus 实现对 book_tab 表的增删改查及Redis缓存

发布于:2025-03-07 ⋅ 阅读:(18) ⋅ 点赞:(0)

前言

MyBatis-Plus 是一个 MyBatis 的增强工具,旨在简化开发、减少工作量。本文将介绍如何使用 Spring Boot 集成 MyBatis-Plus 来操作数据库,并结合 Redis 实现数据的缓存功能。

1项目搭建 

1.1 创建 Spring Boot 项目

可以通过 Spring Initializr 快速创建一个新的 Spring Boot 项目,选择必要的依赖如 Spring Web, MyBatis Plus, MySQL Driver 和 Spring Data Redis 等。

1.2 添加依赖 

pom.xml 文件中添加以下依赖:

<dependencies>
    <!-- MyBatis-Plus -->
    <dependency>
        <groupId>com.baomidou</groupId>
        <artifactId>mybatis-plus-boot-starter</artifactId>
        <version>1.2.18</version>
    </dependency>
    <!-- MySQL -->
    <dependency>
        <groupId>mysql</groupId>
        <artifactId>mysql-connector-java</artifactId>
    </dependency>
    <!-- Redis -->
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-data-redis</artifactId>
    </dependency>
</dependencies>

1.3配置文件

application.ymlapplication.properties 中配置数据库连接和 Redis 连接信息。

spring:
  datasource:
    url: jdbc:mysql://localhost:3306/yourdb?useUnicode=true&characterEncoding=UTF-8&serverTimezone=Asia/Shanghai
    username: root
    password: yourpassword
  redis:
    host: localhost
    port: 6379

2开发过程

2.1 创建实体类

根据 book_tab 表结构创建对应的实体类 Book

package com.ffyc.springboot.entity;

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

@Data
@NoArgsConstructor
@AllArgsConstructor
@TableName("book_tab")
public class Book {
    @TableId(value="book_id",type = IdType.AUTO)
    private Integer id;

    @TableField("book_title")
    private String title;

    @TableField("book_author")
    private String author;

    @TableField("book_price")
    private Double price;

    @TableField("book_desc")
    private String descx;
}

2. 2编写 Mapper 接口

使用 MyBatis-Plus 提供的 BaseMapper 快速编写 DAO 层接口。 

package com.ffyc.springboot.mapper;

import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.ffyc.springboot.entity.Book;
import org.apache.ibatis.annotations.Mapper;

@Mapper
public interface IBookMapper  extends BaseMapper<Book> {

}

2.3测试方法

CURD(增删改查)的实现以及全查询,模糊查询,分页处理,缓存redis.

package com.ffyc.springboot.mapper;

import com.baomidou.mybatisplus.core.conditions.Wrapper;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.ffyc.springboot.entity.Book;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.data.redis.core.ReactiveRedisOperations;
import org.springframework.data.redis.core.StringRedisTemplate;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;

import java.util.List;

import static org.junit.Assert.*;
//构建SpringBoot测试环境
@SpringBootTest
@RunWith(SpringJUnit4ClassRunner.class)

public class IBookMapperTest {
    @Autowired//创建IBookTest的实现类
    private IBookMapper mapper;
    @Autowired//redis的操作类
    private StringRedisTemplate stringRedisTemplate;
    private ReactiveRedisOperations<Object, Object> redisTemplate;

    @Test
    public void testSave(){
//        Book book=new Book();将book对象放在循环之外,会加快运行速度,因为只用创造一个对象,
//        但是无法实现id的自增长,需要手动增ID,因此无法连续增长两次,会显示id重复

        for (int i=20;i>0;i--) {
//            book.setId(i);
            Book book=new Book();
            book.setTitle("三国"+i);
            book.setAuthor("测试数据吴承恩"+i);
            book.setPrice(99.99+i);
            book.setDescx("兴复汉室....");
            mapper.insert(book);
        }
//        book.setTitle("三国");
//        book.setAuthor("测试数据吴承恩");

//        book.setDescx("兴复汉室");
//        book.setPrice(99.99);
//        mapper.insert(book);
    }

    @Test
    public void Update(){
        Book book=new Book();
        book.setId(1);
        book.setTitle("新三国");
        book.setAuthor("测试数据吴承恩");

        book.setDescx("兴复汉室");
        book.setPrice(99.99);
        mapper.updateById(book);
    }

    @Test
    public void Delete(){
        mapper.deleteById(1);
    }

    @Test
    public void testFindAll() {
        System.out.println( mapper.selectList(null));

    }
    @Test
    public  void testFindCondition() {
        LambdaQueryWrapper<Book> querwrapper = new LambdaQueryWrapper<>();
//        querwrapper.like(Book::getTitle, "三");
        querwrapper.like(Book::getAuthor,"恩").eq(Book::getTitle,"三国");

        System.out.println(mapper.selectList(querwrapper));

    }

    /**
     * 分页,从第1页开始,20条为一列
     */

    @Test
    public void testPage() {
        IPage<Book> page = new Page<>();
        page.setCurrent(1);
        page.setSize(20); //limit 0,50

        LambdaQueryWrapper<Book> queryWrapper = new LambdaQueryWrapper<>();
        IPage<Book> bookIPage = mapper.selectPage(page, queryWrapper);

        System.out.println(bookIPage.getRecords());

//        books.forEach(System.out::println);


    }

    @Test
    public void redisSave(){
        for(int i=1;i<30;i++) {
            Book book =mapper.selectById(i);
            System.out.println(book);
            stringRedisTemplate.opsForValue().set(String.valueOf(book.getId()), book.getTitle());//放入redis里
        }
//        Book book =mapper.selectById(1);
//        System.out.println(book);
        stringRedisTemplate.opsForValue().set(String.valueOf(book.getTitle()),book.getAuthor());
//        stringRedisTemplate.opsForValue().set(String.valueOf(book.getId()), book.getTitle());
        //放入redis里

//        redisTemplate.opsForValue().set("name","吴承恩");
//        System.out.println(redisTemplate.opsForValue().get("name"));
    }



}

分页的原因是解决数据量过大的问题,使用limit进行拦截

 在实现分页的时候,记得先安装分页的插件,MyBatis-Plus的分页插件PaginationInnerInterceptor提供了强大的分页功能,支持多种数据库,使得分页查询变得简洁高效。

package com.ffyc.springboot.config;

import com.baomidou.mybatisplus.annotation.DbType;
import com.baomidou.mybatisplus.extension.plugins.MybatisPlusInterceptor;
import com.baomidou.mybatisplus.extension.plugins.inner.PaginationInnerInterceptor;
import org.mybatis.spring.annotation.MapperScan;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

/**
 * 分页拦截器
 * @ClassName MybatisplusInterceptor
 * @Description TODO
 * @Author 49354
 * @Date 2025/3/2 14:32
 * @Version 1.0
 */
@Configuration  //配置,交给管家-spring
@MapperScan("com.ffyc.springboot.mapper")
public class MybatisplusInterceptor {


    //让管家spring帮我们造成拦截器对象
    @Bean
    public MybatisPlusInterceptor mybatisPlusInterceptor() {
        MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();
        interceptor.addInnerInterceptor(new PaginationInnerInterceptor(DbType.MYSQL)); // 如果配置多个插件, 切记分页最后添加
        // 如果有多数据源可以不配具体类型, 否则都建议配上具体的 DbType
        return interceptor;
    }

}

结语

通过上述步骤,我们已经完成了使用 Spring Boot 和 MyBatis-Plus 对 book_tab 表进行增删改查操作,并实现了简单的 Redis 缓存机制。MyBatis-Plus 极大地简化了我们的开发流程,让我们能够更专注于业务逻辑的实现。希望这篇博客能帮助你快速上手 MyBatis-Plus 的开发。