MyBatis Plus

MyBatis Plus

国产开源框架,基于MyBatis

核心功能:简化MyBatis开发,提高效率

快速上手

  1. Spring Boot + MyBatis Plus
    在这里插入图片描述

  2. pom.xml引入MyBatis Plus

<dependency>
    <groupId>com.baomidou</groupId>
    <artifactId>mybatis-plus-boot-starter</artifactId>
    <version>3.4.2</version>
</dependency>
  1. 创建实体类

    package com.xidian.mybatisplus.entity;
    
    import lombok.Data;
    
    @Data
    public class User {
        private Integer id;
        private String name;
        private Integer age;
    }
    

    lombok是一个可以通过简单的注解的形式来帮助简化消除一些必须有但显得很臃肿的 Java 代码的工具,如新建了一个类,然后在其中写了几个字段,然后通常情况下需要手动去建立getter和setter方法、构造函数等,lombok的作用就是为了省去手动创建这些代码的麻烦,它能够在编译源码的时候自动帮我们生成这些方法。

  2. 创建Mapper接口

package com.xidian.mybatisplus.mapper;

import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.xidian.mybatisplus.entity.User;

public interface UserMapper extends BaseMapper<User> {
}

  1. application.yml

    spring:
      datasource:
        driver-class-name: com.mysql.cj.jdbc.Driver
        url: jdbc:mysql://localhost:3306/mybatis?useUnicode=true&characterEncoding=UTF-8&serverTimezone=Asia/Shanghai
        username: root
        password: xxxxxxxxx
    mybatis-plus:
      configuration:
        log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
    
  2. 启动类需要添加@MapperScan(“mapper所在的包”),否则无法加载Mapper bean

package com.xidian.mybatisplus;

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

@SpringBootApplication
@MapperScan("com.xidian.mybatisplus.mapper")
public class MybatisplusApplication {

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

}
  1. 测试

    package com.xidian.mybatisplus.mapper;
    
    import org.junit.jupiter.api.Test;
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.boot.test.context.SpringBootTest;
    
    import static org.junit.jupiter.api.Assertions.*;
    
    @SpringBootTest
    class UserMapperTest {
    
        @Autowired
        private UserMapper mapper;
    
        @Test
        void test(){
            // 查询条件 -> null forEach 用于遍历动态数组中每一个元素并执行特定操作
            mapper.selectList(null).forEach(System.out::println);
        }
    }
    

    常用注解

    @TableName

    映射数据库的表名

    package com.xidian.mybatisplus.entity;
    
    import com.baomidou.mybatisplus.annotation.TableName;
    import lombok.Data;
    
    @Data
    @TableName(value = "user")
    public class User {
        private Integer id;
        private String name;
        private Integer age;
    }
    

    @TableId

    设置主键映射,value映射主键字段的名字

    package com.xidian.mybatisplus.entity;
    
    import com.baomidou.mybatisplus.annotation.TableId;
    import com.baomidou.mybatisplus.annotation.TableName;
    import lombok.Data;
    
    @Data
    @TableName(value = "user")
    public class User {
        @TableId(value = "id")
        private Integer num;
        private String name;
        private Integer age;
    }
    

    type设置主键类型,主键的生成策略

    AUTO(0),
    NONE(1),
    INPUT(2),
    ASSIGN_ID(3), //替换ID_WORDER 和 ID_WORKER_STR
    ASSIGN_UUID(4), // 替换 UUID
    /** @deprecated */
    @Deprecated
    ID_WORDER(3),
    /** @deprecated */
    @Deprecated
    ID_WORKER_STR(3),
    /** @deprecated */
    @Deprecated
    UUID(4);
    
    描述
    AUTO数据库自增
    NONEMP set主键,雪花算法实现
    INPUT需要开发者手动赋值
    AAIGN_IDMP 分配ID,Long、Integer、String
    ASSIGN_UUID分配UUID,String

    INPUT如果开发者没有手动赋值,则数据库则通过过自增的方式给主键赋值

    AUTO默认就是数据库自增,开发者无需赋值

    ASSIGN_ID MP自动赋值,雪花算法

    ASSIGN_UUID 主键的数据类型必须是String类型,自动生成UUID进行赋值

    @TableField

    映射非主键字段,value映射字段名

    exist表示是否为数据库字段,=false时不会进行查询 ,若实体类中的成员变量在数据库中没有对应的字段,则可以使用exist、VO、DTO

    (VO:value object 值对象,用new关键字创建,由GC回收,它是业务对象,是存活在业务层的,是业务逻辑使用的,它存活的目的就是为数据提供一个生存的地方。给前端需要的,减少数据传输

    DTO:Data Transfer Object数据传输对象,主要用于远程调用等需要大量传输对象的地方。 比如我们一张表有100个字段,那么对应的PO就有100个属性。 但是我们界面上只要显示10个字段, 客户端用WEB service来获取数据,没有必要把整个PO对象传递到客户端, 这时我们就可以用只有这10个属性的DTO来传递结果到客户端,这样也不会暴露服务端表结构.到达客户端以后,如果用这个对象来对应界面显示,那此时它的身份就转为VO。

    PO:persistant object 持久对象,是向数据库中添加新数据时创建,删除数据库中数据时削除的。并且它只能存活在一个数据库连接中,断开连接即被销毁。)

    select表示是否可以查询该字段

    fill表示是否自动填充,将对象存入数据库的时候,由MyBatis Plus自动给某些字段赋值,create_time、update_time

    1. 给表添加create_time、update_time字段

    2. 实体类中添加成员变量

          @TableField(fill = FieldFill.INSERT)
          private Date createTime;
          // 选择update是当更新updateTime时才会赋值,而update_insert是一开始就会对于该变量进行赋值
          @TableField(fill = FieldFill.INSERT_UPDATE)
          private Date updateTime;
      
    3. 创建自动填充处理器

      package com.xidian.mybatisplus.handler;
      
      import com.baomidou.mybatisplus.core.handlers.MetaObjectHandler;
      import org.apache.ibatis.reflection.MetaObject;
      import org.springframework.stereotype.Component;
      
      import java.util.Date;
      
      @Component
      public class MyMetaObjectHandler implements MetaObjectHandler {
      
          @Override
          public void insertFill(MetaObject metaObject) {
              this.setFieldValByName("createTime",new Date(),metaObject);
              this.setFieldValByName("updateTime",new Date(),metaObject);
          }
      
          @Override
          public void updateFill(MetaObject metaObject) {
              this.setFieldValByName("updateTime",new Date(),metaObject);
          }
      }
      

    Version

    ​ 标记乐观锁,通过version字段来保证数据的安全性,当修改数据的时候会以version作为条件,当条件成立的时候才会修改成功

    version = 1

    线程1:update …set version = 2 where version = 1

    线程2:update …set version = 2 where version = 1

    1. 数据库表添加version字段,默认值为1

    2. 实体类添加version成员变量,并且添加@Version

          @Version
          private Integer version;
      
    3. 注册配置类

      package com.xidian.mybatisplus.config;
      
      
      import com.baomidou.mybatisplus.extension.plugins.MybatisPlusInterceptor;
      import com.baomidou.mybatisplus.extension.plugins.inner.OptimisticLockerInnerInterceptor;
      import org.springframework.context.annotation.Bean;
      import org.springframework.context.annotation.Configuration;
      
      @Configuration
      public class MyBatisPlusConfig {
      
          @Bean
          public MybatisPlusInterceptor mybatisPlusInterceptor(){
              MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();
              interceptor.addInnerInterceptor(new OptimisticLockerInnerInterceptor()); // 乐观锁插件
              return interceptor;
          }
      
      }
      

    EnumValue

    通过枚举类注解,将数据库字段映射成实体类的枚举类型成员变量

    package com.xidian.mybatisplus.enums;
    
    import com.baomidou.mybatisplus.annotation.EnumValue;
    
    public enum StatusEnum {
        WORK(1, "上班"),
        REST(0, "休息");
    
        StatusEnum(Integer code, String msg) {
            this.code = code;
            this.msg = msg;
        }
    
        @EnumValue
        private Integer code;
        private String msg;
    
    }
    

    application.yml加上

    mybatis-plus:
      configuration:
        log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
      # 以下两行 
      type-enums-package:
      com.xidian.mybatisplus.enums
    

    TableLogic

    映射逻辑删除

    1. 数据表添加deleted字段,表示逻辑删除

    2. 实体类添加注解

          @TableLogic
          private Integer deleted;
      
      1. application.yml添加配置
      mybatis-plus:
        configuration:
          log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
        type-enums-package:
          com.xidian.mybatisplus.enums
        global-config:
        	#  以下
          db-config:
            logic-not-delete-value: 0
            logic-delete-value: 1
      

查询

    void select(){
//        不加任何条件,全部查询
//        mapper.selectList(null);
        QueryWrapper wrapper = new QueryWrapper();
        // Map只能做等职判断,逻辑判断需要使用Wrapper来处理
        Map<String,Object> map = new HashMap<>();
        map.put("name","张三");
        map.put("age",21);
        // 查询所有符合条件的
//        wrapper.allEq(map);
        // 查询以xx结尾的      like "%三"
//        wrapper.likeLeft("name","三");
        // 查询以xx为首的的    like "张%"
//        wrapper.likeRight("name","张");
        // inSQL 联合查询
//        wrapper.inSql("id","select id from user where id < 4");
//        wrapper.inSql("age","select age from user where age < 25");
        // 排序 升序
        wrapper.orderByAsc("age");
        // 加条件
        wrapper.having("id > 3");
        System.out.println(mapper.selectList(wrapper)).forEach(System.out::println);
    }
分页查询
        //分页查询
        Page<User> page = new Page<>(1,2);
        Page<User> result = mapper.selectPage(page,null);
        System.out.println(result.getSize());
        System.out.println(result.getTotal());
        result.getRecords().forEach(System.out::println);

在config中配置

    @Bean
    public MybatisPlusInterceptor paginationInterceptor() {
        MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();
        interceptor.addInnerInterceptor(new PaginationInnerInterceptor(DbType.MYSQL));
        return interceptor;
    }

添加

    @Test
    void save(){
        User user = new User();
        user.setName("内马尔");
        user.setAge(34);
        mapper.insert(user);
    }

删除

    @Test
    void delete(){
        // 单一删除
//        mapper.deleteById(1);
        // 批量删除
//        mapper.deleteBatchIds(Arrays.asList(3,4));
        // 条件删除
//        QueryWrapper wrapper = new QueryWrapper();
//        wrapper.eq("age",25);
//        mapper.delete(wrapper);
        // 通过装到map进行删除
//        Map<String, Object> map = new HashMap<>();
//        map.put("id",10);
//        mapper.deleteByMap(map);
    }

修改

    @Test
    void update(){
//        User user = mapper.selectById(11);
//        user.setAge(25);
//        mapper.updateById(user);
        // 通过wrapper进行更新
        User user = mapper.selectById(1);
        user.setAge(25);
        QueryWrapper wrapper = new QueryWrapper();
        wrapper.eq("name","张三");
        mapper.update(user,wrapper);
    }

自定义SQL、多表关联

  1. 自定义VO

    package com.xidian.mybatisplus.entity;
    
    import lombok.Data;
    
    @Data
    public class ProductVO {
        private Integer id;
        private Integer category;
        private Integer count;
        private String description;
        private Integer userId;
        private String userName;
    }
    
  2. 自定义接口

    package com.xidian.mybatisplus.mapper;
    
    import com.baomidou.mybatisplus.core.mapper.BaseMapper;
    import com.xidian.mybatisplus.entity.ProductVO;
    import com.xidian.mybatisplus.entity.User;
    import org.apache.ibatis.annotations.Select;
    
    import java.util.List;
    
    public interface UserMapper extends BaseMapper<User> {
        @Select("select p.*,u.name userName from product p,user u where p.user_id = u.id and u.id = #{id}")
        List<ProductVO> productList(Integer id);
    }
    
    
  3. 调用

        @Test
        void product(){
            mapper.productList(4).forEach(System.out::println);
        }
    

MyBatis Plus自动生成

根据数据表自定生成实体类、Mapper、Service、Servicelmpl(Service实现类)、Controller

  1. pom.xml导入MyBatis Plus Generator

            <dependency>
                <groupId>com.baomidou</groupId>
                <artifactId>mybatis-plus-generator</artifactId>
                <version>3.4.1</version>
            </dependency>
            <dependency>
                <groupId>org.apache.velocity</groupId>
                <artifactId>velocity</artifactId>
                <version>1.7</version>
            </dependency>
    

    ​ Velocity(默认)、Freemarker、Beetl

  2. 启动类

    package com.xidian.mybatisplus;
    
    
    import com.baomidou.mybatisplus.annotation.DbType;
    import com.baomidou.mybatisplus.generator.AutoGenerator;
    import com.baomidou.mybatisplus.generator.config.DataSourceConfig;
    import com.baomidou.mybatisplus.generator.config.GlobalConfig;
    import com.baomidou.mybatisplus.generator.config.PackageConfig;
    import com.baomidou.mybatisplus.generator.config.StrategyConfig;
    import com.baomidou.mybatisplus.generator.config.rules.NamingStrategy;
    
    public class Main {
        public static void main(String[] args) {
            // 创建generator对象
            AutoGenerator autoGenerator = new AutoGenerator();
            // 数据源
            DataSourceConfig dataSourceConfig = new DataSourceConfig();
            dataSourceConfig.setDbType(DbType.MYSQL);
            dataSourceConfig.setUrl("jdbc:mysql://localhost:3306/mybatis?useUnicode=true&characterEncoding=UTF-8&serverTimezone=Asia/Shanghai");
            dataSourceConfig.setUsername("root");
            dataSourceConfig.setPassword("zzzz..123");
            dataSourceConfig.setDriverName("com.mysql.cj.jdbc.Driver");
            // 装入数据源
            autoGenerator.setDataSource(dataSourceConfig);
            // 全局配置
            GlobalConfig globalConfig = new GlobalConfig();
            globalConfig.setOutputDir(System.getProperty("user.dir") + "/src/main/java");
            globalConfig.setOpen(false);
            globalConfig.setAuthor("zz");
            autoGenerator.setGlobalConfig(globalConfig);
            // 包信息
            PackageConfig packageConfig = new PackageConfig();
            packageConfig.setParent("com.xidian.mybatisplus");
            packageConfig.setModuleName("generator");
            packageConfig.setController("controller");
            packageConfig.setService("service");
            packageConfig.setServiceImpl("service.impl");
            packageConfig.setMapper("mapper");
            packageConfig.setEntity("entity");
            autoGenerator.setPackageInfo(packageConfig);
            // 配置策略
            StrategyConfig strategyConfig = new StrategyConfig();
            // 自动添加lombok注解
            strategyConfig.setEntityLombokModel(true);
            // 下划线转驼峰
            strategyConfig.setNaming(NamingStrategy.underline_to_camel);
            strategyConfig.setColumnNaming(NamingStrategy.underline_to_camel);
            autoGenerator.setStrategy(strategyConfig);
            // 执行
            autoGenerator.execute();
        }
    }
    
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值