MybatisPlus

  1. MyBatis 查询
  2. MybatisPlus 快速入门
  3. 常用注解
  4. 查询
  5. 增加
  6. 删除
  7. 修改
  8. 自定义SQL、多表关联
  9. MyBatisPlus 自动生成

MyBatis 查询

1、创建表与实体类之间的映射文件 xml。里面编写 SQL 语句

2、创建和映射文件对应的接口 Mapper。

3、通过 SqlSessionFactory 获取 SqlSession。

MybatisPlus 快速入门

1、pom.xml 中引入 MybatisPlus 依赖

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

2、创建实体类

package com.ai.mybatisplus.entity;

import lombok.Data;

import java.util.Date;

@Data
public class Student {
    private Integer id;
    private String name;
    private Double score;
    private Date birthday;
}

3、创建 Mapper 接口

package com.ai.mybatisplus.mapper;

import com.ai.mybatisplus.entity.Student;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;

public interface StudentMapper extends BaseMapper<Student> {
}

4、启动类需要添加 @MapperScan(“mapper所在的包”)

package com.ai.mybatisplus.mapper;

import com.ai.mybatisplus.entity.Student;
import org.junit.jupiter.api.Test;
import org.mybatis.spring.annotation.MapperScan;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;

import java.util.List;

@SpringBootTest
@MapperScan("com.ai.mybatisplus.mapper")
class StudentMapperTest {
    @Autowired
    private StudentMapper studentMapper;

    @Test
    void test() {
       studentMapper.selectList(null).forEach(System.out::println);
    }
}

5、配置

spring:
  datasource:
    url: jdbc:mysql://localhost:3306/mbtest?useUnicode=true&characterEncoding=utf-8
    driver-class-name: com.mysql.cj.jdbc.Driver
    username: root
    password: 1314
mybatis-plus:
  configuration:
    log-impl: org.apache.ibatis.logging.stdout.StdOutImpl

常用注解

@TableName

映射数据库的表名

@Data
@TableName(value = "student")
public class Student {
    private Integer id;
    private String name;
    private Double score;
    private Date birthday;
}

@TableId 主键映射

type 设置主键类型,主键的生成策略

AUTO(0),		数据库自增
NONE(1),		MP set 主键,雪花算法实现
INPUT(2),		需要开发者手动赋值
ASSIGN_ID(3),		MP 分配 ID:Long、Integer、String
ASSIGN_UUID(4);		分配一个 uuid:String

@TableField 其他字段映射

exist 表示是否为数据库字段,如果实体类中的成员变量在数据库中没有对应字段,则可以使用 exist,VO、DTO。

select 表示是否查询该字段

fill 表示是否自动化填充,将对象存入数据库时,由 MP 自动给某些字段赋值,例如订单 create_time, update_time。

  • 如果数据库字段名是 create_time,则在 JavaBean 中 变量名为 createTime,MP 会自动二者进行绑定。

1、给表添加创建、更新时间

package com.ai.mybatisplus.entity;

import com.baomidou.mybatisplus.annotation.*;
import lombok.Data;

import java.util.Date;

@Data
@TableName(value = "student")
public class Student {
    @TableId(type = IdType.AUTO)
    private Long id;
    @TableField(select = false)
    private String name;
    private Double score;
    private Date birthday;
    @TableField(fill = FieldFill.INSERT)
    private Date createTime;
    @TableField(fill = FieldFill.INSERT_UPDATE)
    private Date updateTime;
    @TableField(exist = false)
    private String gender;
}

2、创建自动填充的处理器

package com.ai.mybatisplus.handler;

import com.baomidou.mybatisplus.core.handlers.MetaObjectHandler;
import org.apache.ibatis.reflection.MetaObject;
import org.springframework.stereotype.Component;

import java.util.Date;

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

3、测试

@Test
void save() throws ParseException {
    Student student = new Student();
    student.setName("奥尼尔");
    student.setScore(99d);
    student.setBirthday(new SimpleDateFormat("yyyy-MM-dd").parse("2024-02-23"));
    studentMapper.insert(student);
}

@Test
void update() {
    Student student = studentMapper.selectById("1760860280444715012");
    student.setScore(80d);
    studentMapper.updateById(student);

@Version

标记乐观锁,通过 version 字段来保证数据的安全性,当修改数据时,会以 version 为条件,当条件成立才修改成功。

线程 1:update … set version = 2 where version = 1

线程 2:update … set version = 2 where version = 1

代码测试:

1、数据库表添加 version 字段,默认值为1

2、实体类添加 version 成员变量,并且添加 @Version

3、注册配置类

package com.ai.mybatisplus.config;

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

@Configuration
public class MybatisPlusConfig {
    @Bean
    public MybatisPlusInterceptor mybatisPlusInterceptor() {
        MybatisPlusInterceptor mybatisPlusInterceptor = new MybatisPlusInterceptor();
        mybatisPlusInterceptor.addInnerInterceptor(new OptimisticLockerInnerInterceptor());
        return mybatisPlusInterceptor;
    }
}

@EnumValue

通用枚举类注解,将数据库字段映射成实体类的枚举成员变量

package com.ai.mybatisplus;


import com.baomidou.mybatisplus.annotation.EnumValue;

public enum EnumStatus {
    WORK(1, "上班"),
    REST(0, "休息");

    @EnumValue
    private Integer code;
    private String msg;
    EnumStatus(Integer code, String msg) {
        this.code = code;
        this.msg = msg;
    }
}

在实体类添加字段

private EnumStatus status;

application.yml

mybatis-plus:
  configuration:
    log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
  type-enums-package: com.ai.mybatisplus.enums

@TableLogic

映射逻辑删除

1、数据表添加 deleted 字段

2、实体类添加注解

@TableLogic
private Integer deleted;

3、application.yml 添加配置

global-config:
  db-config:
    logic-delete-value: 1
    logic-not-delete-value: 0

查询

//        studentMapper.selectBatchIds(Arrays.asList(7, 8)).forEach(System.out::println);

        // Map 只能做等值判断,逻辑判断用 Wrapper
//        HashMap<String, Object> map = new HashMap<>();
//        map.put("id", 7);
//        studentMapper.selectByMap(map);

        QueryWrapper wrapper = new QueryWrapper();
        wrapper.eq("id", 3);
//        System.out.println(studentMapper.selectCount(wrapper));

        // 将查询的结果封装到Map中
//        studentMapper.selectMaps(wrapper).forEach(System.out::println);

        // 分页查询
//        Page<Student> page = new Page<>(1, 2);
//        Page<Student> result = studentMapper.selectPage(page, null);
//        System.out.println(result.getSize());
//        System.out.println(result.getTotal());
//        result.getRecords().forEach(System.out::println);

//        Page<Map<String, Object>> page = new Page<>(1, 2);
//        Page<Map<String, Object>> result = studentMapper.selectMapsPage(page, null);
//        result.getRecords().forEach(System.out::println);

        // 拿到主键
//        studentMapper.selectObjs(null).forEach(System.out::println);

        // 查询一条数据
        System.out.println(studentMapper.selectOne(wrapper));
  • 分页查询

1、添加分页拦截器

package com.ai.mybatisplus.config;

import com.baomidou.mybatisplus.extension.plugins.MybatisPlusInterceptor;
import com.baomidou.mybatisplus.extension.plugins.inner.OptimisticLockerInnerInterceptor;
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 mybatisPlusInterceptor = new MybatisPlusInterceptor();
        // 乐观锁
        mybatisPlusInterceptor.addInnerInterceptor(new OptimisticLockerInnerInterceptor());
        // 分页
        mybatisPlusInterceptor.addInnerInterceptor(new PaginationInnerInterceptor());
        return mybatisPlusInterceptor;
    }

}

2、测试

// 分页查询
Page<Student> page = new Page<>(1, 2);
Page<Student> result = studentMapper.selectPage(page, null);
System.out.println(result.getSize());
System.out.println(result.getTotal());
result.getRecords().forEach(System.out::println);

增加

Student student = new Student();
student.setName("奥尼尔");
student.setScore(99d);
student.setBirthday(new SimpleDateFormat("yyyy-MM-dd").parse("2024-02-23"));
studentMapper.insert(student);

删除

//        studentMapper.deleteById(4L);
        
//        HashMap<String, Object> map = new HashMap<>();
//        map.put("id", 4);
//        studentMapper.deleteByMap(map);

修改

//        Student student = studentMapper.selectById("4");
//        student.setName("麻子");
//        studentMapper.updateById(student);

        QueryWrapper<Student> wrapper = new QueryWrapper<>();
        wrapper.eq("score", 90);
        Student student = studentMapper.selectById(1);
        student.setScore(96d);
        studentMapper.update(student, wrapper);

自定义SQL、多表关联

productVo: 将两个表的信息整合到 vo 里,由于 vo 不能对应数据库的表,因此不能使用 @FieldValue() 等注解。

package com.ai.mybatisplus.entity;

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

@Data
public class ProductVo {
    private Integer category;
    private Integer count;
    private String description;
    private Long studentId;
    private String studentName;
}

studentMapper 添加自定义 SQL 语句,多表关联。

package com.ai.mybatisplus.mapper;

import com.ai.mybatisplus.entity.ProductVo;
import com.ai.mybatisplus.entity.Student;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import org.apache.ibatis.annotations.Select;

import java.util.List;

public interface StudentMapper extends BaseMapper<Student> {
    @Select("select p.*, name studentName from product p, student s where p.student_id = s.id and s.id = #{id}")
    List<ProductVo> productList(Integer id);
}

MyBatisPlus 自动生成

根据数据表自动生成实体类、Mapper、Service、ServiceImpl、Controller

1、pom.xml 导入MyBatis Plus Generator

<dependency>
    <groupId>com.baomidou</groupId>
    <artifactId>mybatis-plus-generator</artifactId>
    <version>3.3.1</version>
</dependency>
<dependency>
    <groupId>org.apache.velocity</groupId>
    <artifactId>velocity</artifactId>
    <version>1.7</version>
</dependency>

转载请注明来源,欢迎对文章中的引用来源进行考证,欢迎指出任何有错误或不够清晰的表达。可以在下面评论区评论,也可以邮件至 1216271933@qq.com

×

喜欢就点赞,疼爱就打赏