mybatis-plus使用

目录

[1. 快速开始](#1. 快速开始)

[1. 创建user表](#1. 创建user表)

[2. 插入几条数据](#2. 插入几条数据)

[3. 创建一个新的springboot项目](#3. 创建一个新的springboot项目)

[4. 导入mybatis-plus依赖](#4. 导入mybatis-plus依赖)

[5. 在配置文件中进行配置](#5. 在配置文件中进行配置)

[6. 编写实体类](#6. 编写实体类)

[7. 编写Mapper 接口类](#7. 编写Mapper 接口类)

[8. 添加 @MapperScan 注解](#8. 添加 @MapperScan 注解)

[9. 测试](#9. 测试)

[​编辑2. CRUD](#编辑2. CRUD)

[1. 插入一条语句](#1. 插入一条语句)

[2. 根据主键id删除一条记录](#2. 根据主键id删除一条记录)

[3. 根据条件构造器wrapper进行删除](#3. 根据条件构造器wrapper进行删除)

[4. 根据主键id进行查找](#4. 根据主键id进行查找)

[5. 根据主键id进行批量查找](#5. 根据主键id进行批量查找)

[6. 根据map中指定的列名和列值进行等值匹配查找](#6. 根据map中指定的列名和列值进行等值匹配查找)

[7. 根据 wrapper 条件查询](#7. 根据 wrapper 条件查询)

[8. 根据主键id进行更新](#8. 根据主键id进行更新)

[9. 根据条件构造器wrapper进行更新](#9. 根据条件构造器wrapper进行更新)

[​编辑3. 分页](#编辑3. 分页)

[0. 配置分页插件](#0. 配置分页插件)

[1. 通过selectPage方法分页](#1. 通过selectPage方法分页)

[2. 通过selectMapsPage方法分页](#2. 通过selectMapsPage方法分页)

[4. 自增列的值(generated key)](#4. 自增列的值(generated key))

[5. 联接查询](#5. 联接查询)

[1. 创建一个新表(order表)并插入数据](#1. 创建一个新表(order表)并插入数据)

[2. 创建Order实体类](#2. 创建Order实体类)

[3. 联合查询](#3. 联合查询)

[4. 测试](#4. 测试)


1. 快速开始

1. 创建user表

sql 复制代码
DROP TABLE IF EXISTS `user`;
CREATE TABLE user (
    id INT AUTO_INCREMENT PRIMARY KEY,
    username VARCHAR(50) NOT NULL,
    password VARCHAR(50) NOT NULL
);

2. 插入几条数据

sql 复制代码
INSERT INTO user (username, password) VALUES ('alice', 'password123');
INSERT INTO user (username, password) VALUES ('bob', 'securepass');
INSERT INTO user (username, password) VALUES ('charlie', 'mypassword');

3. 创建一个新的springboot项目

4. 导入mybatis-plus依赖

XML 复制代码
        <!-- springboot3 导入以下依赖 -->
        <dependency>
            <groupId>com.baomidou</groupId>
            <artifactId>mybatis-plus-spring-boot3-starter</artifactId>
            <version>3.5.7</version>
        </dependency>

        <!-- springboot2 导入以下依赖 -->
        <dependency>
            <groupId>com.baomidou</groupId>
            <artifactId>mybatis-plus-boot-starter</artifactId>
            <version>3.5.7</version>
        </dependency>

导入mysql依赖

XML 复制代码
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>8.0.33</version>
        </dependency>

导入lombok依赖

XML 复制代码
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <optional>true</optional>
        </dependency>

5. 在配置文件中进行配置

application.properties

XML 复制代码
# 数据库配置
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
spring.datasource.url=jdbc:mysql://localhost:3306/数据库名?serverTimezone=GMT%2B8
spring.datasource.username=账号
spring.datasource.password=密码

# MyBatis-Plus 配置
# 指定MyBatis-Plus使用StdOutImpl作为日志实现,这意味着SQL日志将输出到标准输出(通常是控制台)。
mybatis-plus.configuration.log-impl=org.apache.ibatis.logging.stdout.StdOutImpl

或 application.yml

XML 复制代码
# 数据库配置
spring:
  datasource:
    driver-class-name: com.mysql.cj.jdbc.Driver
    url: jdbc:mysql://localhost:3306/数据库名?serverTimezone=GMT%2B8
    username: 账号
    password: 密码

# MyBatis-Plus 配置
mybatis-plus:
  configuration:
    log-impl: org.apache.ibatis.logging.stdout.StdOutImpl

6. 编写实体类

java 复制代码
@Data
@NoArgsConstructor
@AllArgsConstructor
@ToString
public class User {
    private Integer id;
    private String username;
    private String password;
}

7. 编写Mapper 接口类

java 复制代码
public interface UserMapper extends BaseMapper<User> {
}

8. 添加 @MapperScan 注解

在 Spring Boot 启动类中添加 @MapperScan 注解,扫描 Mapper 文件夹

java 复制代码
@SpringBootApplication
@MapperScan("com.huan.mybatis_plus_learn.mappers")//Mapper所在的类路径
public class MybatisPlusLearnApplication {
    public static void main(String[] args) {
        SpringApplication.run(MybatisPlusLearnApplication.class, args);
    }

}

9. 测试

java 复制代码
@SpringBootTest
class MybatisPlusLearnApplicationTests {
    @Autowired
    private UserMapper userMapper;
    @Test
    public void testSelect() {
        System.out.println(("----- selectAll method test ------"));
        List<User> userList = userMapper.selectList(null);
        Assert.isTrue(3 == userList.size(), "");
        for (User user : userList){
            System.out.println(user);
        }
    }
}

控制台输出:

  1. CRUD

以下的方法都是BaseMapper接口中默认有的,直接使用即可。

1. 插入一条语句

直接使用BaseMapper接口中的insert(T entity)方法。

java 复制代码
    @Test
    public void testInsert(){
        User user = new User();
        user.setUsername("huan");
        user.setPassword("123456");
        int insert = userMapper.insert(user);
        System.out.println(insert);
    }

但测试发现,插入的字段的id为负数。

要使id字段正常自增,需要给实体类的id字段添加@TableId(value = "id", type = IdType.AUTO)注释,用于标识数据库表的主键字段,IdType.AUTO 表示主键值由数据库自动生成,通常用于自增主键。

java 复制代码
@Data
@NoArgsConstructor
@AllArgsConstructor
@TableName
@ToString
public class User {
    //添加注释
    @TableId(value = "id", type = IdType.AUTO)
    private Integer id;
    private String username;
    private String password;
}

2. 根据主键id删除一条记录

java 复制代码
    @Test
    public void testDeleteById(){
        int delete = userMapper.deleteById(1);
        System.out.println(delete);
    }

控制台输出。

数据库内容。

3. 根据条件构造器wrapper进行删除

java 复制代码
    @Test
    public void testDelete(){
        // 创建条件构造器
        QueryWrapper<User> queryWrapper = new QueryWrapper<>();
        // 添加条件:用户名为 "huan"
        queryWrapper.eq("username", "huan");
        // 执行删除操作
        int deleteCount = userMapper.delete(queryWrapper);
        System.out.println("删除了 " + deleteCount + " 条记录");
    }

控制台输出。

4. 根据主键id进行查找

java 复制代码
    @Test
    public void testSelectById(){
        User user = userMapper.selectById(2);
        System.out.println(user);
        Assert.notNull(user, "User must not be null");
    }

控制台输出。

5. 根据主键id进行批量查找

java 复制代码
    @Test
    public void testSelectBatchIds(){
        List<User> users = userMapper.selectBatchIds(List.of(5, 2, 3));
        users.forEach(user -> System.out.println(user));
    }

控制台输出。

6. 根据map中指定的列名和列值进行等值匹配查找

java 复制代码
    @Test
    public void testSelectByMap(){
        List<User> users = userMapper.selectByMap(
                Map.of("username", "huan", "password", "123456"));
        users.forEach(user -> System.out.println(user));
    }

控制台输出。

7. 根据 wrapper 条件查询

java 复制代码
    @Test
    public void testSelectList(){
        QueryWrapper<User> queryWrapper = new QueryWrapper<>();
        //指定查询字段为id,username
        queryWrapper.select("id", "username");
        List<User> users = userMapper.selectList(queryWrapper);
        users.forEach(user -> System.out.println(user));
    }

控制台输出。

8. 根据主键id进行更新

java 复制代码
    @Test
    public void testUpdateById(){
        User user = new User();
        user.setId(5);
        user.setUsername("huan");
        user.setPassword("huan");
        int update = userMapper.updateById(user);
        User user1 = userMapper.selectById(5);
        System.out.println(user1);
    }

控制台输出。

9. 根据条件构造器wrapper进行更新

java 复制代码
    @Test
    public void testUpdate(){
        QueryWrapper<User> queryWrapper = new QueryWrapper<>();
        // 指定查询条件 username="huan"
        queryWrapper.eq("username", "huan");
        queryWrapper.select("id", "username");
        User user = new User();
        user.setUsername("huan1");
        userMapper.update(user, queryWrapper);
        //这里查询不到,因为huan改为了huan1
        userMapper.selectList(queryWrapper).forEach(u -> System.out.println(user));
    }

控制台输出。

  1. 分页

0. 配置分页插件

java 复制代码
@Configuration
@ComponentScan
public class MybatisPlusConfig {
    /**
     * 添加分页插件
     */
    @Bean
    public MybatisPlusInterceptor mybatisPlusInterceptor() {
        MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();
        interceptor.addInnerInterceptor(new PaginationInnerInterceptor(DbType.MYSQL)); // 如果配置多个插件, 切记分页最后添加
        // 如果有多数据源可以不配具体类型, 否则都建议配上具体的 DbType
        return interceptor;
    }
}

1. 通过selectPage方法分页

java 复制代码
    @Test
    public void testSelectPage(){
        // 创建分页对象 当前页,每页数据数
        Page<User> page = new Page<>(2,2);
        // 执行分页查询
        IPage<User> userPage = userMapper.selectPage(page, null);
        // 获取查询结果
        List<User> users = userPage.getRecords();
        long total = userPage.getTotal();
        long pages = userPage.getPages();
        // 输出查询结果
        System.out.println("总记录数:" + total);
        System.out.println("总页数:" + pages);
        users.forEach(user -> System.out.println(user));
    }

控制台输出。

2. 通过selectMapsPage方法分页

该方法与selectPage的区别在于,selectMapsPage方法会将查询结果封装为一个Map<String,Object>。

java 复制代码
    @Test
    public void testSelectMapsPage(){
        // 创建分页对象
        Page<Map<String, Object>> page = new Page<>(2, 2);
        // 执行分页查询
        IPage<Map<String, Object>> userPage = userMapper.selectMapsPage(page, null);
        // 获取查询结果
        List<Map<String, Object>> users = userPage.getRecords();
        long total = userPage.getTotal();
        long pages = userPage.getPages();
        // 输出查询结果
        System.out.println("总记录数:" + total);
        System.out.println("总页数:" + pages);
        users.forEach(user -> System.out.println(user));
    }

控制台输出。

4. 自增列的值(generated key)

在 MyBatis-Plus 中,insert 方法可以直接获取自增列的值(generated key)。当你在实体类中使用 @TableId 注解并设置 typeIdType.AUTO 时,MyBatis-Plus 会自动处理自增主键的生成和赋值。

也就是说,MyBatis-Plus 会自动将主键的值赋值给实体类的对应字段,我们可以通过get方法直接取到主键的值。

java 复制代码
    @Test
    public void testInsert(){
        User user = new User();
        user.setUsername("huan");
        user.setPassword("123456");
        int insert = userMapper.insert(user);
        System.out.println("插入后的用户ID:" + user.getId());
    }

控制台输出。

5. 联接查询

1. 创建一个新表(order表)并插入数据

sql 复制代码
CREATE TABLE `order` (
    id BIGINT AUTO_INCREMENT PRIMARY KEY,
    user_id BIGINT NOT NULL,
    goods_name VARCHAR(255) NOT NULL,
    goods_price DECIMAL(10, 2) NOT NULL
);
INSERT INTO `order` (user_id, goods_name, goods_price) VALUES (2, 'Laptop', 999.99);
INSERT INTO `order` (user_id, goods_name, goods_price) VALUES (2, 'Smartphone', 499.99);
INSERT INTO `order` (user_id, goods_name, goods_price) VALUES (3, 'Headphones', 199.99);
INSERT INTO `order` (user_id, goods_name, goods_price) VALUES (5, 'Monitor', 299.99);
INSERT INTO `order` (user_id, goods_name, goods_price) VALUES (2, 'Keyboard', 49.99);

2. 创建Order实体类

java 复制代码
@Data
@AllArgsConstructor
@NoArgsConstructor
@ToString
public class Order {
    @TableId(value = "id", type = IdType.AUTO)
    private Integer id;
    private Integer userId;
    private String goodsName;
    private Double goodsPrice;
}

3. 联合查询

在Mapper中添加联合查询的方法,通过自定义 SQL 语句和@Select注解来实现。

java 复制代码
public interface UserMapper extends BaseMapper<User> {
    //联合查询
    //查询user表和order表中user表中id和order表中id相等的数据
    //u.* 表示user表的所有字段
    @Select("SELECT u.*, o.goods_name, o.goods_price FROM user u INNER JOIN `order` o ON u.id = o.user_id WHERE u.id = #{userId}")
    List<Map<String, Object>> selectUserWithOrders(@Param("userId") Integer userId);
}

4. 测试

java 复制代码
    @Test
    public void testSelectUserWithOrders(){
        List<Map<String, Object>> userWithOrders = userMapper.selectUserWithOrders(2);
        userWithOrders.forEach(user -> System.out.println(user));
    }

控制台输出。

干饭去....

参考链接:

  1. mybatis-plus官网

  2. https://juejin.cn/post/6961721367846715428

相关推荐
苹果醋31 小时前
React源码02 - 基础知识 React API 一览
java·运维·spring boot·mysql·nginx
Hello.Reader1 小时前
深入解析 Apache APISIX
java·apache
了一li1 小时前
Qt中的QProcess与Boost.Interprocess:实现多进程编程
服务器·数据库·qt
菠萝蚊鸭2 小时前
Dhatim FastExcel 读写 Excel 文件
java·excel·fastexcel
码农君莫笑2 小时前
信管通低代码信息管理系统应用平台
linux·数据库·windows·低代码·c#·.net·visual studio
旭东怪2 小时前
EasyPoi 使用$fe:模板语法生成Word动态行
java·前端·word
007php0072 小时前
Go语言zero项目部署后启动失败问题分析与解决
java·服务器·网络·python·golang·php·ai编程
∝请叫*我简单先生2 小时前
java如何使用poi-tl在word模板里渲染多张图片
java·后端·poi-tl
别致的影分身2 小时前
使用C语言连接MySQL
数据库·mysql
ssr——ssss2 小时前
SSM-期末项目 - 基于SSM的宠物信息管理系统
java·ssm