zoukankan      html  css  js  c++  java
  • MybatisPlus学习笔记

    mybatis-plus快速上手

    1.创建maven工程

    2.添加pom依赖

    <dependency>
        <groupId>com.baomidou</groupId>
        <artifactId>mybatis-plus-boot-starter</artifactId>
        <version>3.3.1.tmp</version>
    </dependency>
    

    3.创建实体类

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

    4.创建Mapper接口

    package com.example.mybatisplus.mapper;
    
    import com.baomidou.mybatisplus.core.mapper.BaseMapper;
    import com.example.mybatisplus.entity.User;
    
    public interface UserMapper extends BaseMapper<User> {
    }
    

    5.application.yml

    spring:
      datasource:
        driver-class-name: com.mysql.cj.jdbc.Driver
        url: jdbc:mysql://localhost:3306/mybatis?useUnicode=true&characterEncoding=UTF-8
        username: root
        password: 1qaz@WSX
    #想在运行时打印sql日志
    mybatis-plus:
      configuration:
        log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
    

    6.启动类添加@MapperScan("mapper所在包")注解

    package com.example.mybatisplus;
    
    import org.mybatis.spring.annotation.MapperScan;
    import org.springframework.boot.SpringApplication;
    import org.springframework.boot.autoconfigure.SpringBootApplication;
    
    @SpringBootApplication
    @MapperScan("com.example.mybatisplus.mapper")
    public class MybatisplusApplication {
    
        public static void main(String[] args) {
            SpringApplication.run(MybatisplusApplication.class, args);
        }
    
    }
    

    7.测试

    package com.example.mybatisplus.mapper;
    
    import org.junit.jupiter.api.Test;
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.boot.test.context.SpringBootTest;
    
    
    @SpringBootTest
    class UserMapperTest {
    
        @Autowired
        private UserMapper userMapper;
    
        @Test
        void test(){
            userMapper.selectList(null).forEach(System.out::println);
        }
    
    }
    

    常用注解

    注:默认通过entity名字与数据表名匹配,如果名字匹配不上需要添加注解映射

    @TableName

    映射数据库表名

    @Data
    @TableName(value = "user")
    public class UserEntity {
    
       private Integer id;
       private String name;
       private Integer age;
    
    }
    

    @TableId

    设置主键映射,value属性是数据库主键字段名

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

    AUTO(0),
    NONE(1),
    INPUT(2),
    ASSIGN_ID(3),
    ASSIGN_UUID(4),
    /** @deprecated */
    @Deprecated
    ID_WORKER(3),
    /** @deprecated */
    @Deprecated
    ID_WORKER_STR(3),
    /** @deprecated */
    @Deprecated
    UUID(4);
    
    描述
    AUTO 数据库自增,会把id返回给java对象,即使开发者赋id值也取数据库的
    NONE MybatisPlus(MP) set主键,雪花算法实现
    INPUT 需要开发者手动赋值(开发者没有赋值,则数据库自增方式)
    ASSIGN_ID MP分配id,Long、Integer、String,雪花算法
    ASSIGN_UUID 分配UUID,主键类型必须String

    @TableField

    字段映射,value属性是数据库字段名

    exist属性表示是否是数据库字段

    select属性表示是否查询该字段

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

    @Data
    @TableName(value = "user")
    public class UserEntity {
    
        @TableId(value = "id",type = IdType.ASSIGN_ID)
        private Long id;
        @TableField(value = "name")
        private String userName;
        @TableField(value = "age")
        private Integer age;
        @TableField(exist = false)
        private String gender;
        //驼峰和数据库下划线会自动转换
        @TableField(fill = FieldFill.INSERT)
        private Date createTime;
        @TableField(fill = FieldFill.INSERT_UPDATE)
        private Date updateTime;
    }
    

    fill填充的值需要创建处理器赋值

    package com.example.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作为条件,满足条件才修改

    添加配置类:

    package com.example.mybatisplus.config;
    
    import com.baomidou.mybatisplus.extension.plugins.OptimisticLockerInterceptor;
    import org.springframework.context.annotation.Bean;
    import org.springframework.context.annotation.Configuration;
    
    @Configuration
    public class MybatisPlusConfig {
    
        @Bean
        public OptimisticLockerInterceptor optimisticLockerInterceptor(){
            return new OptimisticLockerInterceptor();
        }
    }
    

    @EnumValue

    1.通过注解方式完成枚举类映射

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

    枚举类:(加@EnumValue注释)

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

    实体类:加枚举类型

    @Data
    @TableName(value = "user")
    public class UserEntity {
    
        @TableId(value = "id",type = IdType.ASSIGN_ID)
        private Long id;
        @TableField(value = "name")
        private String userName;
        @TableField(value = "age")
        private Integer age;
        @TableField(exist = false)
        private String gender;
        //驼峰和数据库下划线会自动转换
        @TableField(fill = FieldFill.INSERT)
        private Date createTime;
        @TableField(fill = FieldFill.INSERT_UPDATE)
        private Date updateTime;
        @Version
        private Integer version;
        private StatusEnum status;
    }
    

    application.yml

    mybatis-plus:
      configuration:
        log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
      #枚举包扫描  
      type-enums-package: com.example.mybatisplus.enums
    

    这几步配置后,查询出来的结果如下:

    2.实现接口方式实现枚举类映射

    package com.example.mybatisplus.enums;
    
    import com.baomidou.mybatisplus.annotation.EnumValue;
    import com.baomidou.mybatisplus.core.enums.IEnum;
    
    public enum AgeEnum implements IEnum<Integer> {
        ONE(1,"一岁"),
        TWO(2,"两岁");
    
        @EnumValue
        private Integer code;
        private String msg;
    
        AgeEnum(Integer code, String msg) {
            this.code = code;
            this.msg = msg;
        }
    
        @Override
        public Integer getValue() {
            return this.code;
        }
    }
    

    @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.example.mybatisplus.enums
      global-config:
        db-config:
          logic-not-delete-value: 1
          logic-delete-value: 0
    

    CRUD

    这里的api可以去官网查看

    MyBatis Plus自动生成

    根据数据表生成实体类和Mapper、Service等...

    1. pom依赖
    <dependency>
        <groupId>com.baomidou</groupId>
        <artifactId>mybatis-plus-generator</artifactId>
        <version>3.3.1.tmp</version>
    </dependency>
    <dependency>
        <groupId>org.apache.velocity</groupId>
        <artifactId>velocity</artifactId>
        <version>1.7</version>
    </dependency>
    

    启动类

    package com.example.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");
            dataSourceConfig.setUsername("root");
            dataSourceConfig.setPassword("1qaz@WSX");
            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("niuwang");
            autoGenerator.setGlobalConfig(globalConfig);
            //包信息
            PackageConfig packageConfig = new PackageConfig();
            packageConfig.setParent("com.example.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();
            strategyConfig.setEntityLombokModel(true);
            strategyConfig.setNaming(NamingStrategy.underline_to_camel);
            strategyConfig.setColumnNaming(NamingStrategy.underline_to_camel);
            autoGenerator.setStrategy(strategyConfig);
    
            autoGenerator.execute();
        }
    }
    

    部分表生成:

    strategyConfig.setInclude("user","product");
    
    • 注:该知识点是在B站学习‘楠哥教你学java’的视频中学习到的,大家有兴趣可以去B站大牛站学习
  • 相关阅读:
    2020年. NET Core面试题
    java Context namespace element 'component-scan' and its parser class ComponentScanBeanDefinitionParser are only available on JDK 1.5 and higher 解决方法
    vue 淡入淡出组件
    java http的get、post、post json参数的方法
    vue 父子组件通讯案例
    Vue 生产环境解决跨域问题
    npm run ERR! code ELIFECYCLE
    Android Studio 生成apk 出现 :error_prone_annotations.jar (com.google.errorprone:error) 错误
    记忆解析者芜青【总集】
    LwIP应用开发笔记之十:LwIP带操作系统基本移植
  • 原文地址:https://www.cnblogs.com/niuwang/p/15192894.html
Copyright © 2011-2022 走看看