MyBatis-Plus 入门与进阶教程

本教程将带领你快速上手 MyBatis-Plus,涵盖其基本功能、常用注解以及插件的使用。我们将通过代码实例一步步展示如何在实际项目中应用 MyBatis-Plus。

1. 快速开始

1.1 添加依赖

pom.xml 中添加以下依赖:

<dependency>
    <groupId>com.baomidou</groupId>
    <artifactId>mybatis-plus-boot-starter</artifactId>
    <version>3.5.7</version>
</dependency>
<dependency>
    <groupId>org.projectlombok</groupId>
    <artifactId>lombok</artifactId>
    <optional>true</optional>
</dependency>
<dependency>
    <groupId>mysql</groupId>
    <artifactId>mysql-connector-java</artifactId>
    <scope>runtime</scope>
</dependency>

1.2 配置数据源

application.yml 中配置 MySQL 数据源信息,并启用 MyBatis 日志打印:

spring:
  datasource:
    driver-class-name: com.mysql.cj.jdbc.Driver
    url: jdbc:mysql://localhost:3306/mybatis?characterEncoding=utf-8&useSSL=false&serverTimezone=UTC
    username: root
    password: 111111

mybatis-plus:
  configuration:
    log-impl: org.apache.ibatis.logging.stdout.StdOutImpl

1.3 创建启动类

在启动类中添加 @MapperScan 注解,指定 Mapper 接口所在包:

@SpringBootApplication
@MapperScan("com.java.mybatisplus.mapper")
public class MybatisPlusApplication {
    public static void main(String[] args) {
        SpringApplication.run(MybatisPlusApplication.class, args);
    }
}

1.4 定义实体类与 Mapper 接口

创建 User 实体类与 UserMapper 接口:

package com.java.mybatisplus.dao;

import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;

@Data
@NoArgsConstructor
@AllArgsConstructor
public class User {
    private Long id;
    private String name;
    private Integer age;
    private String email;
}
package com.java.mybatisplus.mapper;

import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.java.mybatisplus.dao.User;

public interface UserMapper extends BaseMapper<User> {
}

1.5 编写测试代码

通过 JUnit 测试 UserMapper 的基本查询功能:

package com.java.mybatisplus;

import com.java.mybatisplus.mapper.UserMapper;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;

@SpringBootTest
class MybatisPlusApplicationTests {

    @Autowired
    private UserMapper userMapper;

    @Test
    public void testSelect() {
        userMapper.selectList(null).forEach(System.out::println);
    }
}

2. 基本增删改查

MyBatis-Plus 提供了强大的 BaseMapper 接口,用于实现 CRUD 操作。我们可以直接在 UserMapper 中继承 BaseMapper<User> 来获得这些基本功能。

2.1 插入数据

@Test
public void testInsert() {
    User user = new User(null, "张三", 32, "zhangsan@atguigu.com");
    int res = userMapper.insert(user);
    System.out.println(res);
    System.out.println(user.getId()); // 自动生成的 ID
}

2.2 删除数据

通过 ID 删除:

@Test
public void testDeleteById(){
    int result = userMapper.deleteById(1826148003704561665L);
    System.out.println(result);
}

通过批量 ID 删除:

@Test
public void testDeleteByIds(){
    List<Integer> idList = Arrays.asList(1, 2, 3);
    int result = userMapper.deleteBatchIds(idList);
    System.out.println(result);
}

2.3 更新数据

@Test
public void testUpdateById(){
    User user = new User(1826149526211735553L,"李四",32,"zhangsan@atguigu.com");
    int result = userMapper.updateById(user);
    System.out.println(result);
}

2.4 查询数据

通过 ID 查询:

@Test
public void testSelectById(){
    User user = userMapper.selectById(1826149526211735553L);
    System.out.println(user);
}

通过条件查询:

@Test
public void testSelectList(){
    List<User> users = userMapper.selectList(null);
    users.forEach(System.out::println);
}

3. 常用注解

MyBatis-Plus 提供了一系列注解来简化数据库表与实体类之间的映射。

3.1 @TableName

当数据库表名与实体类名不一致时,可以使用 @TableName 注解指定表名:

@Data
@NoArgsConstructor
@AllArgsConstructor
@TableName("t_user")
public class User {
    private Long id;
    private String name;
    private Integer age;
    private String email;
}

3.2 @TableId

当数据库表的主键字段名与实体类中的字段名不一致时,可以使用 @TableId 注解指定主键:

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

3.3 @TableField

当数据库字段与实体类属性名不一致时,可以使用 @TableField 注解:

@TableField("username")
private String name;

3.4 @TableLogic

使用 @TableLogic 注解实现逻辑删除功能:

@TableLogic(value = "0", delval = "1")
private Integer isDeleted;

4. 条件构造器

MyBatis-Plus 提供了强大的条件构造器(Wrapper)用于构建复杂的查询条件。

4.1 QueryWrapper

QueryWrapper 用于构建查询条件:

QueryWrapper<User> queryWrapper = new QueryWrapper<>();
queryWrapper.like("username", "张")
            .between("age", 20, 30)
            .isNotNull("email");
List<User> users = userMapper.selectList(queryWrapper);

4.2 UpdateWrapper

UpdateWrapper 用于构建更新条件:

UpdateWrapper<User> userUpdateWrapper = new UpdateWrapper<>();
userUpdateWrapper.set("age", 19)
                 .set("email", "test@atguigu.com")
                 .like("username", "张三")
                 .and(i -> i.gt("age", 20).or().isNull("email"));
int result = userMapper.update(null, userUpdateWrapper);
System.out.println(result);

4.3 LambdaQueryWrapper 和 LambdaUpdateWrapper

LambdaQueryWrapperLambdaUpdateWrapper 可以使用 Lambda 表达式来避免硬编码字段名:

@Test
public void testLambdaQueryWrapper() {
    LambdaQueryWrapper<User> lambdaQueryWrapper = new LambdaQueryWrapper<>();
    lambdaQueryWrapper.like(User::getName, "张")
            .orderByDesc(User::getAge);
    List<User> users = userMapper.selectList(lambdaQueryWrapper);
    users.forEach(System.out::println);
}
@Test
public void testLambdaUpdateWrapper() {
    LambdaUpdateWrapper<User> lambdaUpdateWrapper = new LambdaUpdateWrapper<>();
    lambdaUpdateWrapper.set(User::getAge, 30)
            .eq(User::getName, "张三");
    userMapper.update(null, lambdaUpdateWrapper);
}

5. 插件

MyBatis-Plus 提供了分页插件等功能,通过简单配置即可使用。

5.1 分页插件

在配置类中添加分页插件:

package com.java.mybatisplus.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;

@Configuration
@MapperScan("com.java.mybatisplus.mapper")
public class MybatisPlusConfig {

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

5.2 分页查询

使用分页插件进行分页查询:

@Test
public void testSelectPage(){
    IPage<User> page = new Page<>(1, 2);
    QueryWrapper<User> queryWrapper = new QueryWrapper<>();
    queryWrapper.gt("age", 20);
    IPage<User> userPage = userMapper.selectPage(page, queryWrapper);
    List<User> userList = userPage.getRecords();
    long total = userPage.getTotal();
    System.out.println("总数: " + total);
    userList.forEach(System.out::println);
}

6.代码生成器

方式一:代码运行

  1. 添加依赖
		<dependency>
            <groupId>com.baomidou</groupId>
            <artifactId>mybatis-plus-generator</artifactId>
            <version>3.5.7</version>
        </dependency>
        <!-- FreeMarker -->
        <dependency>
            <groupId>org.freemarker</groupId>
            <artifactId>freemarker</artifactId>
            <version>2.3.31</version> <!-- Use the version compatible with your mybatis-plus version -->
        </dependency>
  1. 执行代码
package com.java.mybatisplus.generator;

import com.baomidou.mybatisplus.generator.FastAutoGenerator;
import com.baomidou.mybatisplus.generator.config.OutputFile;
import com.baomidou.mybatisplus.generator.config.rules.DbColumnType;
import com.baomidou.mybatisplus.generator.engine.FreemarkerTemplateEngine;

import java.sql.Types;
import java.util.Collections;

/**
 * @author DNY
 * @create 2024-08-21 19:39
 */
public class CodeGenerator {
    public static void main(String[] args) {
        String url = "jdbc:mysql://localhost:3306/mybatis?characterEncoding=utf-8&useSSL=false&serverTimezone=UTC";
        String username = "root";
        String password = "111111";

        FastAutoGenerator.create(url, username, password)
                .globalConfig(builder -> {
                    builder.author("baomidou") // 设置作者
                            .enableSwagger() // 开启 swagger 模式
                            .outputDir("D:\\JavaCode\\java-project-test\\mybatis-plus\\src\\main\\java\\com\\java\\mybatisplus\\generator"); // 指定输出目录
                })
                .dataSourceConfig(builder ->
                        builder.typeConvertHandler((globalConfig, typeRegistry, metaInfo) -> {
                            int typeCode = metaInfo.getJdbcType().TYPE_CODE;
                            if (typeCode == Types.SMALLINT) {
                                // 自定义类型转换
                                return DbColumnType.INTEGER;
                            }
                            return typeRegistry.getColumnType(metaInfo);
                        })
                )
                .packageConfig(builder ->
                        builder.parent("com.java.mybatisplus") // 设置父包名
                                .moduleName("mybatis-plus") // 设置父包模块名
                                .pathInfo(Collections.singletonMap(OutputFile.xml, "D:\\JavaCode\\java-project-test\\mybatis-plus\\src\\main\\java\\com\\java\\mybatisplus\\generator")) // 设置mapperXml生成路径
                )
                .strategyConfig(builder ->
                        builder.addInclude("t_user") // 设置需要生成的表名
                                .addTablePrefix("c_") // 设置过滤表前缀
                )
                .templateEngine(new FreemarkerTemplateEngine()) // 使用Freemarker引擎模板,默认的是Velocity引擎模板
                .execute();
    }
}

方式二:MybatisX

在这里插入图片描述

结语

本教程涵盖了 MyBatis-Plus 的基本使用方法和一些常用的高级功能。通过这些知识,你可以在项目中更高效地进行数据库操作,并充分利用 MyBatis-Plus 的特性来简化开发工作。希望本教程能为你提供帮助,在实际项目中取得更好的成果。

  • 13
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

DZSpace

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值