MybatisPlus快速上手

本文档详细介绍了MybatisPlus的快速入门,包括添加依赖、配置数据库、创建实体类、启动类、Mapper接口及测试用例。演示了分页查询、插入、更新、删除操作,以及条件构造器的使用,同时还展示了如何实现乐观锁和自动更新时间的功能。此外,还提供了完整的代码示例和测试方法。
摘要由CSDN通过智能技术生成

MybatisPlus快速上手

pom依赖

    <dependencies>
        <!-- https://mvnrepository.com/artifact/com.github.pagehelper/pagehelper -->
        <dependency>
            <groupId>com.github.pagehelper</groupId>
            <artifactId>pagehelper</artifactId>
            <version>5.2.0</version>
        </dependency>
        <!-- 数据库驱动 -->
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
        </dependency>
        <!-- lombok 简化set get toString -->
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
        </dependency>
        <!-- mybatis-plus -->
        <dependency>
            <groupId>com.baomidou</groupId>
            <artifactId>mybatis-plus-boot-starter</artifactId>
            <version>3.4.2</version>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>

        <dependency>
            <groupId>org.junit.jupiter</groupId>
            <artifactId>junit-jupiter-engine</artifactId>
            <scope>test</scope>
        </dependency>
        <dependency>
            <groupId>org.junit.vintage</groupId>
            <artifactId>junit-vintage-engine</artifactId>
            <scope>test</scope>
        </dependency>

<!--        适配 IntelliJ IDEA版本和junit版本-->
        <dependency>
            <groupId>org.junit.platform</groupId>
            <artifactId>junit-platform-launcher</artifactId>
            <scope>test</scope>

        </dependency>

        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <scope>test</scope>
        </dependency>

    </dependencies>

数据库

DROP TABLE IF EXISTS `user`;
CREATE TABLE `user`  (
  `id` bigint(0) NOT NULL AUTO_INCREMENT COMMENT 'id',
  `name` varchar(30) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT '用户名',
  `password` varchar(20) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT '密码',
  `email` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci DEFAULT NULL COMMENT '邮箱',
  `age` tinyint(0) DEFAULT NULL COMMENT '年龄',
  PRIMARY KEY (`id`) USING BTREE
) ENGINE = InnoDB AUTO_INCREMENT = 19 CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = Dynamic;

SET FOREIGN_KEY_CHECKS = 1;

结构

image-20220513190654569

基本配置

yml配置

spring:
  datasource:
    driver-class-name: com.mysql.cj.jdbc.Driver
    url: jdbc:mysql://localhost:3306/iot?useUnicode=true&useSSL=false&characterEncoding=utf8&serverTimezone=Asia/Shanghai
    username: root
    password: bcy123

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

实体类

package mpTest.entity;

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

@Data
@AllArgsConstructor
@NoArgsConstructor
public class User {
    private Long id;
    private String name;
    private String password;
    private String email;
    private Integer age;
}

启动类

package mpTest;

import org.mybatis.spring.annotation.MapperScan;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

@SpringBootApplication
@MapperScan("mpTest.mapper")
public class StartApplication {

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

}

接口

package mpTest.mapper;

import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import mpTest.entity.User;
import org.springframework.stereotype.Repository;

//在对应的Mapper 接口上 基础基本的 BaseMapper<T> T是对应的pojo类
@Repository   //告诉容器你是持久层的 @Repository是spring提供的注释,能够将该类注册成Bean
public interface UserMapper extends BaseMapper<User> {
    //所有的crud都编写完成了
}

测试查询

查询全部

    @Test
    public void testSelectList() {
        System.out.println(("----- selectAll method test 测试查询所有用户方法 ------"));
        //selectList 的参数wrapper 是条件构造器,可以先写null
        List<User> userList = userMapper.selectList(null);
        //forEach 的参数是 Consumer类型的 语法糖
        System.out.println("----------test--------------");
        userList.forEach(System.out::println);
    }

分页查询

  • 配置类
package mpTest.config;

import com.baomidou.mybatisplus.annotation.DbType;
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
//@MapperScan("**.mapper")  //官方文档说要加MapperScan
//主要是扫描到mapper包下的接口交给spring管理,我这里在启动类上添加过了,这里就不加了
public class MybatisPlusConfig {
    @Bean
    public MybatisPlusInterceptor mybatisPlusInterceptor() {
        MybatisPlusInterceptor mybatisPlusInterceptor = new MybatisPlusInterceptor();
        mybatisPlusInterceptor.addInnerInterceptor(new OptimisticLockerInnerInterceptor());//创建乐观锁拦截器 OptimisticLockerInnerInterceptor
        mybatisPlusInterceptor.addInnerInterceptor(new PaginationInnerInterceptor(DbType.MYSQL)); //插件分页拦截器,我的是mysql
        return mybatisPlusInterceptor;
    }
}
  • 测试类
//测试分页查询
@Test
public void testPage() {
    Page<User> page = new Page<>(1,5); //开启拦截器后,会注册一个page对象  当前页,每页条数
    //方法源码:   <P extends IPage<T>> P selectPage(P page, @Param(Constants.WRAPPER) Wrapper<T> queryWrapper);
    userMapper.selectPage(page,null); //分页查询
    page.getRecords().forEach(System.out::println); //获取分页后的数据 打印
    System.out.println(page.getTotal()); //获取记录总数
}

测试插入

    @Test
    public void testInsert() {
        User user = new User();
        user.setAge(12);
        user.setName("说");
        user.setPassword("78797777878a");
        System.out.println("----------test--------------");
        int result = userMapper.insert(user);
        System.out.println("result = " + result);
        System.out.println("user = " + user);
    }

测试更新

更新

//更新测试
@Test
public void testUpdateByID() {
    User user = new User();
    user.setId(18L);
    user.setName("小小");
    user.setAge(18);//这一行后加
    int i = userMapper.updateById(user);//受影响的行数,参数是一个user不是id,点击看源码
    System.out.println("i = " + i);
}

自动更新时间

1、 通过注解

//字段添加填充内容
@TableField(fill = FieldFill.INSERT ,value = "create_time")
private LocalDateTime createTime;
@TableField(fill = FieldFill.INSERT_UPDATE ,value = "update_time")
private LocalDateTime updateTime;

2、 编写处理器来处理这个注解

@Slf4j //日志
@Component//以组件的形式把这个处理器注册到IOC容器中
public class MyMetaObjectHandler implements MetaObjectHandler {

    //插入时启动  第三个参数 LocalDateTime 一定要和 createTime成员变量的值的类型一致,不然是null 如果是date就都设置date
    @Override
    public void insertFill(MetaObject metaObject) {
        log.info("start insert fill ....");
        this.strictInsertFill(metaObject, "createTime", LocalDateTime.class, LocalDateTime.now()); // 起始版本 3.3.0(推荐使用)
        this.strictUpdateFill(metaObject, "updateTime", LocalDateTime.class, LocalDateTime.now()); // 起始版本 3.3.0(推荐)
    }

    //更新时候启动
    @Override
    public void updateFill(MetaObject metaObject) {
        log.info("start update fill ....");
        this.strictUpdateFill(metaObject, "updateTime", LocalDateTime.class, LocalDateTime.now()); // 起始版本 3.3.0(推荐)
    }
}

测试删除

//删除测试
@Test
public void testDeleteById(){
    userMapper.deleteById(1525072816282255362L);
    // userMapper.delete(null); //全部删除
}

QueryWrapper

条件查询

@Test
public void contextLoads() {
    //----------查询多个
    //查询一个复杂的,比如查询用户name、邮箱不为空,年龄大于20的用户
    QueryWrapper<User> wrapper = new QueryWrapper<>(); //首先新建一个 QueryWrapper
    //链式编程 添加查询条件
    wrapper.isNotNull("name")
            .like("email","%@163.com")
            .ge("age",12);
    userMapper.selectList(wrapper).forEach(System.out::println);
    //----------查询单个
    wrapper.isNull("password");
    User user = userMapper.selectOne(wrapper); //出现多个结果会报错,查询一个
    System.out.println("user = " + user);
}

模糊删除

@Test
public void test3() {
    //模糊查询
    QueryWrapper<User> wrapper = new QueryWrapper<>();
    wrapper.like("name",9)         //  名字中 存在 99
            .notLike("name",6)      //  名字中 不存在 6
            .likeRight("email","s")   //  邮箱 最左边是2  2%
            .likeLeft("email","m"); //  邮箱 最右边是m  %m
    List<Map<String, Object>> maps = userMapper.selectMaps(wrapper);
    maps.forEach(System.out::println);
}

参考

Mybatis-Plus详解_有头发还能学的博客-CSDN博客_mybatis-plus

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值