03MyBatis-Plus中的常用注解

2023-09-16 19:51:34

常用注解

@TableName

MyBatis-Plus根据BaseMapper中指定的泛型(实体类型名)确定数据库中操作的表,如果根据实体类型名找不到数据库中对应的表则会报表不存在异常

//向表中插入一条数据
@Test
public void testInsert(){
    User user = new User(null, "张三", 23, "zhangsan@atguigu.com");
    //INSERT INTO user (id, name, age, email) VALUES ( ?, ?, ?, ? )
    int result = userMapper.insert(user);
    System.out.println("受影响行数:"+result);
    //获取插入数据的主键id为1475754982694199298
    //MyBatis-Plus在实现插入数据时,如果我们没有指定id,他默认基于雪花算法的策略生成一个id插入到表中
    System.out.println("id自动获取:"+user.getId());
}

局部配置: 在实体类类型上添加@TableName("t_user")用来设置实体类对应的表名

@Data
@TableName("t_user")
public class User{
    private Long id;
    private String name;
    private Integer age;
    private String email;
    public User() {}
}

全局配置: 实际开发中实体类所对应的表都有固定的前缀(例如t_ 或tbl_),可以使用MyBatis-Plus提供的全局配置属性为所有实体类所对应的表名设置默认的前缀

mybatis-plus:
  configuration:
    log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
  # 设置MyBatis-Plus的全局配置
  global-config:
    db-config:
      # 设置实体类所对应的表的统一前缀
      table-prefix: t_

@TableId的value和type属性

MyBatis-Plus在实现CRUD时只会将实体类id属性对应的id字段作为主键,也就是说在插入数据时基于雪花算法的策略生成的值只会赋值给表中的id字段

测试将实体类中的id属性改为uid以及表中的id字段也改为uid(此时uid属性对应的uid字段对于MyBatis-Plus来说就是一个普通字段)

//向表中插入一条数据
@Test
public void testInsert(){
    User user = new User(null, "张三", 23, "zhangsan@atguigu.com");
    // INSERT INTO user (name, age, email) VALUES ( ?, ?, ?)
    // uid字段对于MyBatis-Plus来说就是一个普通字段,如果我们没有指定值默认就向数据表插入的就为null
    // MyBatis-Plus不会基于雪花算法为uid字段赋值
    int result = userMapper.insert(user);
    System.out.println("受影响行数:"+result);
    System.out.println("id自动获取:"+user.getId());
}

在实体类的属性上添加@TableId注解将该属性对应的字段作为主键字段(根据属性名和字段名的映射关系确定对应的字段名)

  • 如果实体类的属性名和数据库中的主键字段名称不同,可以使用@TableId注解的value属性指定作为主键的字段
@Data
public class User {
    @TableId// 将uid属性对应的uid字段作为主键字段
    private Long uid;
    
    @TableId("uid")//将id属性对应的uid字段作为主键
    private Long id;
    private String name;
    private Integer age;
    private String email;
}

//向表中插入一条数据
@Test
public void testInsert(){
    User user = new User(null, "张三", 23, "zhangsan@atguigu.com");
    //INSERT INTO user (uid,name, age, email) VALUES ( ?, ?, ?,?)
    int result = userMapper.insert(user);
    System.out.println("受影响行数:"+result);
    System.out.println("id自动获取:"+user.getId());
}

@TableId的type属性是IdType枚举类型用来设置主键的生成策略

  • 注意主键的生成策略只是辅助,如果我们自己手动给实体类的主键属性设置了值那么主键生成策略就会不起作用
描述
IdType.ASSIGN_ID(默认值)先基于雪花算法的策略生成数据然后为实体类的id属性赋值
此时再向表中插入数据时主键id字段已经有了值,所以即使数据库的id字段设置了自增也不起作用
IdType.AUTO使用数据库主键字段的自增策略即不用给主键字段赋值
不再基于雪花算法为实体类的id属性赋值,此时向数据库中插入数据时id字段没有值所以要求数据库的主键字段必须设置自增属性

局部配置: 在实体类的属性上添加@TableId注解指定type属性设置主键的生成策略

@Data
public class User {
    @TableId(value="uid",type = IdType.AUTO)
    private Long id;
    private String name;
    private Integer age;
    private String email;
}
//向表中插入一条数据
@Test
public void testInsert(){
    User user = new User(null, "张三", 23, "zhangsan@atguigu.com");
    //INSERT INTO user (name, age, email) VALUES ( ?, ?, ?,?)
    //采用主键自动递增策略后MyBatis-Plus就不会再通过雪花算法为实体类的id属性赋值然后插入数据库中
    int result = userMapper.insert(user);
    System.out.println("受影响行数:"+result);
    System.out.println("id自动获取:"+user.getId());
}

全局配置: 使用MyBatis-Plus提供的全局配置设置统一的主键生成策略

mybatis-plus:
  configuration:
    log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
  # 设置MyBatis-Plus的全局配置
  global-config:
    db-config:
      # 设置实体类所对应的表的统一前缀
      table-prefix: t_
      # 设置统一的主键生成策略
      id-type: auto 

@TableField

在实体类属性上使用@TableField,表示当前属性对应的字段为一个普通字段(默认属性名就是表中的字段名)

  • 如果实体类的属性名和表中的字段名不一致,可以使用@TableField的value属性指定属性对应的普通字段名
  • 若实体类中的属性使用的是驼峰命名风格而表中的字段使用的是下划线命名风格, 此时MyBatis-Plus会自动将下划线命名风格转化为驼峰命名风格
@Data
public class User {
    private Long id;
    //userName对应的SQL语句INSERT INTO user (id, user_name, age, email ) VALUES ( ?, ?, ?, ? )
    //name对应的SQL语句INSERT INTO user (id, name, age, email ) VALUES ( ?, ?, ?, ? )
    @TableField("user_name")
    private String userName;
    private Integer age;
    private String email;
}
//向表中插入一条数据
@Test
public void testInsert(){
    User user = new User(null, "张三", 23, "zhangsan@atguigu.com");
    //
    int result = userMapper.insert(user);
    System.out.println("受影响行数:"+result);
    System.out.println("id自动获取:"+user.getId());
}

@TableLogic

数据库表中的删除分为物理删除和逻辑删除两种

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

第一步: 在数据库中创建逻辑删除字段is_deleted并设置默认值为0(0表示该记录处于未删除状态,1表示已删除状态)

在这里插入图片描述

第二步: 在实体类中添加逻辑删除属性

@Data
public class User {
    @TableId("uid")
    private Long id;
    @TableFiled("user_name")
    private String name;
    private Integer age;
    private String email;
    @TableLogic
    private Integer isDeleted;  
}

第三步测试逻辑删除: 逻辑删除数据后底层真正执行的是修改,查询数据时被逻辑删除的数据默认也不会被查询到

//通过多个id批量删除
@Test
public void testDeleteBatchIds(){
    List<Long> idList = Arrays.asList(1L, 2L, 3L);
    //物理删除执行的SQL: DELETE FROM user WHERE uid IN ( ? , ? , ? )
    //逻辑删除真正执行的是修改: UPDATE t_user SET is_deleted=1 WHERE uid=? AND is_deleted=0
    int result = userMapper.deleteBatchIds(idList);
    System.out.println("受影响行数:"+result);
}

//查询所有数据,返回一个list集合
@Test
public void testSelectList(){
    //直接查询:SELECT uid As id,user_name As name,age,email FROM user
    //查询数据被逻辑删除的数据默认不会被查询:SELECT uid As id,user_name As name,age,email ,is_deleted FROM t_user WHERE is_deleted=0
    List<User> list = userMapper.selectList(null);
    list.forEach(System.out::println);
}
更多推荐

【Rust 基础篇】Rust动态大小类型:理解动态大小类型与编写安全的代码

导言Rust是一种以安全性和高效性著称的系统级编程语言,其设计哲学是在不损失性能的前提下,保障代码的内存安全和线程安全。在Rust中,动态大小类型(DST)是一种特殊的类型,它的大小在编译时无法确定,需要在运行时根据实际情况进行确定。动态大小类型在Rust中有着重要的应用场景,例如引用类型、trait对象等。本篇博客将

ATECLOUD电源测试软件平台如何测试电源纹波?

电源纹波是影响电源稳定性的重要因素,过大的纹波会导致电源模块的工作效率降低,可能使电源模块直接损坏。使用ATECLOUD碘盐测试软件平台对纹波进行测试,检测其工作情况,以确保其稳定性和性能。电源纹波的产生电源的纹波通俗的来讲就是电源模块电压波动而造成的一种现象。一般情况下电源模块中的纹波都是由交流电经过整流稳压环节之后

开源软件的漏洞响应:应对安全威胁

🌷🍁博主猫头虎带您GotoNewWorld.✨🍁🦄博客首页——猫头虎的博客🎐🐳《面试题大全专栏》文章图文并茂🦕生动形象🦖简单易学!欢迎大家来踩踩~🌺🌊《IDEA开发秘籍专栏》学会IDEA常用操作,工作效率翻倍~💐🌊《100天精通Golang(基础入门篇)》学会Golang语言,畅玩云原生,走遍大

Learned-Based VO 梳理(USTC Paper Reading)

梗概主题:VOinDynamic思路简答介绍SLAM框架,引入VO问题直接从LearnedVO开始,介绍VO问题的相关研究,总结当前研究存在的问题讨论DynamicVO中的相关做法,总结问题,提出想法拓展VO和navigation的关系引入SLAM的全称是SimultanousLocationAndMapping,同步

【软件工程】软件工程之道—《人月神话》读后思考

目录写在前面1图书介绍2读后思考写在前面《人月神话》是一本由弗雷德里克·布鲁克斯(FrederickP.Brooks)所著的计算机科学经典著作。这本书首次出版于1973年,至今仍然被认为是计算机科学领域的重要参考书籍之一。它对我产生了深远的影响。通过作者弗雷德里克·布鲁克斯的深入剖析和丰富的实践经验,我对软件开发项目的

✔ ★ 算法基础笔记(Acwing)(三)—— 搜索与图论(17道题)【java版本】

搜索与图论1.DFS1.排列数字(3分钟)2.n-皇后问题2.BFS(队列)1.走迷宫二刷总结(队列存储一个节点pair<int,int>)三刷总结走过的点标记上距离(既可以记录距离,也可以判断是否走过)★★例题2.八数码二刷总结3.树与图的dfs1.树的重心二刷总结1.如何找根节点?用无向图遍历,则不需要根节点2.把

红与黑(bfs + dfs 解法)(算法图论基础入门)

红与黑问题文章目录红与黑问题前言问题描述bfs解法dfs解法前言献给阿尔吉侬的花束(入门级bfs查找+模版解读+错误示范在之前的博客当中,详细地介绍了这类题目的解法,今天为大家带来一道类似的题目练练手,后续还会更新更有挑战的题目以及更为详细的解析,喜欢的小伙伴可以点个关注啦!问题描述有一间长方形的房子,地上铺了红色、黑

8个很棒的Vue开发技巧

1.路由参数解耦通常在组件中使用路由参数,大多数人会做以下事情。exportdefault{methods:{getParamsId(){returnthis.$route.params.id}}}在组件中使用$route会导致与其相应路由的高度耦合,通过将其限制为某些URL来限制组件的灵活性。正确的做法是通过prop

实现 3D 倒计时器

构建单个倒计时器卡片实现思路从上述的总体效果图来看,单个倒计时器的卡片主要是分为头部为尾部两个部分,所以我们可以采用flex布局来实现整体的布局,并且利用flex布局实现文字内容的布局。具体实现步骤如下:编写HTML结构<divclass="flip_cardflip"><divclass="top">4</div><

openGauss学习笔记-69 openGauss 数据库管理-创建和管理普通表-更新表中数据

文章目录openGauss学习笔记-69openGauss数据库管理-创建和管理普通表-更新表中数据openGauss学习笔记-69openGauss数据库管理-创建和管理普通表-更新表中数据修改已经存储在数据库中数据的行为叫做更新。用户可以更新单独一行、所有行或者指定的部分行。还可以独立更新某个字段,而其他字段则不受

英国8月CPI意外降温,然而加息决定仍悬而未决

KlipC报道:据英国国家统计局公布最新数据显示,8月CPI同比上涨6.7%,低于上月数据,核心CPI增幅低于经济学家的预测。数据公布后,英镑走弱、英债收益率下跌,英镑应声下跌0.5%至5月以来的最弱水平,两年期英债债券收益率下跌至4.298%。KlipC的合伙人AndiD表示:“8月CPI涨幅微降主要原因是食品价格涨

热文推荐