03MyBatis-Plus中的常用注解
常用注解
@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;@TableLogicprivate 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=0int 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=0List<User> list = userMapper.selectList(null);list.forEach(System.out::println);
}
相关文章:
03MyBatis-Plus中的常用注解
常用注解 TableName MyBatis-Plus根据BaseMapper中指定的泛型(实体类型名)确定数据库中操作的表,如果根据实体类型名找不到数据库中对应的表则会报表不存在异常 //向表中插入一条数据 Test public void testInsert(){User user new User(null, "张三", 23, "…...
Android 修复在 Settings 首页,按键盘方向键逐个单选
Android 修复在 Settings 首页,按键盘方向键逐个单选 问题现象问题分析解决办法 问题现象 在 Settings 主界面,按键盘方向键上下会直接整个选中,无法单条选中变色,而在二级页面中按方向键上下是正常的。 没有遥控器可以通过 adb…...
SpringMvc第六战-【SpringMvcJSON返回异常处理机制】
前言: 小编讲述了:JSR303的概念,应用场景和在具体实例的使用;和拦截器的应用 今天小编来讲述的为cJSON返回&异常处理机制,json返回就不用多说,毕竟大部分数据都是通过Json来传递数据的,异…...
idea-Tabnine
教程地址 Code Faster with AI Code Completions | Tabnine...
联通面试题
一、GC 1.1、目标 GC的主要作用是自动识别和释放不再使用的对象,回收其所占用的内存,以防止内存泄漏和内存溢出的问题。 1.2、如何实现 1.2.1、标记阶段 GC从根对象(如线程栈中的引用、静态变量等)开始,通过可达性…...
[计组03]进程详解2
目录 应用程序 系统调用 驱动 软件 再看进程 进程管理 如何管理 ? 创建一个进程 注意 PCB 文件描述表 进程相关重点 为什么有进程调度 虚拟空间地址 这次我们从更加详细全面的角度看一下进程在计算机中体系中的展现 应用程序 应用程序 调动 系…...
使用redis+lua通过原子减解决超卖问题【示例】
系列文章目录 一、SpringBoot连接MySQL数据库实例【tk.mybatis连接mysql数据库】 二、SpringBoot连接Redis与Redisson【代码】 三、SpringBoot整合WebSocket【代码】 四、使用redislua通过原子减解决超卖问题【示例】 五、SpringBoot整合Elasticsearch【代码示例】 文章目录 系…...
WebFlux异常处理:onErrorReturn和onErrorResume
1 缘起 最近在学习WebFlux, 处理异常时遇到些问题,比如,Java直接抛出的异常无法直接被onErrorReturn和onErrorResume捕获, 但是,在map或者flatMap等方法之后的异常又可以直接被捕获, 于是,进行…...
《动手学深度学习 Pytorch版》 4.5 权重衰减
4.5.1 范数与权重衰减 整节理论,详见书本。 4.5.2 高维线性回归 %matplotlib inline import torch from torch import nn from d2l import torch as d2l# 生成一些数据,为了使过拟合效果更明显,将维数增加到 200 并使用一个只包含 20 个样…...
数据脱敏的风险量化评估介绍
1、背景介绍 当前社会信息化高速发展,网络信息共享加速互通,数据呈现出规模大、流传快、类型多以及价值密度低的特点。人们可以很容易地对各类数据实现采集、发布、存储与分析,然而一旦带有敏感信息的数据被攻击者获取将会造成个人隐私的严重…...
SpringCloudGateway网关实战(三)
SpringCloudGateway网关实战(三) 上一章节我们讲了gateway的内置过滤器Filter,本章节我们来讲讲全局过滤器。 自带全局过滤器 在实现自定义全局过滤器前, spring-cloud-starter-gateway依赖本身就自带一些全局过滤器࿰…...
08在MyBatis-Plus中配置多数据源
配置多数据源 模拟多库场景 适用于多种场景: 多库(操作的表分布在不同数据库当中),读写分离(有的数据库负责查询的功能,有的数据库负责增删该的功能),一主多从,混合模式等 第一步: 模拟多库,在mybatis_plus数据库中创建user表,在mybatis_plus_1数据库中创建product表 --创建…...
Centos8安装docker并配置Kali Linux图形化界面
鉴于目前网上没有完整的好用的docker安装kali桌面连接的教程,所以我想做一个。 准备工作 麻了,这服务器供应商提供的镜像是真的纯净,纯净到啥都没有。 问题一:Centos8源有问题 Error: Failed to download metadata for repo ap…...
游戏开发初等数学基础
凑数图() 立体图形面积体积 1. 立方体(Cube): 表面积公式: 6 a 2 6a^2 6a2 (其中 a a a 是边长)。体积公式: a 3 a^3 a3 (其中 a a a 是边长)。 2. 球体(Sphere): 表面积公…...
svg图片代码data:image/svg+xml转png图片方法
把代码保存为html格式的文件中,用浏览器访问,即可右键保存 从AI软件或其它网站得到svg图片代码后,把他复制到下面源码上 注意:src""图片地址中,一些参数的含义 d‘这里是图片代码数据’ viewBox是图片显示区域,宽,高等 fill%23000000’这里表示颜色 ,后面6位0表示黑色…...
解决问题:Replace `‘vue‘;⏎` with `“vue“;`
使用vscode写vue文件的问题: Replace vue;⏎ with "vue"; error Replace v-model:value"xxx"placeholder"inputsearch prettier/prettier 7:38 error Insert ⏎ potentially fixable with the --fix option 原因:格式问题&a…...
ThinkPHP 5.0通过composer升级到5.1,超级简单
事情是这样的,我实现一个验证码登录的功能,但是这个验证码的包提示tp5的版本可以是5.1.1、5.1.2、5.1.3。但我使用的是5.0,既然这样,那就升个级呗,百度了一下,结果发现大部分都是讲先备份application和修改…...
计算机竞赛 多目标跟踪算法 实时检测 - opencv 深度学习 机器视觉
文章目录 0 前言2 先上成果3 多目标跟踪的两种方法3.1 方法13.2 方法2 4 Tracking By Detecting的跟踪过程4.1 存在的问题4.2 基于轨迹预测的跟踪方式 5 训练代码6 最后 0 前言 🔥 优质竞赛项目系列,今天要分享的是 🚩 深度学习多目标跟踪 …...
一文了解大模型工作原理——以ChatGPT为例
文章目录 写在前面1.Tansformer架构模型2.ChatGPT原理3.提示学习与大模型能力的涌现3.1 提示学习3.2 上下文学习3.3 思维链 4.行业参考建议4.1 拥抱变化4.2 定位清晰4.3 合规可控4.4 经验沉淀 写在前面 2022年11月30日,ChatGPT模型问世后,立刻在全球范围…...
CPP-Templates-2nd--第十九章 萃取的实现 19.7---
目录 19.7 其它的萃取技术 19.7.1 If-Then-Else 19.7.2 探测不抛出异常的操作 19.7.3 萃取的便捷性(Traits Convenience) 别名模板和萃取(Alias Templates And Traits) 变量模板和萃取(Variable Templates and Traits&…...
聊聊 Pulsar:Producer 源码解析
一、前言 Apache Pulsar 是一个企业级的开源分布式消息传递平台,以其高性能、可扩展性和存储计算分离架构在消息队列和流处理领域独树一帜。在 Pulsar 的核心架构中,Producer(生产者) 是连接客户端应用与消息队列的第一步。生产者…...
解锁数据库简洁之道:FastAPI与SQLModel实战指南
在构建现代Web应用程序时,与数据库的交互无疑是核心环节。虽然传统的数据库操作方式(如直接编写SQL语句与psycopg2交互)赋予了我们精细的控制权,但在面对日益复杂的业务逻辑和快速迭代的需求时,这种方式的开发效率和可…...
电脑插入多块移动硬盘后经常出现卡顿和蓝屏
当电脑在插入多块移动硬盘后频繁出现卡顿和蓝屏问题时,可能涉及硬件资源冲突、驱动兼容性、供电不足或系统设置等多方面原因。以下是逐步排查和解决方案: 1. 检查电源供电问题 问题原因:多块移动硬盘同时运行可能导致USB接口供电不足&#x…...
论文浅尝 | 基于判别指令微调生成式大语言模型的知识图谱补全方法(ISWC2024)
笔记整理:刘治强,浙江大学硕士生,研究方向为知识图谱表示学习,大语言模型 论文链接:http://arxiv.org/abs/2407.16127 发表会议:ISWC 2024 1. 动机 传统的知识图谱补全(KGC)模型通过…...
ElasticSearch搜索引擎之倒排索引及其底层算法
文章目录 一、搜索引擎1、什么是搜索引擎?2、搜索引擎的分类3、常用的搜索引擎4、搜索引擎的特点二、倒排索引1、简介2、为什么倒排索引不用B+树1.创建时间长,文件大。2.其次,树深,IO次数可怕。3.索引可能会失效。4.精准度差。三. 倒排索引四、算法1、Term Index的算法2、 …...
使用Matplotlib创建炫酷的3D散点图:数据可视化的新维度
文章目录 基础实现代码代码解析进阶技巧1. 自定义点的大小和颜色2. 添加图例和样式美化3. 真实数据应用示例实用技巧与注意事项完整示例(带样式)应用场景在数据科学和可视化领域,三维图形能为我们提供更丰富的数据洞察。本文将手把手教你如何使用Python的Matplotlib库创建引…...
网站指纹识别
网站指纹识别 网站的最基本组成:服务器(操作系统)、中间件(web容器)、脚本语言、数据厍 为什么要了解这些?举个例子:发现了一个文件读取漏洞,我们需要读/etc/passwd,如…...
08. C#入门系列【类的基本概念】:开启编程世界的奇妙冒险
C#入门系列【类的基本概念】:开启编程世界的奇妙冒险 嘿,各位编程小白探险家!欢迎来到 C# 的奇幻大陆!今天咱们要深入探索这片大陆上至关重要的 “建筑”—— 类!别害怕,跟着我,保准让你轻松搞…...
4. TypeScript 类型推断与类型组合
一、类型推断 (一) 什么是类型推断 TypeScript 的类型推断会根据变量、函数返回值、对象和数组的赋值和使用方式,自动确定它们的类型。 这一特性减少了显式类型注解的需要,在保持类型安全的同时简化了代码。通过分析上下文和初始值,TypeSc…...
第7篇:中间件全链路监控与 SQL 性能分析实践
7.1 章节导读 在构建数据库中间件的过程中,可观测性 和 性能分析 是保障系统稳定性与可维护性的核心能力。 特别是在复杂分布式场景中,必须做到: 🔍 追踪每一条 SQL 的生命周期(从入口到数据库执行)&#…...
