继续浏览精彩内容
慕课网APP
程序员的梦工厂
打开
继续
感谢您的支持,我会继续努力的
赞赏金额会直接到老师账户
将二维码发送给自己后长按识别
微信支付
支付宝支付

MyBatis-Plus入门:简洁教程指南

慕勒3428872
关注TA
已关注
手记 201
粉丝 13
获赞 51
概述

MyBatis-Plus是一个增强的MyBatis工具,它提供了丰富的内置功能,旨在简化开发并提升效率。MyBatis-Plus支持自动创建CRUD操作、逻辑删除、自动填充等特性,大大减少了开发工作量。本文将详细介绍MyBatis-Plus的环境搭建、核心注解与标签、CRUD操作以及高级功能。

MyBatis-Plus入门:简洁教程指南
MyBatis-Plus简介

MyBatis-Plus的基本概念

MyBatis-Plus是一个MyBatis的增强工具,它在MyBatis的基础上提供了大量的辅助功能,旨在简化开发、提升效率。MyBatis-Plus主要通过扩展MyBatis原生的API,提供了自动创建CRUD操作、自动填充字段、逻辑删除等特性,使得开发人员可以更加专注于业务逻辑的实现。

MyBatis-Plus的优势与特点

MyBatis-Plus具有以下优势与特点:

  1. 无侵入方式:MyBatis-Plus不修改任何MyBatis-3的原生语法和编写习惯,通过自定义标签的方式在配置文件中引入。
  2. CRUD自动生成:MyBatis-Plus提供了丰富的内置CRUD方法,简单的配置即可实现基本的增删改查操作,大大减少了开发工作量。
  3. 逻辑删除:MyBatis-Plus支持逻辑删除功能,可以将实体对象标记为删除状态而并不从数据库中真正删除,这在数据安全性方面具有重要意义。
  4. 自动填充:MyBatis-Plus支持字段的自动填充,如创建时间、更新时间等,无需手动编写映射逻辑。
  5. 条件构造器:MyBatis-Plus提供了强大的条件构造器,可以方便地构建复杂的查询条件。
  6. 分页插件:内置分页插件,支持多种分页方式,如Mybatis的PageHelper。

MyBatis-Plus在项目中的应用

在实际项目开发中,MyBatis-Plus的应用非常广泛。例如:

  • 在电商系统中,可以使用MyBatis-Plus实现商品信息的快速增删改查操作。
  • 在社交应用中,可以利用MyBatis-Plus来管理用户信息和社交互动数据。
  • 在企业管理系统中,可以借助MyBatis-Plus的逻辑删除和自动填充功能来维护数据的完整性和一致性。
MyBatis-Plus环境搭建

开发环境准备

开发环境中需要准备以下内容:

  • IDE:如IntelliJ IDEA或Eclipse。
  • Java SDK:版本建议不低于Java 8。
  • Maven:用于构建和管理项目依赖。
  • MySQL:用于数据库操作,确保MySQL服务器已经安装并运行。

引入MyBatis-Plus依赖

在项目的pom.xml文件中添加MyBatis-Plus的相关依赖。例如:

<dependencies>
    <!-- MyBatis-Plus依赖 -->
    <dependency>
        <groupId>com.baomidou</groupId>
        <artifactId>mybatis-plus-boot-starter</artifactId>
        <version>3.4.3</version>
    </dependency>
    <!-- MySQL驱动 -->
    <dependency>
        <groupId>mysql</groupId>
        <artifactId>mysql-connector-java</artifactId>
        <version>8.0.23</version>
    </dependency>
    <!-- Spring Boot Starter JDBC -->
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-jdbc</artifactId>
    </dependency>
</dependencies>

创建数据库表和配置文件

创建数据库表

创建一个简单的数据库表user,用于存储用户信息:

CREATE TABLE `user` (
    `id` BIGINT(20) NOT NULL AUTO_INCREMENT COMMENT '用户ID',
    `name` VARCHAR(30) NOT NULL COMMENT '用户姓名',
    `age` INT(11) DEFAULT NULL COMMENT '用户年龄',
    `email` VARCHAR(50) DEFAULT NULL COMMENT '用户邮箱',
    `create_time` DATETIME DEFAULT NULL COMMENT '创建时间',
    `update_time` DATETIME DEFAULT NULL COMMENT '更新时间',
    PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='用户表';

配置文件

application.yml文件中配置数据库连接信息:

spring:
  database:
    driver-class-name: com.mysql.cj.jdbc.Driver
    url: jdbc:mysql://localhost:3306/mydb?useSSL=false&useUnicode=true&characterEncoding=UTF-8&serverTimezone=UTC
    username: root
    password: root
mybatis-plus:
    mapper-locations: classpath*:mapper/*.xml
    type-aliases-package: com.example.demo.entity
MyBatis-Plus核心注解与标签

常用注解介绍

MyBatis-Plus提供了一些注解,用于简化映射关系和业务逻辑:

  1. @TableField:用于指定字段与数据库字段的映射关系。
  2. @TableId:用于指定主键字段。
  3. @TableLogic:用于逻辑删除字段。

示例代码

以下是User实体类的示例:

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

@TableName("user")
public class User {
    @TableId
    private Long id;
    @TableField
    private String name;
    @TableField
    private Integer age;
    @TableField
    private String email;
    @TableField
    private Date createTime;
    @TableField
    private Date updateTime;
    @TableLogic
    private Integer deleted;
}

常用标签介绍

MyBatis-Plus还提供了许多自定义标签,用于增强MyBatis的SQL映射能力:

  1. <if>:条件判断标签。
  2. <choose>:多条件选择标签。
  3. <set>:用于生成SQL的SET子句。
  4. <trim>:用于处理SQL语句中的前缀和后缀。

示例代码

以下是一个示例的Mapper XML文件:

<update id="updateUser">
    UPDATE user
    <set>
        <if test="name != null">name = #{name},</if>
        <if test="age != null">age = #{age},</if>
        <if test="email != null">email = #{email},</if>
    </set>
    WHERE id = #{id}
</update>

注解和标签的使用示例

注解示例

UserMapper接口中使用注解来定义CRUD方法:

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

public interface UserMapper extends BaseMapper<User> {
}

标签示例

在Mapper XML文件中使用自定义标签来实现动态SQL:

<update id="updateUser">
    UPDATE user
    <set>
        <if test="name != null">name = #{name},</if>
        <if test="age != null">age = #{age},</if>
        <if test="email != null">email = #{email},</if>
    </set>
    WHERE id = #{id}
</update>
MyBatis-Plus CRUD操作

基本的CRUD操作

MyBatis-Plus提供了基本的增删改查方法,可以通过继承BaseMapper接口来实现。

示例代码

import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import org.springframework.stereotype.Repository;

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

实现CRUD方法

import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

@Service
public class UserService {

    @Autowired
    private UserMapper userMapper;

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

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

    public void updateUser(User user) {
        userMapper.updateById(user);
    }

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

    public List<User> getAllUsers() {
        return userMapper.selectList(new QueryWrapper<>());
    }
}

分页查询

MyBatis-Plus提供了强大的分页功能,可以通过Page对象来实现分页查询。

示例代码

import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

@Service
public class UserService {

    @Autowired
    private UserMapper userMapper;

    public IPage<User> getUsersByPage(int current, int size) {
        return userMapper.selectPage(new Page<>(current, size), new QueryWrapper<>());
    }
}

条件构造器使用

MyBatis-Plus提供了QueryWrapperMpQueryWrapper等类,用于构建复杂的查询条件。

示例代码

import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

@Service
public class UserService {

    @Autowired
    private UserMapper userMapper;

    public List<User> getUsersByAge(int age) {
        QueryWrapper<User> queryWrapper = new QueryWrapper<>();
        queryWrapper.eq("age", age);
        return userMapper.selectList(queryWrapper);
    }
}
MyBatis-Plus的高级功能

自动填充功能

MyBatis-Plus支持字段的自动填充功能,可以在插入和更新操作时自动填充某些字段。

示例代码

import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import com.baomidou.mybatisplus.annotation.FieldFill;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

@TableName("user")
public class User {
    @TableId
    private Long id;
    @TableField(fill = FieldFill.INSERT)
    private Date createTime;
    @TableField(fill = FieldFill.INSERT_UPDATE)
    private Date updateTime;
    @TableField(fill = FieldFill.INSERT)
    private Integer deleted;
}

@Service
public class UserService {

    @Autowired
    private UserMapper userMapper;

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

逻辑删除

MyBatis-Plus提供了逻辑删除功能,可以将实体对象标记为删除状态而并不从数据库中真正删除。

示例代码

import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Delete;
import org.apache.ibatis.annotations.Options;

@TableName("user")
public class User {
    @TableId
    private Long id;
    @TableField
    private String name;
    @TableField
    private Integer age;
    @TableField
    private String email;
    @TableField
    private Date createTime;
    @TableField
    private Date updateTime;
    @TableField
    private Integer deleted;
}

@Mapper
public interface UserMapper extends BaseMapper<User> {
    @Override
    @Options(useGeneratedKeys = true, keyProperty = "id")
    int insert(User entity);
}

@Service
public class UserService {

    @Autowired
    private UserMapper userMapper;

    public void deleteUser(Long id) {
        userMapper.delete(new QueryWrapper<User>().eq("id", id));
    }
}

树形数据操作

MyBatis-Plus提供了树形数据的操作支持,可以方便地处理层级关系。

示例代码

import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

@TableName("category")
public class Category {
    @TableId
    private Long id;
    @TableField
    private String name;
    @TableField
    private Long parentId;
    @TableField
    private Integer level;
}

@Mapper
public interface CategoryMapper extends BaseMapper<Category> {
}

@Service
public class CategoryService {

    @Autowired
    private CategoryMapper categoryMapper;

    public List<Category> getCategoryTree() {
        return categoryMapper.selectList(new QueryWrapper<Category>().eq("parentId", 0));
    }
}
MyBatis-Plus的异常处理与日志

异常处理机制

MyBatis-Plus提供了异常处理机制,可以捕获和处理MyBatis的异常。

示例代码

import org.apache.ibatis.exceptions.PersistenceException;
import org.springframework.stereotype.Service;

@Service
public class UserService {

    @Autowired
    private UserMapper userMapper;

    public void addUser(User user) {
        try {
            userMapper.insert(user);
        } catch (PersistenceException e) {
            // Handle the exception
            System.out.println("Database error occurred: " + e.getMessage());
        }
    }
}

日志记录与配置

MyBatis-Plus支持日志记录,可以通过配置来启用日志输出。

示例代码

application.yml文件中配置日志输出:

logging:
    level:
        com.baomidou.mybatisplus: DEBUG

常见问题与解决方法

问题1:查询结果为空

确保查询条件正确,检查数据库表中的数据是否符合查询条件:

QueryWrapper<User> queryWrapper = new QueryWrapper<>();
queryWrapper.eq("name", "John");
List<User> users = userMapper.selectList(queryWrapper);

问题2:数据插入失败

检查表结构和字段映射是否正确:

User user = new User();
user.setName("John");
user.setAge(25);
userMapper.insert(user);

问题3:分页查询不正确

确保Page对象的参数正确:

IPage<User> page = userMapper.selectPage(new Page<>(1, 10), new QueryWrapper<>());
打开App,阅读手记
0人推荐
发表评论
随时随地看视频慕课网APP