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

MyBatis Plus学习:从入门到实践的简单教程

标签:
Java 数据库
概述

本文详细介绍了MyBatis Plus学习的相关内容,包括MyBatis Plus的功能特点、与MyBatis的区别、安装与环境搭建步骤以及基本使用方法。文章还深入讲解了MyBatis Plus的高级特性、与Spring Boot的集成以及事务管理等知识点。

MyBatis Plus简介

MyBatis Plus是什么

MyBatis Plus 是一个 MyBatis 的增强工具,它在 MyBatis 的基础上提供了大量的开箱即用的功能,极大简化了开发人员的工作量。它提供了简单的 CRUD 操作、分页插件、逻辑删除、自动填充等功能,同时支持自定义扩展,可以方便地与各种主流框架(如 Spring Boot)进行集成。

MyBatis Plus与MyBatis的区别

MyBatis 本身是一个持久化框架,它提供了将 Java 对象与数据库表进行映射的能力,简化了数据库操作。而 MyBatis Plus 是在 MyBatis 的基础上进行了功能扩展,提供了更多的便捷功能,比如自动生成 CRUD 操作、分页插件、逻辑删除等。

  • MyBatis

    • 需要手动编写 SQL 语句,包括增删改查等操作。
    • 需要手动编写分页逻辑。
    • 缺乏逻辑删除功能。
  • MyBatis Plus
    • 自动生成 CRUD 操作,无需手动编写 SQL。
    • 提供分页插件,无需手动编写分页逻辑。
    • 支持逻辑删除,可以通过配置实现软删除。

MyBatis Plus的安装与环境搭建

安装步骤

  1. 添加 Maven 依赖
    在你的 pom.xml 文件中添加 MyBatis Plus 的依赖。

    <dependency>
       <groupId>com.baomidou</groupId>
       <artifactId>mybatis-plus-boot-starter</artifactId>
       <version>3.4.3</version>
    </dependency>
  2. 数据库配置
    application.yml 或者 application.properties 文件中配置数据库连接信息。

    spring:
     datasource:
       url: jdbc:mysql://localhost:3306/mydb?useUnicode=true&characterEncoding=UTF-8&useSSL=false
       username: root
       password: root
       driver-class-name: com.mysql.cj.jdbc.Driver
  3. 创建实体类
    创建一个简单的实体类,例如 User 类。

    import com.baomidou.mybatisplus.annotation.IdType;
    import com.baomidou.mybatisplus.annotation.TableId;
    import com.baomidou.mybatisplus.annotation.TableName;
    import lombok.Data;
    
    @Data
    @TableName("user")
    public class User {
       @TableId(value = "id", type = IdType.AUTO)
       private Long id;
       private String name;
       private Integer age;
    }
  4. 创建 Mapper 接口
    创建一个 Mapper 接口,继承 BaseMapper 接口。

    import com.baomidou.mybatisplus.core.mapper.BaseMapper;
    
    public interface UserMapper extends BaseMapper<User> {
    }
  5. 创建配置类
    创建一个配置类来初始化 MyBatis Plus。

    import com.baomidou.mybatisplus.annotation.DbType;
    import com.baomidou.mybatisplus.extension.plugins.MybatisPlusInterceptor;
    import com.baomidou.mybatisplus.extension.plugins.inner.PaginationInnerInterceptor;
    import org.springframework.context.annotation.Bean;
    import org.springframework.context.annotation.Configuration;
    
    @Configuration
    public class MyBatisPlusConfig {
       @Bean
       public MybatisPlusInterceptor mybatisPlusInterceptor() {
           MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();
           interceptor.addInnerInterceptor(new PaginationInnerInterceptor(DbType.MYSQL));
           return interceptor;
       }
    }

完成以上步骤后,MyBatis Plus 的环境就搭建好了。

MyBatis Plus的基本使用

数据库配置

在 Spring Boot 项目中,数据库配置通常在 application.ymlapplication.properties 文件中完成。以下是一个示例:

spring:
  dataSource:
   url: jdbc:mysql://localhost:3306/mydb?useUnicode=true&characterEncoding=UTF-8&useSSL=false
   username: root
   password: root
   driver-class-name: com.mysql.cj.jdbc.Driver

实体类和Mapper接口的创建

实体类

实体类通常使用 MyBatis Plus 提供的注解进行定义,例如 @TableName@TableId

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

@Data
@TableName("user")
public class User {
    @TableId(value = "id", type = IdType.AUTO)
    private Long id;
    private String name;
    private Integer age;
}

Mapper接口

Mapper 接口继承 BaseMapper 接口,MyBatis Plus 会自动生成相应的 CRUD 方法。

import com.baomidou.mybatisplus.core.mapper.BaseMapper;

public interface UserMapper extends BaseMapper<User> {
}

基本的CRUD操作

添加数据

import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

@Service
public class UserService extends ServiceImpl<UserMapper, User> {
    @Autowired
    private UserMapper userMapper;

    public void addUser(User user) {
        userMapper.insert(user);
    }
}

查询数据

public User getUserById(Long id) {
    return userMapper.selectById(id);
}

更新数据

public boolean updateUser(User user) {
    return userMapper.updateById(user) > 0;
}

删除数据

public boolean deleteUser(Long id) {
    return userMapper.deleteById(id) > 0;
}
MyBatis Plus的高级特性

条件构造器的使用

MyBatis Plus 提供了一个强大的条件构造器 QueryWrapper,可以用来构建复杂的查询条件。

import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;

public List<User> getUsersByCondition(String name, Integer age) {
    QueryWrapper<User> wrapper = new QueryWrapper<>();
    wrapper.eq("name", name);
    wrapper.gt("age", age);
    return userMapper.selectList(wrapper);
}

分页插件的配置与使用

分页插件可以方便地进行分页查询。

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

@Configuration
public class MyBatisPlusConfig {
    @Bean
    public MybatisPlusInterceptor mybatisPlusInterceptor() {
        MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();
        interceptor.addInnerInterceptor(new PaginationInnerInterceptor(DbType.MYSQL));
        return interceptor;
    }
}

分页查询

import com.baomidou.mybatisplus.extension.plugins.pagination.Page;

public Page<User> getUsersByPage(Integer current, Integer size) {
    Page<User> page = new Page<>(current, size);
    return userMapper.selectPage(page, null);
}

自动填充与逻辑删除

自动填充

可以通过 MetaObjectHandler 接口实现自动填充功能。

import com.baomidou.mybatisplus.annotation.DbType;
import com.baomidou.mybatisplus.core.handlers.MetaObjectHandler;
import com.baomidou.mybatisplus.extension.plugins.inner.PaginationInnerInterceptor;
import org.apache.ibatis.reflection.MetaObject;
import org.springframework.stereotype.Component;

@Component
public class MyMetaObjectHandler implements MetaObjectHandler {
    @Override
    public void insertFill(MetaObject metaObject) {
        metaObject.setValue("createTime", new Date());
        metaObject.setValue("updateTime", new Date());
    }

    @Override
    public void updateFill(MetaObject metaObject) {
        metaObject.setValue("updateTime", new Date());
    }
}

逻辑删除

通过 @TableLogic 注解实现逻辑删除功能。

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

@Data
@TableName("user")
public class User {
    @TableId(value = "id", type = IdType.AUTO)
    private Long id;
    @TableLogic
    private Integer deleted;
    private String name;
    private Integer age;
}
MyBatis Plus与Spring Boot的集成

Spring Boot项目的创建

使用 spring initializr 创建一个新的 Spring Boot 项目,并选择依赖项。

MyBatis Plus在Spring Boot中的配置

添加依赖

pom.xml 文件中添加 MyBatis Plus 的依赖。

<dependency>
    <groupId>com.baomidou</groupId>
    <artifactId>mybatis-plus-boot-starter</artifactId>
    <version>3.4.3</version>
</dependency>

配置文件

配置数据库连接信息。

spring:
  dataSource:
   url: jdbc:mysql://localhost:3306/mydb?useUnicode=true&characterEncoding=UTF-8&useSSL=false
   username: root
   password: root
   driver-class-name: com.mysql.cj.jdbc.Driver

配置类

配置 MyBatis Plus 插件。

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

@Configuration
public class MyBatisPlusConfig {
    @Bean
    public MybatisPlusInterceptor mybatisPlusInterceptor() {
        MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();
        interceptor.addInnerInterceptor(new PaginationInnerInterceptor(DbType.MYSQL));
        return interceptor;
    }
}

使用MyBatis Plus进行数据库操作

实体类

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

@Data
@TableName("user")
public class User {
    @TableId(value = "id", type = IdType.AUTO)
    private Long id;
    private String name;
    private Integer age;
}

Mapper接口

import com.baomidou.mybatisplus.core.mapper.BaseMapper;

public interface UserMapper extends BaseMapper<User> {
}

服务层

import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

@Service
public class UserService extends ServiceImpl<UserMapper, User> {
    @Autowired
    private UserMapper userMapper;

    public void addUser(User user) {
        userMapper.insert(user);
    }

    public User getUserById(Long id) {
        return userMapper.selectById(id);
    }

    public boolean updateUser(User user) {
        return userMapper.updateById(user) > 0;
    }

    public boolean deleteUser(Long id) {
        return userMapper.deleteById(id) > 0;
    }
}
MyBatis Plus的事务管理

事务的基本概念

事务是数据库操作中的一个基本概念,它是一组操作的集合,这些操作要么全部成功,要么全部失败。事务具有以下四个特性:

  • 原子性:事务是一个不可分割的工作单位,事务中的操作要么全部成功,要么全部失败。
  • 一致性:事务必须使数据库从一个一致性状态转换到另一个一致性状态。
  • 隔离性:一个事务的执行不能被其他事务干扰。
  • 持久性:事务一旦提交,其结果就应该是永久性的。

MyBatis Plus中的事务处理

MyBatis Plus 提供了事务的支持,可以通过 Spring 的事务管理机制来处理事务。

开启事务

默认情况下,Spring Boot 会自动配置事务管理器。可以通过 @Transactional 注解来控制方法级别的事务。

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

@Service
public class UserService {
    @Autowired
    private UserMapper userMapper;

    @Transactional
    public void addUser(User user) {
        userMapper.insert(user);
    }

    @Transactional
    public void addUserWithException(User user) {
        userMapper.insert(user);
        // 引发异常
        throw new RuntimeException("Something went wrong");
    }
}

事务的提交与回滚

如果事务中没有抛出异常,事务会自动提交;如果抛出了异常,事务会自动回滚。

实际应用示例

假设我们需要在一个方法中同时插入多个用户,如果任意一个插入失败,整个操作都应该回滚。

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

@Service
public class UserService {
    @Autowired
    private UserMapper userMapper;

    @Transactional
    public void addUsers(List<User> users) {
        for (User user : users) {
            userMapper.insert(user);
            // 模拟插入失败
            if (user.getId() % 2 == 0) {
                throw new RuntimeException("Insert failed for user " + user.getName());
            }
        }
    }
}
MyBatis Plus的日志与测试

日志配置与输出

MyBatis Plus 支持多种日志框架,如 Log4j、Logback 等。可以通过配置文件来设置日志输出。

Logback 配置

<configuration>
    <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
        <encoder>
            <pattern>%d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n</pattern>
        </encoder>
    </appender>

    <logger name="com.baomidou.mybatisplus" level="DEBUG" />

    <root level="info">
        <appender-ref ref="STDOUT" />
    </root>
</configuration>

测试环境的搭建

可以通过 JUnit 来编写单元测试,确保代码的正确性。

测试类

import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;

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

    @Test
    public void testAddUser() {
        User user = new User();
        user.setName("Test User");
        user.setAge(25);
        userService.addUser(user);

        User savedUser = userService.getUserById(user.getId());
        assert savedUser != null;
        assert savedUser.getName().equals("Test User");
        assert savedUser.getAge() == 25;
    }
}

常见问题及解决方案

问题:插入数据时主键冲突

解决方案:在实体类中设置主键生成策略。

import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableId;

@TableId(value = "id", type = IdType.AUTO)
private Long id;

问题:查询数据时数据库连接失败

解决方案:检查数据库连接配置是否正确,确保数据库服务已启动。

问题:事务处理失败

解决方案:确保 @Transactional 注解正确使用,并检查事务传播行为是否符合预期。

通过以上步骤和示例代码,你可以详细了解和掌握 MyBatis Plus 的使用方法及其与 Spring Boot 的集成。希望这篇文章对你有所帮助。

点击查看更多内容
TA 点赞

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

评论

作者其他优质文章

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

100积分直接送

付费专栏免费学

大额优惠券免费领

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

举报

0/150
提交
取消