一.MP的原理

mp究竟是如何知道我们需要对哪个表进行操作,并且又是如何知道要操作哪些字段的呢?这是因为mp使用到了反射机制,我们在定义mapper接口时使其继承了BaseMapper接口,并指定了BaseMapper接口泛型为User,因此mp可以通过扫描实体类并基于反射来找到表名为实体类名驼峰转下划线的表,再通过实体类中的字段和表中字段名的约定方式(如果mp遵循相关约定的话就可以找到)来找到其对应的数据库字段。

简单来说,就是通过反射,并且约定大于配置。

那么要使用mp要遵循哪些约定呢?

1.类名驼峰转下划线作为表名。

2.名为id的字段作为主键。

3.变量名驼峰转下划线作为表的字段名。

我们再定义表名和实体类的属性时要保证相互遵循约定,才能一致。

二.常用注解

如果我们没有遵循约定,那么我们该如何使用mp呢?这就要使用到mp为我们提供的注解了,常用的注解有以下几个:

@TableName:当表名不是类名驼峰转下划线时,要在@TableName注解中指定表名。

@TableId:用来指定表中的主键字段信息,mp约定属性名为id的字段作为主键。但是如果不叫id,那么可以通过该注解来手动指定。

特别注意:id字段不仅要指定value属性,还要制定IdType属性,即id的生成方式,目前有三种,AUTO:即由数据库自增长。INPUT:由程序员自己去输入。ASSIGN_ID:随机分配ID,生成方式为雪花算法。

@TableField:用来指定表中的普通字段信息,如果表中的字段名不是变量名驼峰转下划线。那么就在该变量上手动自定表中的字段名。

三.@TableField注解的使用

@TableField注解在使用时的常见场景:

1.成员变量名和数据库名不一致时,要使用@TableField注解来标明。

2.成员变量名以is开头,并且是布尔值的情况下,mp会将is删掉,把剩下的作为变量名,这样就起不到驼峰转下划线的效果了,导致其与数据库中的变量名不一样(mp效果为married,而数据库中为is_married)。因此碰到is开头且类型为布尔类型的成员变量,要在其上加上@TableField注解来指定数据库中的变量名。

3.成员变量名与数据库关键字冲突,如order,这样就需要在mp的@TableField注解中指定出来(@TableField("'order'"))

4.如果某一成员变量不是数据库中的字段,也需要指出来,@TableField(exist = false)

四.代码演示

package com.itheima.mp.domain.po;import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import lombok.Data;import java.time.LocalDateTime;@Data
@TableName("tb_user")
public class User {/*** 用户id*/@TableId(type = IdType.AUTO)private Long id;/*** 用户名*/@TableField("'username'")private String username;/*** 密码*/@TableField(exist = false)private String password;/*** 注册手机号*/private String phone;/*** 详细信息*/private String info;/*** 使用状态(1正常 2冻结)*/private Integer status;/*** 账户余额*/private Integer balance;/*** 创建时间*/private LocalDateTime createTime;/*** 更新时间*/private LocalDateTime updateTime;
}

我们首先测试@TableName注解,数据库表名为tb_user,而实体类名称为User。我们已在实体类上加上了注解。接着我们来测试该方法:

    @Testvoid testQueryByIds() {
//        List<User> users = userMapper.queryUserByIds(List.of(1L, 2L, 3L, 4L));List<User> users = userMapper.selectBatchIds(List.of(1L, 2L, 3L, 4L));users.forEach(System.out::println);}

成功,证明表明不一致时使用@TableName注解。

接着测试@TableId(type = IdType.AUTO),将测试方法中的testInsert方法中设置id语法注释。

主键成功自增。

接着将该注解注释掉。将测试方法中的testInsert方法中设置id语法注释,再来测试。

package com.itheima.mp.mapper;import com.itheima.mp.domain.po.User;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;import java.time.LocalDateTime;
import java.util.List;@SpringBootTest
class UserMapperTest {@Autowiredprivate UserMapper userMapper;@Testvoid testInsert() {User user = new User();
//        user.setId(5L);user.setUsername("Lucy");user.setPassword("123");user.setPhone("18688990011");user.setBalance(200);user.setInfo("{\"age\": 24, \"intro\": \"英文老师\", \"gender\": \"female\"}");user.setCreateTime(LocalDateTime.now());user.setUpdateTime(LocalDateTime.now());
//        userMapper.saveUser(user);    引入了mybatis-plus后,很多操作即可简化,直接调用mp提供的现成方法即可userMapper.insert(user);}@Testvoid testSelectById() {
//        User user = userMapper.queryUserById(5L);User user = userMapper.selectById(5L);System.out.println("user = " + user);}@Testvoid testQueryByIds() {
//        List<User> users = userMapper.queryUserByIds(List.of(1L, 2L, 3L, 4L));List<User> users = userMapper.selectBatchIds(List.of(1L, 2L, 3L, 4L));users.forEach(System.out::println);}@Testvoid testUpdateById() {User user = new User();user.setId(5L);user.setBalance(20000);userMapper.updateById(user);
//        userMapper.updateUser(user);}@Testvoid testDeleteUser() {
//        userMapper.deleteUser(5L);userMapper.deleteById(5L);}
}

这样就使用了雪花算法来进行操作,从而生成随机的Long型id。也就是说,不设置IdType,默认使用雪花算法。 

接着测试@TableField("'  '")和@TableField(exist = false),执行以下方法:

@Testvoid testQueryByIds() {
//        List<User> users = userMapper.queryUserByIds(List.of(1L, 2L, 3L, 4L));List<User> users = userMapper.selectBatchIds(List.of(1L, 2L, 3L, 4L));users.forEach(System.out::println);}

成功查询出且字段以‘’标出(防止和sql语句关键字冲突),而且我们标记password为非数据库字段,这里sql语句便没有将password作为查询条件。 

总结

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/pingmian/87211.shtml
繁体地址,请注明出处:http://hk.pswp.cn/pingmian/87211.shtml
英文地址,请注明出处:http://en.pswp.cn/pingmian/87211.shtml

如若内容造成侵权/违法违规/事实不符,请联系英文站点网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

ABAP+记录一个BDC的BUG修改过程

问题背景&#xff1a; 业务顾问反馈在使用BDC 进行MEQ1进行供应商配额时&#xff0c;由于以前录屏时用例只有3行数据&#xff0c;导致现在有5行数据的时候&#xff0c;代码仍然只获取了3行数据进行录入&#xff0c;现在需要更改代码&#xff0c;使其按照实际情况自动调整行数。…

github上传代码步骤(http)

github上传步骤&#xff08;http&#xff09; 之前github上传不了代码&#xff0c;总是报错。后面发现自己用的ssh上传需要秘钥&#xff0c;现在我介绍一个最简单的http上传方法&#xff08;虽然没有ssh安全。。。但简单嘛~&#xff09;&#xff0c;现在我做个例子&#xff0c…

深入理解Nginx-以实际http通信例子改造带ssl配Nginx的实战-优雅草卓伊凡|麻子

深入理解Nginx-以实际http通信例子改造带ssl配Nginx的实战-优雅草卓伊凡|麻子 SSL/TLS在Nginx中的底层实现原理 Nginx的SSL模块架构 Nginx通过ngx_http_ssl_module模块实现SSL/TLS功能&#xff0c;该模块基于OpenSSL库构建。根据Nginx官方文档&#xff0c;SSL模块在Nginx架构…

AT6558R-5N32介绍

作为单芯片SOC方案&#xff0c;AT6558R在片上整合了射频前端、数字基带处理器与32位RISC CPU&#xff0c;并具备电源管理能力。该芯片兼容北斗、GPS、GLONASS三大卫星导航系统&#xff0c;可实现多模协同定位‌。 主要特征 支持 BDS/GPS/GLONASS 多系统联合定位 和单系统独立定…

“对象创建”模式之原型模式

目录 Prototype 原型模式动机 Motivation引例模式定义结构 Structure要点总结 Prototype 原型模式 动机 Motivation 在软件系统中&#xff0c;经常面临着“某些结构复杂的对象”的创建工作&#xff1b;由于需求的变化&#xff0c;这些对象经常面临着剧烈的变化&#xff0c;但…

Tomcat服务概述

前言&#xff1a; 作为Apache软件基金会Jakarta项目的核心成果&#xff0c;Tomcat凭借其轻量级、开源免费的特性&#xff0c;已成为Java Web应用服务的行业基准。它实现了完整的Servlet与JSP规范&#xff0c;通过模块化架构&#xff08;Connector请求处理层与Container业务逻辑…

HarmonyOS应用开发高级认证知识点梳理 (一) 布局与样式

以下是 HarmonyOS 应用开发中 ‌布局与样式‌ 的核心知识点梳理&#xff08;针对高级认证备考&#xff09;&#xff0c;结合官方文档与高频考点&#xff1a; 一、布局系统核心知识点 布局容器类型‌ 线性布局‌&#xff1a;Column&#xff08;纵向&#xff09;、Row&#xf…

【Ragflow】30.离线环境迁移方案

前言 之前的 Ragflow-Plus 在服务器上稳定运行一段时间后&#xff0c;接到任务&#xff0c;要把服务迁移到一台古老的&#xff0c;离线的windows台式机上。 起初认为&#xff0c;下载离线安装包&#xff0c;加载离线镜像&#xff0c;迁移下数据就可以了。 结果坑多得意想不到…

nrf52840蓝牙学习(定时器的应用)

和其他 MCU 处理器一样&#xff0c;在 nrf52840 中定时器的功能是十分强大的。其内部包含了 5 个定时 器 TIMER 模块 :TIMER0 、 TIMER1 、 TIMER2 、 TIMER3 、 TIMER4 &#xff0c;如下表 10.1 所示。 1. 时钟源 首先定时器 TIMER 工作在高频时钟源&#xff08…

【Bluedroid】蓝牙启动之BTM_reset_complete源码解析

当蓝牙控制器完成硬件重置后,协议栈需通过一系列初始化操作恢复各模块状态。本文深入分析BTM_reset_complete核心函数及其调用链,详解 L2CAP 连接清理、安全模块重置、扫描参数恢复、BLE 隐私功能初始化等关键流程,揭示蓝牙设备在重置后如何通过标准化状态恢复确保互操作性、…

containerd 项目主要目录简要说明

containerd 项目结构清晰&#xff0c;核心代码分布在若干主目录下。以下是 client、cmd、core、internal、pkg、plugins 这六个主要包/目录的简要作用说明&#xff1a; 1. client 作用&#xff1a;封装与 containerd 守护进程通信的 Go 客户端 API&#xff0c;主要基于 gRPC。…

有线转无线工具,轻松创建WiFi热点

软件介绍 今天为大家推荐一款实用的无线网络共享工具——MyPublicWiFi。这款软件能够将电脑的有线网络转换为无线WiFi&#xff0c;方便其他设备连接使用。 安装与设置 该软件为安装版程序&#xff0c;安装完成后会自动识别当前电脑的IP地址。用户可在软件界面中自定义设…

Linux下,通过标准I2C驱动读取Sensor ID

sensor型号&#xff1a;OS04L10&#xff0c;sensor引脚以及时钟要先配置好&#xff0c;源码如下&#xff1a; #include <fcntl.h> #include <linux/i2c-dev.h> #include <linux/i2c.h> #include <stdint.h> #include <stdio.h> #include <sy…

人工智能基石:SVM支持向量机全解析(附Python实战)

大家好&#xff01;今天我们来深入探讨支持向量机&#xff08;Support Vector Machine, SVM&#xff09;——这个在​​图像识别、文本分类​​等领域广泛应用的强大算法。既能处理分类问题&#xff0c;又能解决回归任务&#xff0c;甚至在非线性数据面前也能游刃有余。本文将带…

mysql查看数据库

在 MySQL 中查看当前数据库的创建语句&#xff0c;使用 SHOW CREATE DATABASE 命令&#xff0c;以下是详细操作指南&#xff1a; 1. 查看当前数据库的创建语句 SHOW CREATE DATABASE database_name; 替换 database_name 为你的数据库名使用反引号 包裹特殊名称或保留字 2.…

ArrayList剖析

大家天天在用List&#xff0c;ArrayList一般来讲应该是程序员用的最多的集合类了。 我们今天研究一下ArrayList。 总体来讲&#xff0c;从底层数据结构或者源码的角度看&#xff0c;List比Map或者Set要简单。 底层数据结构 ArryList其实就是可变长数组。 初始化的时候&…

回顾JAVA中的锁机制

Java中的锁机制 在Java中&#xff0c;锁机制是多线程编程里保障数据一致性与线程安全的关键技术。 1. 内置锁&#xff1a;synchronized关键字 synchronized是Java的内置锁机制&#xff0c;能够保证在同一时刻&#xff0c;只有一个线程可以执行被其修饰的代码块或方法。 用法…

YOLOv11: AN OVERVIEW OF THE KEY ARCHITECTURAL ENHANCEMENTS目标检测论文精读(逐段解析)

YOLOv11: AN OVERVIEW OF THE KEY ARCHITECTURAL ENHANCEMENTS目标检测论文精读&#xff08;逐段解析&#xff09; 论文地址&#xff1a;https://www.arxiv.org/abs/2410.17725 Rahima Khanam and Muhammad Hussain Ultralytics公司发布 CVPR 2024 论文写的比较简单&#xff…

【Erdas实验教程】025:遥感图像辐射增强(雾霾去除)

文章目录 一、雾霾去除原理二、雾霾去除案例一、雾霾去除原理 遥感影像雾霾去除的核心原理是消除大气散射对电磁波的干扰,恢复地物真实反射信息。Haze Reduction 工具的原理: 该工具基于暗目标法(Dark Object Subtraction, DOS),适用于去除因大气散射(雾霾本质是大气颗…

Language Models are Unsupervised Multitask Learners :语言模型是无监督的多任务学习者

摘要 自然语言处理任务&#xff0c;如问答、机器翻译、阅读理解和摘要&#xff0c;通常通过在特定任务的数据集上进行监督学习来解决。我们展示了语言模型在训练于一个包含数百万网页的新数据集——WebText——时&#xff0c;可以无需任何显式监督就开始学习这些任务。当模型以…