mybatis-plus

简介: mybatis-plus详细学习资料

 mybatis-plus 简介

MyBatis-Plus(简称 MP)是一个 MyBatis 的增强工具,在 MyBatis 的基础上只做增强不做改变,为简化开发、提高效率而生。

愿景是成为 MyBatis 最好的搭档!

官方地址:https://baomidou.com/

文档发布地址:https://baomidou.com/pages/24112f

image.gif编辑

常用注解(12 个)

1、@MapperScan

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

复制代码

image.gif编辑

结合代码和图片,小伙伴们估计可以猜出来:注解 @MapperScan 是用来扫描 mapper 的映射文件的,只有使用它之后,我们才能够使用官方提供的各种方法。

2、@Mapper

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

复制代码

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

3、@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")就可以了

4、@Data

这个注解也极大的简化了我们的开发,为什么这样说呢?是因为,使用这个注解,就可以省略 getter()、setter()、toString()、重写该类的 equals()和 hashCode()方法,这样一听,是不是很吃惊呢?

5、@TableId

MyBatis-Plus 在实现增删改查时,会默认将 id 作为主键列,并在插入数据时,默认基于雪花算法的策略生成 id,这个雪花算法在这里就不明讲了。

当使用 @TableId(value = "id")语句时,若实体类和表中表示主键的不是 id,而是其他字段,例如代码中的 uid,MyBatis-Plus 会自动识别 uid 为主键列,否则就会报这样的错误:

image.gif编辑

当使用 @TableId(value = "id",type = IdType.AUTO)语句时,代表着使用数据库的自增策略,注意,该类型请确保数据库设置了 id 自增,否则无效!

当然呢,@TableId 的功能,也可以写在 application.yml 配置文件中,配置如下:

mybatis-plus:
global-config:
banner: false
db-config:
# 配置MyBatis-Plus操作表的默认前缀
table-prefix: "t_"
# 配置MyBatis-Plus的主键策略
id-type: auto
# 配置MyBatis日志
configuration:
log-impl: org.apache.ibatis.logging.stdout.StdOutImpl

复制代码

6、@TableField

MyBatis-Plus 在执行 SQL 语句时,要保证实体类中的属性名和表中的字段名一致,否则就会报错,语句 @TableField(value = "is_deleted")代表着让数据库表中 is_deleted 与实体类中 isDeleted 字段名一样。

注意:

    • 若实体类中的属性使用的是驼峰命名风格,而表中的字段使用的是下划线命名风格
      例如实体类属性 userName,表中字段 user_name,此时 MyBatis-Plus 会自动将下划线命名风格转化为驼峰命名风格
    • 若实体类中的属性和表中的字段不满足上述条件,例如实体类属性 name,表中字段 username,此时需要在实体类属性上使用 @TableField("username")设置属性所对应的字段名

    7、@TableLogic

    在讲这个注解之前,我们先认识一下逻辑删除。

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

      image.gif编辑

      在我的数据库表中,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;
        }
        }

        复制代码

        8、@Configuration

        这个注解相信大家已经见过很多次了,可能都有些不耐烦了,但是我还是要在这里提一下,使用该注解的类代表着是一个配置类,该类本身也是一个 bean。也可以在该类中加载 bean,使用 @Bean 注解

        9、@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());
        }

        复制代码

        运行结果:

        image.gif编辑

        10、@Param

        当我使用自定义的分页语句时:

        @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>

        复制代码

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

        11、@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 版本不对,则更新失败。

        12、@EnumValue

        @Getter
        public enum SexEnum {
        MALE(1, "男"),
        FEMALE(2, "女");
        @EnumValue
        private Integer sex;
        private String sexName;
        SexEnum(Integer sex, String sexName) {
        this.sex = sex;
        this.sexName = sexName;
        }
        }
        mybatis-plus:
        global-config:
        banner: false
        db-config:
        # 配置MyBatis-Plus操作表的默认前缀
        table-prefix: "t_"
        # 配置MyBatis-Plus的主键策略
        id-type: auto
        # 配置MyBatis日志
        configuration:
        log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
        # 配置类型别名所对应的包
        type-aliases-package: cabbage.pojo
        # 配置扫描通用枚举
        type-enums-package: cabbage.pojo

        复制代码

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

        Parameters: Enum(String), 20(Integer), 1(Integer)

        目录
        相关文章
        |
        6月前
        |
        缓存 Java 数据库连接
        Mybatis
        Mybatis
        39 0
        |
        6月前
        |
        SQL Java 数据库连接
        |
        XML Java 数据库连接
        |
        4月前
        |
        SQL Java 数据库连接
        Mybatis(四)
        Mybatis(四)
        37 0
        |
        6月前
        |
        SQL Java 数据库连接
        MyBatis
        MyBatis
        60 0
        |
        11月前
        |
        Java 数据库连接 数据库
        Mybatis及Mybatis-Plus使用
        Mybatis及Mybatis-Plus使用
        762 2
        Mybatis及Mybatis-Plus使用
        |
        SQL Java 关系型数据库
        mybatis plus很好,但是我被它坑了!
        作者今天在开发一个后台发送消息的功能时,由于需要给多个用户发送消息,于是使用了 mybatis plus 提供的 saveBatch() 方法,在测试环境测试通过上预发布后,测试反应发送消息接口很慢得等 5、6 秒,于是我就登录预发布环境查看执行日志,发现是 mybatis plus 提供的 saveBatch() 方法执行很慢导致,于是也就有了本篇文章。
        67 1
        |
        SQL Java 数据库连接
        14MyBatis - MyBatis介绍
        14MyBatis - MyBatis介绍
        41 0
        |
        SQL Java 数据库连接
        MyBatis(下)
        MyBatis(下)
        |
        SQL XML 缓存
        Mybatis详解(1)
        你好看官,里面请!今天笔者讲的是Mybatis详解(1)。不懂或者觉得我写的有问题可以在评论区留言,我看到会及时回复。 注意:本文仅用于学习参考,不可用于商业用途,如需转载请跟我联系。
        241 2