@TableId

作用:用于设置id的生成策略,即设置id是如何生成的

  1. package com.baomidou.mybatisplus.annotation;
  2. import lombok.Getter;
  3. /**
  4. * 生成ID类型枚举类
  5. *
  6. * @author hubin
  7. * @since 2015-11-10
  8. */
  9. @Getter
  10. public enum IdType {
  11. /**
  12. * 数据库ID自增
  13. */
  14. AUTO(0),
  15. /**
  16. * 该类型为未设置主键类型
  17. */
  18. NONE(1),
  19. /**
  20. * 用户输入ID
  21. * <p>该类型可以通过自己注册自动填充插件进行填充</p>
  22. */
  23. INPUT(2),
  24. /* 以下3种类型、只有当插入对象ID 为空,才自动填充。 */
  25. /**
  26. * 全局唯一ID (idWorker)
  27. */
  28. ID_WORKER(3),
  29. /**
  30. * 全局唯一ID (UUID)
  31. */
  32. UUID(4),
  33. /**
  34. * 字符串全局唯一ID (idWorker 的字符串表示)
  35. */
  36. ID_WORKER_STR(5);
  37. private final int key;
  38. IdType(int key) {
  39. this.key = key;
  40. }
  41. }

用法举例:

@Data 
@NoArgsConstructor
@AllArgsConstructor 
@TableName("tb_user") 
public class User { 
    @TableId(type = IdType.AUTO) //指定id类型为自增长 
    private Long id; 
    private String userName; 
    private String password; 
    private String name; 
    private Integer age; 
    private String email; 
}


@TableField

在MP中通过@TableField注解可以指定字段的一些属性,常常解决的问题有两个:
1.对象中的属性名和表中的字段名不一致(非驼峰)
2.对象中的属性字段在表中不存在

用法举例:

@Data
@NoArgsConstructor
@AllArgsConstructor 
@TableName("tb_user")
public class User{
    private Integer id;
    private String userName;

    @TableField(select = false)//不希望password出现在查询结果中
    private String passWord;

    private String name;
    private Integer age;

    @TableField(value = "email")//解决字段名不一致
    private String mail;

    @TableField(exist = false)//指明该属性在数据库表的字段中不存在
    private String address;
}

@MapperScan

@SpringBootApplication
@MapperScan("com.cabbage.mapper")
public class Mybatisplus01Application {
    public static void main(String[] args) {
        SpringApplication.run(Mybatisplus01Application.class, args);
    }
}

@Mapper

@Mapper
@Repository
public interface UserMapper extends BaseMapper<User> {
    /**
     * 根据id查询到map集合
     * @param id
     * @return
     */
    Map<String,Object> selectMapById(Long id);
}

@Mapper作用于数据库中的实体类之后,就不需要再次写注解@MapperScan,他们之间的区别就是@Mapper只能映射一个实体类,而@MapperScan可以映射整个包下的实体类,范围更广,操作更简便。

@TableName

@Data
//设置实体类对应的表名
@TableName("t_user")
public class User {
    @TableId(value = "id",type = IdType.AUTO)
    private Long uid;

    @TableField(value = "name")
    private String name;

    private Integer age;
    private String email;

    @TableField(value = "is_deleted")
    @TableLogic
    private Integer isDeleted;
}

当实体类类型的类名和要操作的表的表名不一致时,就会报错,而注解@TableName就可以帮助我们解决这个问题。我的数据库表名是t_user,实体类名是User,只需要在类名上写入@TableName(“t_user”)就可以了

@Data

@TableId

当使用@TableId(value = “id”)语句时,若实体类和表中表示主键的不是id,而是其他字段,例如代码中的uid,MyBatis-Plus会自动识别uid为主键列,否则就会报这样的错误: 图片.png
当使用@TableId(value = “id”,type = IdType.AUTO)语句时,代表着使用数据库的自增策略,注意,该类型请确保数据库设置了id自增,否则无效!

@TableLogic

  • 物理删除:真实删除,将对应数据从数据库中删除,之后查询不到此条被删除的数据
  • 逻辑删除:假删除,将对应数据中代表是否被删除字段的状态修改为“被删除状态”,之后在数据库中仍旧能看到此条数据记录
  • 使用场景:可以进行数据恢复

    在我的数据库表中,is_delete为1时,代表着逻辑上的删除,is_delete为0时,表示没有删除
    注解@TableLogic的使用,就代表着该类中的属性是逻辑删除的属性

注意:
在测试逻辑删除的时候,真正执行的是修改UPDATE t_user SET is_deleted=1 WHERE id=? AND is_deleted=0
测试查询功能,被逻辑删除的数据默认不会被查询SELECT id,username AS name,age,email,is_deleted FROM t_user WHERE is_deleted=0
在学习mybatis-plus分页插件的时候,我们需要配置拦截器,看代码:

@Configuration
public class MybatisPlusConfig {
    @Bean
    public MybatisPlusInterceptor mybatisPlusInterceptor() {
        MybatisPlusInterceptor interceptor = 
                new MybatisPlusInterceptor();

        interceptor.addInnerInterceptor
                (new PaginationInnerInterceptor(DbType.MYSQL));
        return interceptor;
    }
}

@Configuration

使用该注解的类代表着是一个配置类,该类本身也是一个bean。也可以在该类中加载bean,使用@Bean注解

@Bean

注解@Bean表示的是将方法中的对象注入到spring容器中,以后方便于之后在容器中拿出对象,简化开发。常与@Configuration注解一起使用,相信大家也经常见到此注解,这里也不多讲了~
既然讲到了分页插件,那就简单的看看他们的基本使用方法吧

 @Test
    void test01() {
        //设置分页参数
        Page<User> page = new Page<>(1, 3);
        userMapper.selectPage(page, null);
        //获取分页数据
        List<User > list = page.getRecords();
        list.forEach(System.out::println);
        System.out.println("当前页:" + page.getCurrent());
        System.out.println("每页显示的条数:" + page.getSize());
        System.out.println("总记录数:" + page.getTotal());
        System.out.println("总页数:" + page.getPages());
        System.out.println("是否有上一页:" + page.hasPrevious());
        System.out.println("是否有下一页:" + page.hasNext());
    }

@Param

@Param是MyBatis所提供的,作为Dao层的注解,作用是用于传递参数,从而可以与SQL中的的字段名相对应,简化了开发~

@Mapper
@Repository
public interface UserMapper extends BaseMapper<User> {
    /**
     * 通过年龄查询用户信息并分页
     * @param page
     * @param age
     * @return
     */
    Page<User> selectPageByAge( Page<User> page, @Param("age") Integer age);
}


<mapper namespace="cabbage.mapper.UserMapper">
    <select id="selectPageByAge" resultType="User">
        SELECT id,`name`,age,email FROM `user` where age > #{age}
    </select>
</mapper>

@Version

在我们学习乐观锁的时候,肯定见过如下代码:

@Data
@TableName("t_product")
public class Product {
    private Long id;
    private String name;
    private Integer price;
    @Version
    private Integer version;
}
@Configuration
public class MybatisPlusConfig {
    @Bean
    public MybatisPlusInterceptor mybatisPlusInterceptor() {
        MybatisPlusInterceptor interceptor =
                new MybatisPlusInterceptor();
        //分页插件
        interceptor.addInnerInterceptor
                (new PaginationInnerInterceptor(DbType.MYSQL));
        //乐观锁插件
        interceptor.addInnerInterceptor(new OptimisticLockerInnerInterceptor());
        return interceptor;
    }
}

这个注解@Version就是实现乐观锁的重要注解,当要更新数据库中的数据时,例如价格,version 就会加 1,如果where语句中的version版本不对,则更新失败。

@EnumValue

注解@EnumValue所标识的属性值会存储到数据库,相当于语句INSERT INTO t_user ( username, age, sex ) VALUES ( ?, ?, ? ) Parameters: Enum(String), 20(Integer), 1(Integer)