为了账号安全,请及时绑定邮箱和手机立即绑定

MyBatisPlus学习:从入门到简单应用

概述

MyBatisPlus是一款基于MyBatis的增强工具,旨在简化数据库操作并提高开发效率,提供了丰富的功能如CRUD操作、查询构造器、分页插件和自动填充等。它支持多种自定义扩展,使开发人员能够更高效地处理数据库相关任务。本文将详细介绍MyBatisPlus的学习和应用,帮助读者掌握其核心特性。

MyBatisPlus简介
MyBatisPlus是什么

MyBatisPlus是一款基于MyBatis的增强工具,旨在简化MyBatis的使用,提高开发效率。它提供了许多开箱即用的功能,如CRUD操作、查询构造器、分页插件、自动填充等,同时也支持自定义扩展,使其成为一个强大且灵活的MyBatis扩展工具。

MyBatisPlus的优点
  1. 简化开发

    • 自动生成CRUD操作,减少代码量。
    • 提供了条件构造器,简化了SQL语句的构建。
    • 支持自定义SQL扩展,满足更多业务需求。
  2. 提高效率

    • 通过内置分页插件,简化了分页操作。
    • 自动填充功能,可以自动处理一些常见的数据填充任务。
    • 逻辑删除功能,避免了物理删除带来的数据丢失风险。
  3. 易于扩展

    • 提供了多种插件,可以灵活扩展功能,如缓存插件、数据源插件等。
    • 可以自定义拦截器,实现特定的业务逻辑。
  4. 优化体验
    • 提供了更加友好的错误提示和异常处理机制。
    • 通过注解和配置简化了数据库操作的配置。
MyBatisPlus与MyBatis的关系

MyBatisPlus是基于MyBatis构建的,可以看作是MyBatis的一个增强版本。它提供了许多开箱即用的功能,简化了MyBatis的使用。MyBatisPlus支持MyBatis的所有功能,同时增加了更多的便捷性和扩展性。

环境搭建
开发环境准备

在开始使用MyBatisPlus之前,需要准备好开发环境。这里推荐使用Spring Boot作为开发框架,因为它简化了项目构建和配置过程。

  1. 安装JDK:确保已经安装了JDK,并且环境变量已经配置好。
  2. 安装IDE:推荐使用IntelliJ IDEA或者Eclipse进行开发。
  3. 安装Maven:用于管理项目的依赖和构建工具。
  4. 安装数据库:推荐使用MySQL作为数据库。
MyBatisPlus依赖引入

在Spring Boot项目中引入MyBatisPlus依赖,可以通过在pom.xml文件中添加以下依赖来实现:

<dependency>
    <groupId>com.baomidou</groupId>
    <artifactId>mybatis-plus-boot-starter</artifactId>
    <version>3.4.2</version>
</dependency>
<dependency>
    <groupId>mysql</groupId>
    <artifactId>mysql-connector-java</artifactId>
    <version>8.0.25</version>
</dependency>
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-jdbc</artifactId>
</dependency>
<dependency>
    <groupId>org.springframework.boot</groupId>
   .
    <artifactId>spring-boot-starter-web</artifactId>
</dependency>
创建第一个MyBatisPlus项目

创建一个新的Spring Boot项目,使用Spring Initializr快速生成项目结构。具体步骤如下:

  1. 创建项目

    • 打开IDE,选择Spring Initializr新建一个项目。
    • 选择Spring Boot版本,这里选择2.3.0.RELEASE
    • 选择Java版本,这里选择Java 11
    • 选择构建工具,这里选择Maven
    • 选择依赖,这里选择Spring WebMyBatis
  2. 修改application.properties
    src/main/resources目录下找到application.properties文件,添加数据库连接配置:

    spring.datasource.url=jdbc:mysql://localhost:3306/mybatisplus?useSSL=false&useUnicode=true&characterEncoding=utf-8
    spring.datasource.username=root
    spring.datasource.password=root
    spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
  3. 创建实体类
    创建一个简单的实体类User,用于测试CRUD操作。

    package com.example.demo.entity;
    
    import com.baomidou.mybatisplus.annotation.TableId;
    import com.baomidou.mybatisplus.annotation.TableName;
    import lombok.Data;
    
    @Data
    @TableName(value = "user")
    public class User {
       @TableId
       private Long id;
       private String name;
       private Integer age;
       private String email;
    }
  4. 创建Mapper接口
    创建一个简单的Mapper接口UserMapper,用于定义CRUD操作。

    package com.example.demo.mapper;
    
    import com.baomidou.mybatisplus.core.mapper.BaseMapper;
    import com.example.demo.entity.User;
    import org.apache.ibatis.annotations.Mapper;
    
    @Mapper
    public interface UserMapper extends BaseMapper<User> {
    }
  5. 配置application.yml
    src/main/resources目录下找到application.yml文件,配置MyBatisPlus的全局配置:

    mybatis-plus:
     mapper-locations: classpath*:mapper/*.xml
     global-config:
       db-config:
         id-type: auto
  6. 测试项目
    运行项目并验证是否成功连接数据库以及是否能够正常运行。
基本使用
CRUD操作

MyBatisPlus提供了简单的CRUD操作,可以通过继承BaseMapper接口实现。

package com.example.demo.service;

import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.example.demo.entity.User;
import com.example.demo.mapper.UserMapper;
import org.springframework.stereotype.Service;

@Service
public class UserService extends ServiceImpl<UserMapper, User> {
    // 可以添加更多业务逻辑
}

通过继承ServiceImpl类,并指定实体类和Mapper接口,MyBatisPlus会自动提供基础的CRUD操作实现。

条件构造器的使用

MyBatisPlus提供了条件构造器QueryWrapper,用于构建复杂的查询条件。

package com.example.demo.service;

import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.example.demo.entity.User;
import com.example.demo.mapper.UserMapper;
import org.springframework.stereotype.Service;

@Service
public class UserService {
    private final UserMapper userMapper;

    public UserService(UserMapper userMapper) {
        this.userMapper = userMapper;
    }

    public User getUserByName(String name) {
        QueryWrapper<User> queryWrapper = new QueryWrapper<>();
        queryWrapper.eq("name", name);
        return userMapper.selectOne(queryWrapper);
    }
}
自动填充和逻辑删除

MyBatisPlus支持自动填充字段和逻辑删除,可以使用注解进行配置。

package com.example.demo.entity;

import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableName;
import com.baomidou.mybatisplus.annotation.TableLogic;
import com.baomidou.mybatisplus.annotation.FieldFill;
import lombok.Data;

import java.util.Date;

@TableName(value = "user")
@Data
public class User {
    @TableId
    private Long id;
    private String name;
    private Integer age;
    private String email;

    @TableLogic
    private Integer deleted;

    @TableField(fill = FieldFill.INSERT)
    private Date createTime;

    @TableField(fill = FieldFill.INSERT_UPDATE)
    private Date updateTime;
}
测试项目

ApplicationTests类中测试上述功能。

package com.example.demo;

import com.example.demo.entity.User;
import com.example.demo.service.UserService;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;

@SpringBootTest
public class ApplicationTests {
    @Autowired
    private UserService userService;

    @Test
    public void testGetUserByName() {
        User user = userService.getUserByName("John");
        System.out.println(user);
    }

    @Test
    public void testCreateUser() {
        User user = new User();
        user.setName("John");
        user.setAge(28);
        user.setEmail("john@example.com");
        userService.save(user);
    }

    @Test
    public void testUpdateUser() {
        User user = new User();
        user.setId(1L);
        user.setName("Jane");
        user.setAge(27);
        user.setEmail("jane@example.com");
        userService.updateById(user);
    }

    @Test
    public void testDeleteUser() {
        User user = new User();
        user.setId(1L);
        userService.removeById(1L);
    }
}
高级功能探索
分页插件

MyBatisPlus提供了分页插件,可以在项目中集成使用。以下是集成分页插件的步骤:

  1. 启用分页插件
    application.properties中配置分页插件:

    mybatis-plus.page-size=10
  2. 使用分页插件
    在代码中使用Page对象进行分页查询:

    import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
    
    Page<Book> page = new Page<>(1, 10);
    page = bookService.page(page);
树形数据处理

处理树形结构数据时,可以使用MyBatisPlus提供的树形插件。这里以一个简单的分类系统为例,展示如何处理树形数据。

  1. 创建实体类

    package com.example.demo.entity;
    
    import com.baomidou.mybatisplus.annotation.TableId;
    import com.baomidou.mybatisplus.annotation.TableName;
    import com.baomidou.mybatisplus.annotation.TreeParentField;
    import lombok.Data;
    
    @TableName(value = "category")
    @Data
    public class Category {
       @TableId
       private Long id;
       private String name;
       @TreeParentField
       private Long parentId;
    }
  2. 启用树形插件
    在Spring Boot启动类中配置树形插件:

    package com.example.demo;
    
    import com.baomidou.mybatisplus.extension.plugins.MybatisPlusInterceptor;
    import com.baomidou.mybatisplus.extension.plugins.inner.TreeInnerInterceptor;
    import org.springframework.boot.SpringApplication;
    import org.springframework.boot.autoconfigure.SpringBootApplication;
    import org.springframework.context.annotation.Bean;
    
    @SpringBootApplication
    public class DemoApplication {
    
       public static void main(String[] args) {
           SpringApplication.run(DemoApplication.class, args);
       }
    
       @Bean
       public MybatisPlusInterceptor mybatisPlusInterceptor() {
           MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();
           interceptor.addInnerInterceptor(new TreeInnerInterceptor());
           return interceptor;
       }
    }
  3. 使用树形插件
    在代码中使用树形插件进行查询:

    import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
    import com.example.demo.entity.Category;
    import com.example.demo.mapper.CategoryMapper;
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.stereotype.Service;
    
    @Service
    public class CategoryService {
       @Autowired
       private CategoryMapper categoryMapper;
    
       public List<Category> getCategoryTree() {
           return categoryMapper.selectList(new QueryWrapper<>());
       }
    }
自定义SQL扩展

MyBatisPlus允许自定义扩展SQL,可以通过继承BaseMapper接口并添加自定义方法来实现。

  1. 创建Mapper接口

    package com.example.demo.mapper;
    
    import com.baomidou.mybatisplus.core.mapper.BaseMapper;
    import com.example.demo.entity.Book;
    import org.apache.ibatis.annotations.Mapper;
    import org.apache.ibatis.annotations.Select;
    
    @Mapper
    public interface BookMapper extends BaseMapper<Book> {
       @Select("SELECT * FROM book WHERE price > #{price}")
       List<Book> selectExpensiveBooks(Double price);
    }
  2. 使用自定义SQL
    在Service中调用自定义的方法:

    package com.example.demo.service;
    
    import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
    import com.example.demo.entity.Book;
    import com.example.demo.mapper.BookMapper;
    import org.springframework.stereotype.Service;
    
    @Service
    public class BookService extends ServiceImpl<BookMapper, Book> {
       public List<Book> getExpensiveBooks(Double price) {
           return baseMapper.selectExpensiveBooks(price);
       }
    }
入门实例
实战案例详解

假设我们有一个图书管理系统,需要实现添加、删除、更新和查询图书的功能。

  1. 创建实体类

    package com.example.demo.entity;
    
    import com.baomidou.mybatisplus.annotation.TableId;
    import com.baomidou.mybatisplus.annotation.TableName;
    import lombok.Data;
    
    @TableName(value = "book")
    @Data
    public class Book {
       @TableId
       private Long id;
       private String title;
       private String author;
       private Integer price;
    }
  2. 创建Mapper接口

    package com.example.demo.mapper;
    
    import com.baomidou.mybatisplus.core.mapper.BaseMapper;
    import com.example.demo.entity.Book;
    import org.apache.ibatis.annotations.Mapper;
    
    @Mapper
    public interface BookMapper extends BaseMapper<Book> {
    }
  3. 创建Service

    package com.example.demo.service;
    
    import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
    import com.example.demo.entity.Book;
    import com.example.demo.mapper.BookMapper;
    import org.springframework.stereotype.Service;
    
    @Service
    public class BookService extends ServiceImpl<BookMapper, Book> {
       // 可以添加更多业务逻辑
    }
  4. 测试项目

    package com.example.demo;
    
    import com.example.demo.entity.Book;
    import com.example.demo.service.BookService;
    import org.junit.jupiter.api.Test;
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.boot.test.context.SpringBootTest;
    
    @SpringBootTest
    public class BookTests {
       @Autowired
       private BookService bookService;
    
       @Test
       public void testSaveBook() {
           Book book = new Book();
           book.setTitle("Java编程思想");
           book.setAuthor("Bruce Eckel");
           book.setPrice(89);
           bookService.save(book);
       }
    
       @Test
       public void testUpdateBook() {
           Book book = new Book();
           book.setId(1L);
           book.setTitle("Java核心技术");
           book.setAuthor("Cay Horstmann");
           book.setPrice(128);
           bookService.updateById(book);
       }
    
       @Test
       public void testDeleteBook() {
           bookService.removeById(1L);
       }
    
       @Test
       public void testGetBook() {
           Book book = bookService.getById(1L);
           System.out.println(book);
       }
    }
常见问题解决
  1. 如何解决分页问题
    MyBatisPlus提供了分页插件,可以在application.properties中配置:

    mybatis-plus.page-size=10

    或者在代码中使用Page对象:

    import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
    
    Page<Book> page = new Page<>(1, 10);
    page = bookService.page(page);
  2. 如何处理数据填充问题
    使用@TableField注解,设置填充时机:

    @TableField(fill = FieldFill.INSERT)
    private Date createTime;
    
    @TableField(fill = FieldFill.INSERT_UPDATE)
    private Date updateTime;
实际项目中的应用

在实际项目中,MyBatisPlus可以应用于多个方面,如:

  1. CRUD操作:简化数据库操作,减少代码量。
  2. 查询构造器:构建复杂的查询条件。
  3. 分页插件:简化分页操作。
  4. 缓存插件:优化查询性能。
  5. 逻辑删除:避免物理删除带来的数据丢失风险。
总结与展望
学习收获

通过学习MyBatisPlus,我们掌握了简化数据库操作的方法,提高了开发效率。同时,MyBatisPlus提供了丰富的功能,如CRUD操作、查询构造器、分页插件、自动填充等,使得开发数据库相关功能变得更加便捷。

推荐资源和社区

为了进一步学习MyBatisPlus,可以参考以下资源:

  1. MyBatisPlus官方文档
  2. MyBatisPlus GitHub仓库
  3. 慕课网 提供了大量的MyBatisPlus相关课程和教程。
MyBatisPlus未来发展趋势

随着技术的发展,MyBatisPlus也在不断更新,增加了更多的功能和优化。未来发展趋势主要包括:

  1. 更多插件支持:提供更多的插件,如缓存插件、数据源插件等。
  2. 更好的性能优化:优化查询性能,提高系统响应速度。
  3. 更强的扩展性:支持更多类型的数据库,满足更多的业务需求。
  4. 更好的社区支持:通过社区反馈和贡献,持续改进和优化MyBatisPlus。
点击查看更多内容
TA 点赞

若觉得本文不错,就分享一下吧!

评论

作者其他优质文章

正在加载中
  • 推荐
  • 评论
  • 收藏
  • 共同学习,写下你的评论
感谢您的支持,我会继续努力的~
扫码打赏,你说多少就多少
赞赏金额会直接到老师账户
支付方式
打开微信扫一扫,即可进行扫码打赏哦
今天注册有机会得

100积分直接送

付费专栏免费学

大额优惠券免费领

立即参与 放弃机会
意见反馈 帮助中心 APP下载
官方微信

举报

0/150
提交
取消