首页 > 其他分享 >适合新手的12个Mybatis-Plus常用注解

适合新手的12个Mybatis-Plus常用注解

时间:2023-06-22 22:11:57浏览次数:45  
标签:12 public MyBatis 实体类 Plus Mybatis 注解 id

mybatis-plus简介

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

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

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

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

img

常用注解(12个)

1、@MapperScan

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

img

结合代码和图片,小伙伴们估计可以猜出来:注解@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为主键列,否则就会报这样的错误:

img

当使用@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

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

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

img

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

运行结果:

img

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)。

标签:12,public,MyBatis,实体类,Plus,Mybatis,注解,id
From: https://www.cnblogs.com/javaxubo/p/17498436.html

相关文章

  • 学习笔记-第12天-命令合集11
    1.passwd给用户设置密码用户自己给自己设置密码直接:passwd.[root@localhost~]#passwdChangingpasswordforuserroot.Newpassword:BADPASSWORD:Thepasswordisshorterthan8charactersRetypenewpassword:passwd:allauthenticationtokensupdatedsuccessfu......
  • Mybatis理解
    转载自(76条消息)1、mybatis是什么?为什么要用mybatis?_chaizepeng的博客-CSDN博客,持续补充。对于初学者,如果进行mybatis的学习呢?我总结了几点,会慢慢的更新出来。首先大家需要了解mybatis是什么、用mybatis来做什么、为什么要用mybatis、有什么优缺点;当知道了为什么的时候就开始了......
  • MyBatis-Plus公共字段填充
    在实体类的属性上加入@TableField注解,指定自动填充的策略@TableField(fill=FieldFill.INSERT)//插入时填充字段privateLocalDateTimecreateTime;@TableField(fill=FieldFill.INSERT_UPDATE)//插入和更新时填充字段privateLocalDateTimeupdateTim......
  • 12、zabbix-触发器(trigger)-抓取网卡流量阈值
    1、创建监控项为网络上行下载的触发器   ......
  • MONGODB 奇怪12问 switch over
    开头还是介绍一下群,如果感兴趣polardb,mongodb,mysql,postgresql ,redis等有问题,有需求都可以加群群内有各大数据库行业大咖,CTO,可以解决你的问题。最近我们公司的REDISDBA和MONGODBDBA在SWITCHOVER, 我提出了一些问题关于MONGODB的问题,来让两个DBA能更快的融合对方的......
  • apache绑定于127.0.1.1
    Ubuntu下装Apache后,有时候,会绑定的地址为127.0.1.1。即提示信息:apache2:Couldnotreliablydeterminetheserver'sfullyqualifieddomainname,using127.0.1.1forServerName其实只要是127.开头的都一样,都是回环地址。你随便访问一个127.*都访问到的是本机。不过看起来......
  • 荣耀6 Plus 的屏幕大小pt计算方法
    使用gomobile检测华为荣耀6Plus的屏幕大小为: 1080*1776px;  162pt*266.40pt; 每pt像素个数:6.666665个。而实际的数据是:主屏尺寸:5.5英寸; 分辨率 1920*1080像素;像素密度401ppi。实测1776,而不是1920是因为华为荣耀有一个可隐藏的按钮区,实测时按钮区......
  • Mybatis 开发使用总结2023
    Mybatis一。入门1.mybatis:是一款优秀的持久化框架,用于简化JDBC的开发。2.JDBC3.数据库连接池4.lombok二。mybatis的基础增删改查操作1.驱动:com.mysql.cj.jdbc.Driver2.url:jdbc:mysql://localhost:3306/mybatis3.user:root4.password:123三。mybatis动态sql1.创建sp......
  • day111 - mybatis中的参数问题
    mybatis中的参数问题样例:根据用户名查询用户信息mybatis中获取参数值的方式有两种#{}和${}1.若mapper接口方法的参数为单个的字面量类型UsergetUserByUsername(Stringusername); <!--UsergetUserByUsername(Stringusername);--><selectid="getUserByUsername"re......
  • Oracle19C PDB中普通用户可以通过sqlplus scott/tiger连接吗
     Oracle19CPDB中普通用户可以通过sqlplusscott/tiger连接吗 先说结论,目前我还没找到方式。研究了挺久,通过百度,通过mos上搜索,也想通过触发器来实现,发现都不行。 先说sys用户,是可以的。通过设置ORACLE_PDB_SID这个环境变量,可以实现sys直接登录后连接到指定的PDB上。[o......