Mybatis Plus 常规用法及其示例


和Mybatis的区别

特性/框架MyBatisMyBatis-Plus
SQL编写方式需要手写大量的SQL内置通用Mapper、通用Service,少量配置实现CRUD
动态SQL支持提供XML标签,支持动态SQL语句,可重用-(继承MyBatis特性,但更侧重于简化操作)
ORM映射提供映射标签,支持对象与数据库的ORM字段关系映射-(继承MyBatis特性)
Lambda表达式支持不支持支持Lambda表达式,方便编写查询条件
主键生成策略需要手动配置支持主键自动生成,提供多种策略,包括分布式ID
代码生成无内置功能提供代码生成器,快速生成Mapper、Model、Service、Controller代码
分页功能需要手动实现内置分页插件,配置后分页查询如同普通List查询
性能分析无内置功能内置性能分析插件,输出SQL及执行时间
全局拦截支持自定义拦截器,但无内置智能分析内置全局拦截插件,智能分析阻断全表delete、update,可自定义拦截规则

导包

在使用maven进行导入包,会有很多Mybatis-plus的内容,以下是常用的解释

依赖项名称描述用途
mybatis-plus-boot-starterMyBatis-Plus为Spring Boot提供的启动器依赖包含MyBatis-Plus核心功能及Spring Boot集成配置,方便在Spring Boot项目中快速集成MyBatis-Plus
mybatis-plus-annotationMyBatis-Plus提供的注解依赖包含用于简化数据库操作和提高代码可读性的注解,如@TableName@TableId
mybatis-plus-coreMyBatis-Plus的核心模块提供MyBatis-Plus的基础功能和核心类,如条件构造器、分页插件等
mybatis-plus-generatorMyBatis-Plus的代码生成器依赖能够自动生成与数据库表对应的Java实体类、Mapper接口、Service接口和Controller类等代码,提高开发效率

说明:一般情况下,导入包时,主要以mybatis-plus-boot-starter为主。同时,不要忘记导入mysql等其他数据库的jar包

pom.xml

        <dependency>
            <groupId>com.baomidou</groupId>
            <artifactId>mybatis-plus-boot-starter</artifactId>
            <version>3.5.0</version>
        </dependency>
         <dependency>
            <groupId>com.mysql</groupId>
            <artifactId>mysql-connector-j</artifactId>
            <scope>runtime</scope>
        </dependency>

配置文件修改

application.yml

和原有的mybatis在使用上没有区别

spring:
  datasource:
    driver-class-name: com.mysql.cj.jdbc.Driver
    url: jdbc:mysql://localhost/tmp
    username: root
    password: root

启动类修改

需要增加@MapperScan标签对Mapper包路径进行扫描
在这里插入图片描述

package com.wunaiieq.tmp2024121103;

import org.apache.ibatis.annotations.Mapper;
import org.mybatis.spring.annotation.MapperScan;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

@SpringBootApplication
@MapperScan("com.wunaiieq.tmp2024121103.mapper")
public class Tmp2024121103Application {

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

}

如果存在不同的mapper路径,则使用如下方式

@MapperScans({
    @MapperScan("com.example.mapper1"),
    @MapperScan("com.example.mapper2")
})

Mapper层修改

相较于Mybatis,在plus中,所有的mapper都需要集成BaseMapper<实体类>

package com.wunaiieq.tmp2024121103.mapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.wunaiieq.tmp2024121103.entity.Students;
public interface StudentsMapper extends BaseMapper<Students> {
}

注解

@TableName(“表名”)

用法:写在实体类上,用于指定当前实体类为哪个表(表所属的数据库在 application.yml中配置)
示例

package com.wunaiieq.tmp2024121103.entity;
import com.baomidou.mybatisplus.annotation.TableName;
@TableName("students")
public class Students {
    private int id;
    private String name;

    public Students(int id, String name) {
        this.id = id;
        this.name = name;
    }

    @Override
    public String toString() {
        return "Students{" +
                "id=" + id +
                ", name='" + name + '\'' +
                '}';
    }

    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }
}

@TableId(“数据库中主键字段名”,“主键策略”)

描述:指定实体类的某个属性为主键

value:数据库中主键字段名
type:主键策略(如下)

IdType.AUTO:数据库ID自增。适用于自增主键,如MySQL的自增列。
IdType.NONE:无状态,该类型为未设置主键类型。需要手动赋值。
IdType.INPUT:用户输入ID。适用于手动输入主键值,在插入数据时如果不手动设置该字段的值,数据库会报错。
IdType.ASSIGN_ID:分配ID,适用于分布式系统。使用雪花算法生成唯一ID(Long类型)。
IdType.ASSIGN_UUID:分配UUID,适用于分布式系统。生成唯一ID(String类型)。

示例

package com.wunaiieq.tmp2024121103.entity;

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

@TableName("students")
public class Students {
    @TableId(value = "id",type = IdType.AUTO)
    private int id;
    private String name;

    public Students(int id, String name) {
        this.id = id;
        this.name = name;
    }
    public Students(String name) {
        this.name = name;
    }

    @Override
    public String toString() {
        return "Students{" +
                "id=" + id +
                ", name='" + name + '\'' +
                '}';
    }

    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }
}

@TableField(“数据库中字段名”)

描述:指定映射关系(当实体属性和数据库中字段名不同时)
示例

package com.wunaiieq.tmp2024121103.entity;

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

@TableName("students")
public class Students {
    @TableId(value = "id",type = IdType.AUTO)
    private int id;
    @TableField("name")
    private String name;

    public Students(int id, String name) {
        this.id = id;
        this.name = name;
    }
    public Students(String name) {
        this.name = name;
    }

    @Override
    public String toString() {
        return "Students{" +
                "id=" + id +
                ", name='" + name + '\'' +
                '}';
    }

    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }
}

内置方法

前置说明

T表示实体类,在以下方法中,会针对T进行相应的操作

条件构造器

条件参数

查询方式说明
or或条件语句
and且条件语句
like模糊查询(LIKE)
notLike模糊查询(NOT LIKE)
existsEXISTS 条件语句
notExistsNOT EXISTS 条件语句
isNullNULL 值查询
isNotNullIS NOT NULL 查询
inIN 查询
notInNOT IN 查询
groupBy分组查询
orderBy排序查询
having分组后筛选
eq等于(=)
ne不等于(<>)
betweenBETWEEN 条件语句
gt大于(>)
ge大于等于(>=)
lt小于(<)
le小于等于(<=)

示例
条件参数是链式调用的,可以同时使用多个参数,构建查询条件
在配置好查询条件后,将QueryWrapper对象传递给MybatisPlus中的方法即可

QueryWrapper<Students> queryWrapper = new QueryWrapper<>();
queryWrapper.lt("id",3).or().gt("id",2000);
List<Students> studentsList = studentsMapper.selectList(queryWrapper);

插入

int insert(T entity)

功能:插入一个实体记录到数据库中。
参数:entity 是要插入的实体对象。
返回值:插入成功的记录数,通常为 1。
示例

User user = new User();
user.setName("John Doe");
user.setAge(30);
int result = userMapper.insert(user);
// result 应该为 1,表示插入成功

删除

int deleteById(Serializable id)

功能:根据主键 ID 删除一条记录。
参数:id 是要删除记录的主键。
返回值:删除成功的记录数,通常为 1。
示例

int result = userMapper.deleteById(0001);
// result 应该为 1,表示删除成功

int deleteById(T entity)

功能:根据实体对象的主键删除一条记录。这个方法与 deleteById(Serializable id) 的功能相似,但它是通过实体对象来删除的。
参数:entity 是包含主键的实体对象。
返回值:删除成功的记录数。
示例

User user = new User();
user.setId(1L);
int result = userMapper.deleteById(user);
// result 应该为 1,表示删除成功

int deleteByMap(@Param(“cm”) Map<String, Object> columnMap)

功能:根据条件构造器(以 Map 形式)删除记录。
参数:columnMap 是一个包含列名和对应值的 Map,用于构造删除条件。
返回值:删除成功的记录数。
示例

Map<String, Object> map = new HashMap<>();
map.put("name", "John Doe");
int result = userMapper.deleteByMap(map);
// result 表示删除的记录数

int delete(@Param(“ew”) Wrapper queryWrapper)

功能:根据条件构造器删除记录。
参数:queryWrapper 是一个条件构造器,用于构造复杂的删除条件。
返回值:删除成功的记录数。
示例

QueryWrapper<User> queryWrapper = new QueryWrapper<>();
queryWrapper.eq("name", "John Doe");
int result = userMapper.delete(queryWrapper);
// result 表示删除的记录数

int deleteBatchIds(@Param(“coll”) Collection<?> idList)

功能:根据主键 ID 集合批量删除记录。
参数:idList 是一个包含多个主键 ID 的集合。
返回值:删除成功的记录数。
示例

List<Long> idList = Arrays.asList(001, 002, 003);
int result = userMapper.deleteBatchIds(idList);
// result 表示删除的记录数

更新/修改

int update(@Param(“et”) T entity, @Param(“ew”) Wrapper updateWrapper)

功能:根据条件构造器更新记录。
参数:entity 是包含更新数据的实体对象,updateWrapper 是条件构造器,用于构造更新条件。
返回值:更新成功的记录数。
示例

User user = new User();
user.setName("Jane Doe");
UpdateWrapper<User> updateWrapper = new UpdateWrapper<>();
updateWrapper.eq("age", 30);
int result = userMapper.update(user, updateWrapper);
// result 表示更新的记录数

查询

T selectById(Serializable id)

功能:根据主键 ID 查询一条记录。
参数:id 是要查询记录的主键。
返回值:查询到的实体对象,如果没有找到则返回 null。
示例

User user = userMapper.selectById(1L);
// user 是查询到的实体对象,或者为 null

List selectBatchIds(@Param(“coll”) Collection<? extends Serializable> idList)

功能:根据主键 ID 集合批量查询记录。
参数:idList 是一个包含多个主键 ID 的集合。
返回值:查询到的实体对象列表。
示例

List<Long> idList = Arrays.asList(1L, 2L, 3L);
List<User> users = userMapper.selectBatchIds(idList);
// users 是查询到的实体对象列表

List selectByMap(@Param(“cm”) Map<String, Object> columnMap)

功能:根据条件构造器(以 Map 形式)查询记录。
参数:columnMap 是一个包含列名和对应值的 Map,用于构造查询条件。
返回值:查询到的实体对象列表。
示例

Map<String, Object> map = new HashMap<>();
map.put("age", 30);
List<User> users = userMapper.selectByMap(map);
// users 是查询到的实体对象列表

default T selectOne(@Param(“ew”) Wrapper queryWrapper)

功能:根据条件构造器查询一条记录。如果查询结果有多条记录,则抛出异常。
参数:queryWrapper 是一个条件构造器,用于构造查询条件。
返回值:查询到的实体对象,如果没有找到则返回 null,如果找到多条记录则抛出异常。
示例

QueryWrapper<User> queryWrapper = new QueryWrapper<>();
queryWrapper.eq("name", "John Doe");
User user = userMapper.selectOne(queryWrapper);
// user 是查询到的实体对象,或者为 null,或者抛出异常

判断记录是否存在

default boolean exists(Wrapper queryWrapper)

功能:根据条件构造器判断记录是否存在。
参数:queryWrapper 是一个条件构造器,用于构造查询条件。
返回值:如果记录存在则返回 true,否则返回 false。
示例

QueryWrapper<User> queryWrapper = new QueryWrapper<>();
queryWrapper.eq("name", "John Doe");
boolean exists = userMapper.exists(queryWrapper);
// exists 为 truefalse

统计数量

Long selectCount(@Param(“ew”) Wrapper queryWrapper)

功能:根据条件构造器查询记录数。
参数:queryWrapper 是一个条件构造器,用于构造查询条件。
返回值:查询到的记录数。
示例

QueryWrapper<User> queryWrapper = new QueryWrapper<>();
queryWrapper.gt("age", 18);
Long count = userMapper.selectCount(queryWrapper);
// count 是查询到的记录数

模糊查询(返回实体对象列表)

List selectList(@Param(“ew”) Wrapper queryWrapper)

功能:根据条件构造器查询记录列表。
参数:queryWrapper 是一个条件构造器,用于构造查询条件。
返回值:查询到的实体对象列表。
示例

QueryWrapper<User> queryWrapper = new QueryWrapper<>();
queryWrapper.like("name", "John");
List<User> users = userMapper.selectList(queryWrapper);
// users 是查询到的实体对象列表

Map形式返回

List<Map<String, Object>> selectMaps(@Param(“ew”) Wrapper queryWrapper);

功能:根据条件构造器查询记录,并将结果以键值对(Map<String, Object>)的形式返回。每个Map代表数据库中的一行数据,键为列名,值为列数据。
参数:queryWrapper 是一个条件构造器,用于构造查询条件。
返回值:查询到的数据列表,列表中的每个元素都是一个包含列名和列值的Map。
示例

QueryWrapper<User> queryWrapper = new QueryWrapper<>();
queryWrapper.eq("age", 25);
List<Map<String, Object>> users = userMapper.selectMaps(queryWrapper);
// users 是查询到的数据列表,每个元素都是一个Map,Map中包含了用户的列名和对应的值

只返回查询列

List selectObjs(@Param(“ew”) Wrapper queryWrapper);

功能:根据条件构造器查询记录,但只返回每行的某个列(通常是查询的第一个列)的值列表。
参数:queryWrapper 是一个条件构造器,用于构造查询条件。
返回值:查询到的列值列表,列表中的每个元素都是Object类型。
示例

QueryWrapper<User> queryWrapper = new QueryWrapper<>();
queryWrapper.select("name"); // 只选择name列
List<Object> names = userMapper.selectObjs(queryWrapper);
// names 是查询到的name列的值列表

分页查询

<P extends IPage> P selectPage(P page, @Param(“ew”) Wrapper queryWrapper);

功能:根据条件构造器分页查询记录。
参数:page 是一个分页对象,包含了分页的信息(如当前页码、每页数量等)。queryWrapper 是一个条件构造器,用于构造查询条件。
返回值:返回的是传入的分页对象P,但此时该对象已经包含了查询结果和分页信息。
示例

Page<User> page = new Page<>(1, 10); // 查询第一页,每页10条数据
QueryWrapper<User> queryWrapper = new QueryWrapper<>();
queryWrapper.ge("age", 18); // 查询年龄大于等于18的用户
Page<User> userPage = userMapper.selectPage(page, queryWrapper);
// userPage 包含了查询结果和分页信息

分页查询,Map返回

<P extends IPage<Map<String, Object>>> P selectMapsPage(P page, @Param(“ew”) Wrapper queryWrapper);

功能:根据条件构造器分页查询记录,并将结果以键值对(Map<String, Object>)的形式返回。
参数:page 是一个分页对象,包含了分页的信息。queryWrapper 是一个条件构造器,用于构造查询条件。
返回值:返回的是传入的分页对象P,但此时该对象已经包含了查询结果(以Map形式)和分页信息。
示例

Page<Map<String, Object>> page = new Page<>(1, 5); // 查询第一页,每页5条数据
QueryWrapper<User> queryWrapper = new QueryWrapper<>();
queryWrapper.like("name", "John"); // 查询名字中包含John的用户
Page<Map<String, Object>> userPage = userMapper.selectMapsPage(page, queryWrapper);
// userPage 包含了查询结果(每个结果都是一个Map)和分页信息
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

无奈ieq

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

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

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

打赏作者

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

抵扣说明:

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

余额充值