Live2D

mybatis-plus

mybatis-puls

  1. 快速上手

    • 导入依赖 注意,我所使用的是3.0.5版本,便于理解原理

       <dependency>
                  <groupId>mysql</groupId>
                  <artifactId>mysql-connector-java</artifactId>
              </dependency>
              <dependency>
                  <groupId>org.projectlombok</groupId>
                  <artifactId>lombok</artifactId>
              </dependency>
              <dependency>
                  <groupId>com.baomidou</groupId>
                  <artifactId>mybatis-plus-boot-starter</artifactId>
                  <version>3.0.5</version>
              </dependency>
      
    • 创建mybatis_plus数据库,导入表User

      DROP TABLE IF EXISTS USER;
      
      CREATE TABLE USER
      (
      	id BIGINT(20) NOT NULL COMMENT '主键ID',
      	NAME VARCHAR(30) NULL DEFAULT NULL COMMENT '姓名',
      	age INT(11) NULL DEFAULT NULL COMMENT '年龄',
      	email VARCHAR(50) NULL DEFAULT NULL COMMENT '邮箱',
      	PRIMARY KEY (id)
      );
      
      DELETE FROM USER;
      
      INSERT INTO USER (id, NAME, age, email) VALUES
      (1, 'Jone', 18, 'test1@baomidou.com'),
      (2, 'Jack', 20, 'test2@baomidou.com'),
      (3, 'Tom', 28, 'test3@baomidou.com'),
      (4, 'Sandy', 21, 'test4@baomidou.com'),
      (5, 'Billie', 24, 'test5@baomidou.com');
      
    • 配置数据源

      spring:
        datasource:
          username: root
          password: 123456
          url: jdbc:mysql://localhost:3306/mybatis_plus?useSSL=false&useUnicode=ture&characterEncoding=utf-8&serverTimezone=GMT%2B8
          driver-class-name: com.mysql.cj.jdbc.Driver
      
    • 编写实体类

      package com.lix.pojo;
      
      
      import lombok.AllArgsConstructor;
      import lombok.Data;
      import lombok.NoArgsConstructor;
      
      @Data//使用了Lombok简化代码
      @NoArgsConstructor
      @AllArgsConstructor
      public class User {
          private long id;
          private String name;
          private int age;
          private String email;
      }
      
      
    • 编写mapper接口

      package com.lix.mapper;
      
      import com.baomidou.mybatisplus.core.mapper.BaseMapper;
      import com.lix.pojo.User;
      import org.springframework.stereotype.Repository;
      
      @Repository//标识这是一个dao层
      public interface UserMapper extends BaseMapper<User> {//mapper接口继承BaseMapper即可
      }
      
      
    • 在主启动类上添加MapperScan扫描mapper包

      package com.lix;
      
      import org.mybatis.spring.annotation.MapperScan;
      import org.springframework.boot.SpringApplication;
      import org.springframework.boot.autoconfigure.SpringBootApplication;
      
      @SpringBootApplication
      @MapperScan("com.lix.mapper")//自动扫描mapper包
      public class MybatisPlusApplication {
      
          public static void main(String[] args) {
              SpringApplication.run(MybatisPlusApplication.class, args);
          }
      
      }
      
    • 编写测试类测试mybatis-plus

      package com.lix;
      
      import com.lix.mapper.UserMapper;
      import com.lix.pojo.User;
      import org.junit.jupiter.api.Test;
      import org.springframework.beans.factory.annotation.Autowired;
      import org.springframework.boot.test.context.SpringBootTest;
      
      import java.util.List;
      
      @SpringBootTest
      class MybatisPlusApplicationTests {
      
          @Autowired
          private UserMapper userMapper;
      
          @Test
          void contextLoads() {
              List<User> users = userMapper.selectList(null);
              users.forEach(System.out::println);
          }
      
      }
      
    • 可以看到程序输出了user表信息

    • 到此,小功告成

  2. 使用了mybatis-plus之后,我们所有的sql几乎都被它去写了,想要看到sql语句就要添加一个日志,也很简单,只需要在配置文件中加入日志配置就好了,小功告成

    mybatis-plus:
      configuration:
        log-impl: org.apache.ibatis.logging.stdout.StdOutImpl//这是一个将日志控制台输出的配置
    
  3. 插入和更新以及gmt_creat、gmt_modified

    • 数据库中新增字段gmt_creat、gmt_modified(datetime)

    • 插入操作

          //测试insert方法
          @Test
          void userInsert(){
              User users = new User();
              users.setName("lix");
              users.setAge(3);
              users.setEmail("58007765@qq.com");
              System.out.println(userMapper.insert(users));
              System.out.println(users);
          }
      
    • 更新操作

      //测试update方法
          @Test
          void userUpdate(){
              User users = new User();
              users.setId(6L);
              users.setName("lxf");
              System.out.println(userMapper.updateById(users));
          }
      
    • 自动填充gmt_creat、gmt_modified

      • 首先需要在数据库表对应的字段名上添加@TableField

        @TableField(fill = FieldFill.INSERT)
            private Date gmtCreat;
        
            @TableField(fill = FieldFill.INSERT_UPDATE)
            private Date gmtModified;
        
      • 其次我们需要实现MetaObjectHandler类来指定需要填充的列

        package com.lix.handler;
        
        import com.baomidou.mybatisplus.core.handlers.MetaObjectHandler;
        import lombok.extern.slf4j.Slf4j;
        import org.apache.ibatis.reflection.MetaObject;
        import org.springframework.stereotype.Component;
        
        import java.util.Date;
        @Slf4j
        @Component
        public class MyMetaObjectHandler implements MetaObjectHandler {//实现MetaObjectHandler,重写insertFill,updateFill方法
            @Override
            public void insertFill(MetaObject metaObject) {
                this.setFieldValByName("gmtCreat",new Date(),metaObject);//gmtCreat列填充
                this.setFieldValByName("gmtModified",new Date(),metaObject);//gmtModified列填充
            }
        
            @Override
            public void updateFill(MetaObject metaObject) {
                this.setFieldValByName("gmtModified",new Date(),metaObject);//gmtModified列填充
            }
        }
        
        
      • 最后,测试类测试inser、update方法,查看数据库是否填充成功

      • 小功告成

  4. 乐观锁

    • 首先在数据库中增加version字段

    • 在对应的实体类属性version上增加@version注解

      @Version
          private Integer version;
      
    • 创建一个MybatisplusConfig配置类,编写相应配置

      package com.lix.config;
      
      
      import com.baomidou.mybatisplus.extension.plugins.OptimisticLockerInterceptor;
      import org.mybatis.spring.annotation.MapperScan;
      import org.springframework.context.annotation.Bean;
      import org.springframework.context.annotation.Configuration;
      import org.springframework.transaction.annotation.EnableTransactionManagement;
      
      @MapperScan("com.lix.mapper")//要在那个包下扫描mapper接口
      @Configuration//标注这是一个配置类,被IOC托管
      @EnableTransactionManagement//开启事务的支持
      public class MybatisPlusConfig {
      
          //配置乐观锁需要先注册下面这个Bean
          @Bean
          public OptimisticLockerInterceptor optimisticLockerInterceptor(){
              return new OptimisticLockerInterceptor();
          }
      }
      
      
    • 最后,测试类中测试更新方法,

    //测试@version
        @Test
        void userUpdate1(){//模拟单线程
            User users = userMapper.selectById(6L);
            users.setName("l");
            System.out.println(userMapper.updateById(users));
        }
    
    • 会发现动态SQL被拼接为带version=?的语句,至此,乐观锁上锁成功,小功告成

      UPDATE user SET name=?, age=?, email=?, version=?, gmt_modified=? WHERE id=? AND version=? 
      
  5. 分页查询

    • 首先要在配置类mybatisplusconfig中加入如下配置

          @Bean
          public PaginationInterceptor paginationInterceptor() {
              return new PaginationInterceptor();
          }
      
    • 然后直接在测试类中使用

          @Test
          void userSelect3() {
              Page<User> page = new Page<>(1,5);
              IPage<User> iPage = userMapper.selectPage(page, null);
              iPage.getRecords();
          }
      
    • 小功告成

  6. wrapper-条件查询构造器(多多练习即可)

     @Test
        void selectLikeRight(){
            QueryWrapper<User> wrapper = new QueryWrapper<>();
            wrapper.likeRight("name","l");
            userMapper.selectList(wrapper).forEach(System.out::println);
        }
        @Test
        void selectAllEq(){
            val wrapper = new QueryWrapper<User>();
            wrapper.eq("name","lix")
                    .ge("age",3)
                    .between("age","10","20");
    
    • alleq({id:1,name:"lix",age:null},true)

    • eq =

    • ne !=

    • gt >

    • ge >=

    • lt <

    • le <=

    • between [val1,val2]

    • notBetween

    • like 包含某一个字符

    • notLike 不包含某一个字符

    • likeLeft 以char结尾

    • likeRight 以char开头

    • isNull

    • isNotNull

      in("age",{1,2,3})
          
      
      

      ......

    • 小功告成

posted @ 2021-09-09 00:47  六爻呈乾  阅读(39)  评论(0编辑  收藏  举报