整合Mybatis-plus及最佳实践

news2024/10/30 10:20:05

项目引入Mybatis-plus


第一步: 引入starter依赖

<dependency>
	<groupId>com.baomidou</groupId>
	<artifactId>mybatis-plus-boot-starter</artifactId>
</dependency>

第二步: 使用@MapperScan扫描mapper文件夹

@SpringBootApplication
@MapperScan("com.shier.shierusercenterbackend.mapper")
public class ShierUserCenterBackendApplication {

    public static void main(String[] args) {
        SpringApplication.run(ShierUserCenterBackendApplication.class, args);
    }

}

第三步: 在application.yml文件里加上相应配置

mybatis-plus:
  configuration:
    map-underscore-to-camel-case: false # 驼峰转换
#    log-impl: org.apache.ibatis.logging.stdout.StdOutImpl # 日志
  global-config:
    db-config:
      logic-delete-field: delFlag # 全局逻辑删除的实体字段名
      logic-delete-value: 1 # 逻辑已删除值(默认为 1)
      logic-not-delete-value: 0 # 逻辑未删除值(默认为 0)
  1. **map-underscore-to-camel-case: false**

默认情况下,MyBatis-Plus 会将数据库中的下划线命名方式映射为驼峰命名方式(例如:user_name 转 为 userName)。通过将这个配置项设置为 false,禁用了这个默认的下划线转驼峰的功能。

  1. **log-impl: org.apache.ibatis.logging.stdout.StdOutImpl**

这是 MyBatis-Plus 的日志输出实现配置。在注释状态下,将使用 MyBatis 默认的日志输出实现,即输出到控制台。

  1. **global-config** 这个部分是 MyBatis-Plus 的全局配置项。
    • **db-config** 数据库配置部分。
      • **logic-delete-field: isDelete** 配置逻辑删除的实体字段名,即表示数据是否被删除的字段。在这里,配置为 isDelete,表明使用 isDelete 字段进行逻辑删除的标记。
      • **logic-delete-value: 1** 配置逻辑已删除的值。在这里,配置为 1,表示逻辑删除状态。
      • **logic-not-delete-value: 0** 配置逻辑未删除的值。在这里,配置为 0,表示逻辑未删除状态。

第四步: 加上Config文件

@Configuration
@EnableTransactionManagement
public class MybatisPlusConfig {

    @Bean
    public MybatisPlusInterceptor mybatisPlusInterceptor() {
        MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();
        PaginationInnerInterceptor pii = new PaginationInnerInterceptor();
        pii.setDbType(DbType.MYSQL);
        pii.setMaxLimit(500L);
        interceptor.addInnerInterceptor(pii);
        return interceptor;
    }

    @Bean
    public ConfigurationCustomizer configurationCustomizer() {
        return configuration -> configuration.setUseDeprecatedExecutor(false);
    }
}


常用注解:


@TableName

用于指定数据库表名, 通常在实体类Entity上使用

例如: @TableName("user")

@TableId

用于指定表中的主键字段, 通常在实体类的主键属性上使用

例如: @TableId(value = "id", type = IdType.AUTO)

其中 value 表示主键字段名, type 表示主键生成策略

@TableField

用于指定表中的非主键字段, 可以用于实体类的属性上, 以映射属性和数据库字段

例如: @TableField(value = "user_name", exist = true)

value 表示数据库中的字段名,

exist 表示该字段是否存在, 默认为true, 设置为false表示在数据库中不存在该字段

@TableLogic

用于指定逻辑删除字段, 逻辑删除是指在数据库中标记,某个记录已删除, 而不是真正删除

例如: @TableLogic(value = "0", delval = "1")

value 表示未删除状态的默认值

delval 表示删除状态的值

@Version

用于指定乐观锁字段, 乐观锁是一种并发控制策略, 用于解决多线程同时修改同一条记录的问题

例如: @Version private Integer version

@EnumValue

用于指定枚举类型字段的映射

例如: @EnumValue private Integer status

@InterceptorIgnore

用于忽略MP拦截器的处理

例如: @InterceptorIgnore(tenantLine = "true")

表示忽略拦截器

@FieldFill 相关文章

解析Java中的MyBatis Plus注解 @FieldFill:优雅处理字段填充-阿里云开发者社区

条件构造器:


Mybatis-plus 的 Wrapper 是一个条件构造器, 用于简化复杂的SQL查询条件的构建

它提供了一系列易于使用的API, 让你能够以链式编程的方式编写查询条件

举个荔枝~

QueryWrapper

@Test
    public void testWrapper(){
        QueryWrapper<User> wrapper = new QueryWrapper<>();
        wrapper.like("username", "o")
                .eq("status", 1);
        userMapper.selectList(wrapper).forEach(System.out::println);
    }

看到左上角这玩意绿了说明单元测试通过了~

接下来我们用更进阶的方法进行查询, 也就是Lambda~

LambdaQueryWrapper

@Test
    public void testWrapper2(){
        PageParam pageParam = new PageParam();
        pageParam.setPageNum(1);
        pageParam.setPageSize(10);

        LambdaQueryWrapper<User> query = Wrappers.lambdaQuery();
        query.like(User::getUsername, "o")
                .eq(User::getStatus, 1)
                .orderByDesc(User::getBalance)
                .last("limit " + pageParam.getPageNum() + ", " + pageParam.getPageSize());

        List<User> users = userMapper.selectList(query);
        users.forEach(System.out::println);
    }

这里的代码有个小小的优化点

就是用户的状态status可以单独做一个枚举类去存放

因为状态是比较固定的值 不是0就是1 , 直接写死并不美观, 所以可以封装

LambdaQueryWrapper更好用, 因为它构建sql语句的时候, 需要用到数据库字段名,

上面一种方法很明显是直接在代码里写死字段名了, 一旦数据库的某些字段更改就寄了

所以我们采取第二种方法, 使用LambdaQueryWrapper<User> query = Wrappers.lambdaQuery()

这样就巧妙地避开了数据库某些字段的变更而导致代码失效~

静态工具Db:


这个可是重头戏了~

查询用户状态为 1 的所有用户信息

@Test
	public void testQuery(){
		List<User> users = Db.lambdaQuery(User.class).eq(User::getStatus, 1).list();
		users.forEach(System.out::println);
	}

查询多个用户的地址

        // 2.2根据用户ids查询地址
		List<Address> addresses = Db.lambdaQuery(Address.class)
									.in(Address::getUserId, userIds)
									.list();

查询用户Ids相关的用户信息, 根据Id分组, 存入Map

userMap = users.stream().collect(Collectors.groupingBy(User::getId));

这行代码用Id进行了数据分组, 便于存入hashMap中

@Test
	void testQueryByIds(){
		List<User> users = Db.lambdaQuery(User.class)
				.in(User::getId, 1L, 2L, 3L)
				.list();
		Map<Long, List<User>> userMap = new HashMap<>(0);
		if(CollUtil.isNotEmpty(users)){
			userMap = users.stream().collect(Collectors.groupingBy(User::getId));
		}
		userMap.forEach((k, v) -> {
			System.out.println("key = " + k);
			v.forEach(System.out::println);
		});
	}

Mybatis-plus 相关文章:

最新版MyBatis-Plus使用详解_Intelligent_M的博客-CSDN博客

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【IC每日一题】

IC每日一题 1&#xff1a;锁存器(latch)、触发器(flip-flop)、寄存器的概念及区别1.1 概念1.2 锁存器的危害1.3 如何避免产生锁存器 2 手撕题&#xff1a;边沿检测2.1 边沿检测(上升沿、下降沿、双边沿)2.1.1 波形图2.1.2 算法步骤2.1.3 代码 2.2 序列模三检测器2.2.1 描述2.2.…

端到端自动驾驶模型SparseDrive论文阅读笔记

为了进一步的理解模型&#xff0c;方便对模型进行调试&#xff0c;对论文进行了详细的阅读&#xff0c;记录了相关的笔记&#xff0c;和论文阅读批注。 论文阅读批注连接&#xff1a; https://note.youdao.com/s/VC6mDgdZ 笔记如下图&#xff1a;

(11)(2.1.6) Hobbywing DroneCAN ESC(一)

文章目录 前言 1 连接和配置 2 参数说明 前言 具有 CAN 接口&#xff08;including these&#xff09;的业余 ESC 支持 DroneCAN&#xff0c;它允许自动驾驶仪通过 CAN 控制 ESC /电机&#xff0c;并检索单个转速、电压、电流和温度。 具有 CAN 接口&#xff08;including …

《机器学习by周志华》学习笔记-神经网络-03多层网络学习算法之误差逆传播算法

1、背景 由于多层网络的学习能力比单层感知机要强很多,想要训练多层网络的话,感知机的学习规则显然不使用,需要更强大的学习算法来进行训练。「误差逆传播」算法就是最杰出、最成功的神经网络学习算法之一。 现实世界的业务大多数以来使用该算法进行训练。 2、作用 不仅…

.NET Core WebApi第4讲:控制器、路由

一、控制器是什么&#xff1f; 1、创建一个空的API控制器&#xff1a;TestController.cs 2、里面有一个类叫TestController&#xff0c;把它叫做控制器 因为它继承了ControllerBase类&#xff0c;ControllerBase类里提供了一系列的方法&#xff0c;使得TestController这个类具…

基于Mysql、JavaScript、PHP、ajax开发的MBTI性格测试网站(前端+后端)

源码地址&#xff1a;https://download.csdn.net/download/2302_79553009/89933699 项目简介 本项目旨在构建一个基于MBTI&#xff08;迈尔斯-布里格斯性格分类指标&#xff09;理论的在线平台——“16Personalities”。该平台利用PHP、MySQL、JavaScript等技术栈开发&#xf…

【AI开源项目】FastGPT- 快速部署FastGPT以及使用知识库的两种方式!

文章目录 一、FastGPT大模型介绍1. 开发团队2. 发展史3. 基本概念 二、FastGPT与其他大模型的对比三、使用 Docker Compose 快速部署 FastGPT1、安装 Docker 和 Docker Compose&#xff08;1&#xff09;. 安装 Docker&#xff08;2&#xff09;. 安装 Docker Compose&#xff…

SpringBoot- 查看Maven依赖API文档

在 Maven 中查看某个依赖的所有 API 文档&#xff0c;最常见的方式是通过添加 Javadoc 并使用 IDE 自动集成查看&#xff0c;或者直接访问 Maven 仓库网站。以下是详细的步骤&#xff1a; 1. 使用 Maven Dependency Plugin 下载 Javadoc 可以通过 mvn dependency:resolve 命令…

macOS Sonoma 14.7.1 (23H222) Boot ISO 原版可引导镜像下载

macOS Sonoma 14.7.1 (23H222) Boot ISO 原版可引导镜像下载 2024 年 10 月 28 日&#xff0c;Apple 智能今日登陆 iPhone、iPad 和 Mac。用户现可借助 Apple 智能优化写作&#xff0c;为通知、邮件和消息生成摘要&#xff0c;体验交互更自然、功能更丰富的 Siri&#xff0c;使…

Nginx+Lua脚本+Redis 实现自动封禁访问频率过高IP

1 、安装OpenResty 安装使用 OpenResty&#xff0c;这是一个集成了各种 Lua 模块的 Nginx 服务器&#xff0c;是一个以Nginx为核心同时包含很多第三方模块的Web应用服务器&#xff0c;使用Nginx的同时又能使用lua等模块实现复杂的控制。 &#xff08;1&#xff09;安装编译工具…

[Linux] linux 软硬链接与动静态库

标题&#xff1a;[Linux] linux 软硬链接与动静态库 个人主页水墨不写bug &#xff08;图片来源于网络&#xff09; /** _oo0oo_* o8888888o* 88" . "88* (| -_- |)* …

VSCode 设置环境变量(WSL 2)

环境&#xff1a;openEuler、Windows 11、WSL 2、python 3.12.3 背景&#xff1a;使用vscode连接Windows 的Linux子系统&#xff0c;开发python项目&#xff0c;获取环境变量失败 时间&#xff1a;20241029 说明&#xff1a;使用os.environ获取不到变量&#xff0c;设置/etc…

控制台安全内部:创新如何塑造未来的硬件保护

在 Help Net Security 的采访中&#xff0c;安全研究人员 Specter 和 ChendoChap 讨论了游戏机独特的安全模型&#xff0c;并强调了它与其他消费设备的不同之处。 他们还分享了对游戏机安全性的进步将如何影响未来消费者和企业硬件设计的看法。 斯佩克特 (Specter) 是本周在阿…

13.音乐管理系统(基于SpringBoot + Vue)

目录 1.系统的受众说明 ​​​​​​​ 2 需求分析 2.1用例图及用例分析 2.1.1 用户用例图及用例分析 2.1.2 管理员用例图及用例分析 2.2 系统结构图和流程图 2.2.1 音乐播放器的系统流程图&#xff08;图2.2.1-1&#xff09; 2.2.2 系统功能表&#xff08;表2.2.2…

TiDB体验一在单机上模拟部署TiDB生产环境集群

TiDB整体架构 TiDB集群主要包括三个核心组件&#xff1a;TiDB Server&#xff0c;PD Server和TiKV Server。 TiDB Server&#xff1a;SQL 层&#xff0c;对外暴露 MySQL 协议的连接 endpoint&#xff0c;负责接受客户端的连接&#xff0c;执行 SQL 解析和优化&#xff0c;最终生…

Conditional DETR论文笔记

原文链接 [2108.06152] Conditional DETR for Fast Training Convergencehttps://arxiv.org/abs/2108.06152 原文笔记 What 《Conditional DETR for Fast Training Convergence》 这个工作也是针对于DETR Query的工作 用于解决DETR训练收敛慢&#xff08;Object query需要…

在Excel中如何快速筛选非特定颜色

Excel中的自动筛选是个非常强大的工具&#xff0c;不仅可以筛选内容&#xff0c;而且可以筛选颜色&#xff0c;例如筛选A列红色单元格。但是有时希望筛选除了红色之外的单元格&#xff08;下图右侧所示&#xff09;&#xff0c;其他单元格的填充色不固定&#xff0c;有几种颜色…

C语言中的位操作

第一章 变量某位赋值与连续赋值 寄存器 | 值 //例如&#xff1a;a 1000 0011b a | (1<<2) //a 1000 0111 b 单独赋值 a | (3<<2*2) // 1011 0011b 连续赋值 第二章 变量某位清零与连续清零 寄存器 & ~&#xff08;&#xff09; 值 //例子&#xff1a;a …

微信小程序scroll-view吸顶css样式化表格的表头及iOS上下滑动表头的颜色覆盖及性能分析

微信小程序scroll-view吸顶css样式化表格的表头及iOS上下滑动表头的颜色覆盖及性能分析 目录 微信小程序scroll-view吸顶css样式化表格的表头及iOS上下滑动表头的颜色覆盖及性能分析 1、iOS在scroll-view内部上下滑动吸顶的现象 正常的上下滑动吸顶覆盖&#xff1a; iOS及iPa…

详细分析Pytorch中的transpose基本知识(附Demo)| 对比 permute

目录 前言1. 基本知识2. Demo 前言 原先的permute推荐阅读&#xff1a;详细分析Pytorch中的permute基本知识&#xff08;附Demo&#xff09; 1. 基本知识 transpose 是 PyTorch 中用于交换张量维度的函数&#xff0c;特别是用于二维张量&#xff08;矩阵&#xff09;的转置操…