亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定

MyBatis-Plus入門:新手必讀指南

標簽:
Java 數據庫
概述

MyBatis-Plus入门介绍了一个强大的MyBatis增强工具,它提供了大量的简化编码特性,如CRUD增强、条件构造器和分页插件等,帮助开发者提高开发效率。本文详细讲解了MyBatis-Plus的核心特点、环境搭建以及基本的CRUD操作,旨在帮助新手快速上手。

MyBatis-Plus简介

MyBatis-Plus是什么

MyBatis-Plus 是一个 MyBatis 的增强工具,它在 MyBatis 的基础上提供了大量简化编码的特性,极大地提升了开发效率。MyBatis-Plus 并不是对 MyBatis 的封闭封装,而是在 MyBatis 基础上延伸出来的一个扩展插件,提供了一些开箱即用的功能,如分页、条件构造器、自定义全局主键等。以下是 MyBatis-Plus 的简单使用示例:

import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import org.springframework.stereotype.Repository;

@TableName("user")
public class User {
    @TableId(type = IdType.AUTO)
    private Long id;
    private String name;
    private Integer age;
    private String email;
    private String createTime;
    private String updateTime;

    // Getter and Setter methods
}

@Repository
public interface UserMapper extends BaseMapper<User> {
}

MyBatis-Plus的核心特点

MyBatis-Plus 的核心特点包括:

  1. 无侵入:MyBatis-Plus 对原 MyBatis 的代码零侵入,可以与 MyBatis 完美融合。
  2. CRUD 增强:MyBatis-Plus 提供了大量的 CRUD 方法,简化了数据库操作。
  3. 条件构造器:提供了一个强大的条件构造器,可以灵活地构建复杂的查询条件。
  4. 分页插件:内置了分页插件,支持多种分页方式。
  5. 自定义主键:支持多种主键策略,如自增主键、UUID、雪花算法等。
  6. 逻辑删除:提供逻辑删除功能,避免物理删除带来的数据丢失风险。
  7. 其他特性:包括乐观锁、动态表名、全局乐观锁等。

MyBatis-Plus与MyBatis的区别

MyBatis-Plus 与 MyBatis 的主要区别在于:

  • 基础特性:MyBatis 是一个持久层框架,提供了基础的 SQL 映射功能;MyBatis-Plus 是在此基础上增加了大量的增强特性。
  • 功能增强:MyBatis-Plus 提供了大量的增强功能,如自动填充、逻辑删除、分页插件、条件构造器等。
  • 使用方式:MyBatis-Plus 提供了简洁的接口和注解,使得操作更加直观和便捷。
  • 开发效率:MyBatis-Plus 大大降低了开发者的开发工作量,提高了开发效率。
环境搭建

开发环境准备

为了在项目中使用 MyBatis-Plus,首先需要搭建开发环境。这里以 Spring Boot 项目为例,介绍开发环境的准备。

  1. 安装 JDK:确保已经安装了 JDK,并配置好环境变量。
  2. 安装 Maven:确保已经安装了 Maven,并配置好环境变量。

Maven 依赖配置

在 Spring Boot 项目中引入 MyBatis-Plus 依赖,可以在 pom.xml 文件中添加以下配置:

<dependency>
    <groupId>com.baomidou</groupId>
    <artifactId>mybatis-plus-boot-starter</artifactId>
    <version>3.4.3</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>

快速开始示例

假设已经搭建好了开发环境,并在项目中添加了 MyBatis-Plus 依赖,接下来可以快速开始使用 MyBatis-Plus。

  1. 创建数据库表:首先需要在数据库中创建一个表。例如,创建一个 user 表:

    CREATE TABLE `user` (
       `id` BIGINT NOT NULL AUTO_INCREMENT,
       `name` VARCHAR(50),
       `age` INT,
       `email` VARCHAR(50),
       `create_time` TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
       `update_time` TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
       PRIMARY KEY (`id`)
    ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
  2. 定义实体类:创建一个对应的实体类 User

    import com.baomidou.mybatisplus.annotation.IdType;
    import com.baomidou.mybatisplus.annotation.TableId;
    import com.baomidou.mybatisplus.annotation.TableName;
    
    @TableName("user")
    public class User {
       @TableId(type = IdType.AUTO)
       private Long id;
       private String name;
       private Integer age;
       private String email;
       private String createTime;
       private String updateTime;
    
       // Getter and Setter methods
    }
  3. 创建 Mapper 接口:定义一个 UserMapper 接口,继承 BaseMapper

    import com.baomidou.mybatisplus.core.mapper.BaseMapper;
    import com.demo.entity.User;
    
    public interface UserMapper extends BaseMapper<User> {
    }
  4. 配置数据库连接:在 application.yml 中配置数据库连接信息:

    spring:
     datasource:
       url: jdbc:mysql://localhost:3306/mydb?useUnicode=true&characterEncoding=UTF-8&useSSL=false&serverTimezone=UTC
       username: root
       password: root
       driver-class-name: com.mysql.cj.jdbc.Driver
    mybatis-plus:
     mapper-locations: classpath*:mapper/*.xml
     type-aliases-package: com.demo.entity
  5. 启动应用:通过 Spring Boot 启动应用,MyBatis-Plus 会自动扫描并注册 UserMapper 接口。
基本 CRUD 操作

创建数据库表

在数据库中创建一个表,例如 user 表:

CREATE TABLE `user` (
    `id` BIGINT NOT NULL AUTO_INCREMENT,
    `name` VARCHAR(50),
    `age` INT,
    `email` VARCHAR(50),
    `create_time` TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
    `update_time` TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
    PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

实体类的定义

定义一个 User 实体类,使用 MyBatis-Plus 的注解:

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

@TableName("user")
public class User {
    @TableId(type = IdType.AUTO)
    private Long id;
    private String name;
    private Integer age;
    private String email;
    private String createTime;
    private String updateTime;

    // Getter and Setter methods
}

Mapper 继承与自定义SQL

定义一个 UserMapper 接口,继承 BaseMapper

import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.demo.entity.User;

public interface UserMapper extends BaseMapper<User> {
}

可以自定义 SQL 查询,例如:

import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.demo.entity.User;

public interface UserMapper extends BaseMapper<User> {
    User selectUserById(Long id);
}

常见 CRUD 操作演示

插入数据

import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.demo.entity.User;
import com.demo.mapper.UserMapper;
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 insertUser() {
        User user = new User();
        user.setName("John");
        user.setAge(28);
        user.setEmail("[email protected]");
        userMapper.insert(user);
    }
}

查询数据

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

更新数据

public void updateUser(Long id) {
    User user = new User();
    user.setId(id);
    user.setName("Jane");
    user.setEmail("[email protected]");
    userMapper.updateById(user);
}

删除数据

public void deleteUser(Long id) {
    userMapper.deleteById(id);
}

示例运行代码

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.CommandLineRunner;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

@SpringBootApplication
public class DemoApplication implements CommandLineRunner {

    @Autowired
    private UserService userService;

    public static void main(String[] args) {
        SpringApplication.run(DemoApplication.class, args);
    }

    @Override
    public void run(String... args) throws Exception {
        userService.insertUser();
        User user = userService.selectUserById(1L);
        System.out.println(user);
        userService.updateUser(1L);
        userService.deleteUser(1L);
    }
}
功能增强

自动填充

MyBatis-Plus 提供了自动填充的功能,可以在插入或更新数据时自动填充一些字段。例如,可以自动填充创建时间和更新时间:

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

@TableName("user")
public class User {
    @TableId(type = IdType.AUTO)
    private Long id;
    private String name;
    private Integer age;
    private String email;
    @TableField(fill = FieldFill.INSERT)
    private String createTime;
    @TableField(fill = FieldFill.INSERT_UPDATE)
    private String updateTime;

    // Getter and Setter methods
}

逻辑删除

逻辑删除是指在删除记录时,不直接删除数据,而是将数据标记为已删除。MyBatis-Plus 提供了逻辑删除功能,可以使用 @TableLogic 注解:

import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableLogic;
import com.baomidou.mybatisplus.annotation.TableName;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.IdType;

@TableName("user")
public class User {
    @TableId(type = IdType.AUTO)
    private Long id;
    private String name;
    private Integer age;
    private String email;
    @TableField(fill = FieldFill.INSERT)
    private String createTime;
    @TableField(fill = FieldFill.INSERT_UPDATE)
    private String updateTime;
    @TableLogic
    private Boolean deleted;

    // Getter and Setter methods
}

分页插件配置

MyBatis-Plus 提供了分页插件,可以在查询时实现分页功能。首先需要在配置文件中配置分页插件:

mybatis-plus:
  page:
    size: 10

然后在代码中使用分页查询:

import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.demo.entity.User;
import com.demo.mapper.UserMapper;

public List<User> selectUsersPage(int currentPage, int pageSize) {
    Page<User> page = new Page<>(currentPage, pageSize);
    QueryWrapper<User> queryWrapper = new QueryWrapper<>();
    queryWrapper.select("id", "name", "age", "email").orderByAsc("id");
    Page<User> result = userMapper.selectPage(page, queryWrapper);
    return result.getRecords();
}

条件构造器

条件构造器 QueryWrapper 提供了强大的条件构建能力,可以灵活地构建复杂的查询条件:

import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.demo.entity.User;
import com.demo.mapper.UserMapper;

public List<User> selectUsersByNameAge(String name, Integer age) {
    QueryWrapper<User> queryWrapper = new QueryWrapper<>();
    queryWrapper.eq("name", name).gt("age", age);
    return userMapper.selectList(queryWrapper);
}
关联查询

单表查询

单表查询可以通过 Mapper 接口直接实现,例如:

import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.demo.entity.User;

public interface UserMapper extends BaseMapper<User> {
    List<User> selectUsersByName(String name);
}

多表关联查询

多表关联查询可以通过 @TableName 注解和 @TableField 注解实现,例如:

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

@TableName("user")
public class User {
    @TableId(type = IdType.AUTO)
    private Long id;
    private String name;
    private Integer age;
    private String email;
    @TableField(fill = FieldFill.INSERT)
    private String createTime;
    @TableField(fill = FieldFill.INSERT_UPDATE)
    private String updateTime;
    @TableField(select = false)
    private String password;

    // Getter and Setter methods
}
``

在 `UserMapper` 中定义关联查询:

```java
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.demo.entity.User;

public interface UserMapper extends BaseMapper<User> {
    List<User> selectUsersWithPassword();
}

联合查询与分页

联合查询可以使用 QueryWrapperPage 结合实现:

import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.demo.entity.User;
import com.demo.mapper.UserMapper;

public List<User> selectUsersWithPasswordPage(int currentPage, int pageSize) {
    Page<User> page = new Page<>(currentPage, pageSize);
    QueryWrapper<User> queryWrapper = new QueryWrapper<>();
    queryWrapper.select("id", "name", "age", "email")
               .orderByAsc("id")
               .apply("password IS NOT NULL");
    Page<User> result = userMapper.selectPage(page, queryWrapper);
    return result.getRecords();
}
测试与调试

单元测试

可以通过 JUnit 进行单元测试,例如:

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

import static org.junit.jupiter.api.Assertions.assertEquals;

@SpringBootTest
public class UserServiceTest {

    @Autowired
    private UserService userService;

    @Test
    public void testInsertUser() {
        User user = new User();
        user.setName("John");
        user.setAge(28);
        user.setEmail("[email protected]");
        userService.insertUser(user);
        User result = userService.selectUserById(user.getId());
        assertEquals("John", result.getName());
    }
}

异常处理

MyBatis-Plus 提供了异常处理机制,可以通过自定义异常处理器实现:

import com.baomidou.mybatisplus.extension.handlers.AbstractRowBoundsHandler;
import org.springframework.stereotype.Component;

@Component
public class MyExceptionHandler extends AbstractRowBoundsHandler {
    @Override
    protected void handleException(Exception e) {
        // 自定义异常处理逻辑
        System.err.println("异常处理:" + e.getMessage());
    }
}

日志配置

配置日志框架,例如使用 Logback:

logging:
  level:
  root: info
  mybatisPlus: debug

通过以上配置,可以更好地调试和观察 MyBatis-Plus 的运行情况。

总结

MyBatis-Plus 是一个强大的 MyBatis 增强工具,提供了丰富的功能增强特性,极大地提升了开发效率。通过本指南,你可以了解到 MyBatis-Plus 的核心特点、环境搭建、基本 CRUD 操作以及一些高级功能的使用。希望本指南能够帮助你在项目中更好地使用 MyBatis-Plus。如果你需要更深入的学习,可以参考官网文档或参加慕课网的相关课程。

點擊查看更多內容
TA 點贊

若覺得本文不錯,就分享一下吧!

評論

作者其他優質文章

正在加載中
  • 推薦
  • 評論
  • 收藏
  • 共同學習,寫下你的評論
感謝您的支持,我會繼續努力的~
掃碼打賞,你說多少就多少
贊賞金額會直接到老師賬戶
支付方式
打開微信掃一掃,即可進行掃碼打賞哦
今天注冊有機會得

100積分直接送

付費專欄免費學

大額優惠券免費領

立即參與 放棄機會
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號

舉報

0/150
提交
取消