mybatis-plus使用

目录

1. 快速开始

       1. 创建user表

        2. 插入几条数据

        3. 创建一个新的springboot项目

        4. 导入mybatis-plus依赖

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

        6. 编写实体类

        7. 编写Mapper 接口类

        8. 添加 @MapperScan 注解

        9. 测试

2. CRUD

        1. 插入一条语句

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

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

        4. 根据主键id进行查找

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

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

        7. 根据 wrapper 条件查询

        8. 根据主键id进行更新

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

3. 分页

        0. 配置分页插件

        1. 通过selectPage方法分页

        2. 通过selectMapsPage方法分页

4. 自增列的值(generated key)

5. 联接查询

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

        2. 创建Order实体类

        3. 联合查询

        4. 测试


1. 快速开始

       1. 创建user表

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. 插入几条数据

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依赖

        <!-- 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依赖

        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>8.0.33</version>
        </dependency>

        导入lombok依赖

        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <optional>true</optional>
        </dependency>

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

        application.properties

# 数据库配置
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

# 数据库配置
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. 编写实体类

@Data
@NoArgsConstructor
@AllArgsConstructor
@ToString
public class User {
    private Integer id;
    private String username;
    private String password;
}

        7. 编写Mapper 接口类

public interface UserMapper extends BaseMapper<User> {
}

        8. 添加 @MapperScan 注解

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

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

}

        9. 测试

@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);
        }
    }
}

        控制台输出:


2. CRUD

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

        1. 插入一条语句

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

    @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 表示主键值由数据库自动生成,通常用于自增主键。

@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删除一条记录

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

        控制台输出。

        数据库内容。

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

    @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进行查找

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

        控制台输出。

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

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

        控制台输出。

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

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

        控制台输出。

        7. 根据 wrapper 条件查询

    @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进行更新

    @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进行更新

    @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));
    }

        控制台输出。


3. 分页

        0. 配置分页插件

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

        1. 通过selectPage方法分页

    @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>。

    @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方法直接取到主键的值。

    @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表)并插入数据

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实体类

@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注解来实现。

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. 测试

    @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

MybatisPlus 是一个 Mybatis 的增强工具,它简化了 Mybatis 的开发流程,提供了许多实用的功能,如自动生成 SQL、分页、逻辑删除等。下面是 MybatisPlus使用方法: 1. 引入 MybatisPlus 通过 Maven 引入 MybatisPlus 的依赖: ```xml <dependency> <groupId>com.baomidou</groupId> <artifactId>mybatis-plus-boot-starter</artifactId> <version>${mybatis-plus.version}</version> </dependency> ``` 2. 配置 MybatisPlus 在 Spring Boot 项目中配置 MybatisPlus,需要在 application.yml 文件中添加以下配置: ```yaml mybatis-plus: # mapper.xml 所在路径 mapper-locations: classpath:/mapper/*.xml # 实体类所在包 typeAliasesPackage: com.example.entity ``` 3. 定义实体类 实体类需要使用 MybatisPlus 提供的注解来标记字段,如 @Table、@Id、@TableField 等。例如: ```java @Data @TableName("user") public class User { @TableId(type = IdType.AUTO) private Long id; private String name; private Integer age; @TableField(fill = FieldFill.INSERT) private Date createTime; @TableField(fill = FieldFill.UPDATE) private Date updateTime; @TableLogic private Integer deleted; } ``` 4. 定义 Mapper Mapper 接口需要继承 MybatisPlus 提供的 BaseMapper 接口,例如: ```java public interface UserMapper extends BaseMapper<User> { } ``` 5. 使用 MybatisPlus 使用 MybatisPlus 的查询、插入、更新、删除等操作,只需要调用 BaseMapper 接口提供的方法即可,例如: ```java @Service public class UserServiceImpl implements UserService { @Autowired private UserMapper userMapper; @Override public User getUserById(Long id) { return userMapper.selectById(id); } @Override public boolean addUser(User user) { return userMapper.insert(user) > 0; } @Override public boolean updateUser(User user) { return userMapper.updateById(user) > 0; } @Override public boolean deleteUserById(Long id) { return userMapper.deleteById(id) > 0; } } ``` 以上就是 MybatisPlus 的基本使用方法。除了上述功能,MybatisPlus 还提供了许多其他实用的功能,如分页、逆向工程、多租户、动态表名等,可以根据具体需求进行使用
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

睆小白

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

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

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

打赏作者

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

抵扣说明:

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

余额充值