整合Mybatis-plus及最佳实践

项目引入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博客

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

安全知识见闻-网络类型、协议、设备、安全

网络类型、协议、设备、安全 本章节包括局域网&#xff08;LAN&#xff09;、城域网&#xff08;MAN&#xff09;和广域网&#xff08;WAN&#xff09;。此外&#xff0c;还涉及了网络协议、网络设备和网络安全的基本概念。 目录 网络类型、协议、设备、安全 一、网络类型 …

2024年项目管理新风向:敏捷开发与瀑布开发,哪个更优?

一、项目管理的多样格局 2024 年&#xff0c;项目管理领域展现出丰富多样的格局。数字化趋势愈发明显&#xff0c;项目管理软件普及度不断提高&#xff0c;据相关资料显示&#xff0c;随着云计算、大数据等技术的成熟&#xff0c;项目管理软件将更加普及&#xff0c;实现项目信…

鼠标增强工具 MousePlus v5.3.9.0 中文绿色版

MousePlus 是一款功能强大的鼠标增强工具&#xff0c;它可以帮助用户提高鼠标操作效率和精准度。该软件可以自定义鼠标的各种功能和行为&#xff0c;让用户根据自己的习惯和需求来调整鼠标的表现。 详细功能 自定义鼠标按钮功能&#xff1a;可以为鼠标的各个按钮设置不同的功能…

Spring Boot 应用开发全攻略:从入门到精通

Spring Boot 应用开发全攻略&#xff1a;从入门到精通 引言 在当今快速发展的软件开发领域&#xff0c;Spring Boot 作为一种快速开发框架&#xff0c;凭借其简洁、易用的特性&#xff0c;赢得了开发者的广泛青睐。无论是微服务架构还是传统的单体应用&#xff0c;Spring Boo…

51单片机之蜂鸣器驱动

1.简介 蜂鸣器是一种一体化结构的电子讯响器&#xff0c;采用直流电压供电&#xff0c;广泛应用于计算机、打印机、 复印机、报警器、电子玩具、汽车电子设备、电话机、定时器等电子产品中作发声器件。蜂鸣器主要分为压电式蜂鸣器和电磁式蜂鸣器两种类型。   压电式蜂鸣器主要…

【Unity实战笔记】第二一 · 基于状态模式的角色控制——以UnityChan为例

目录 一 内容摘要二 前言三 状态模式的必要性3.1 非状态模式的角色控制3.2 简易状态模式的角色控制3.3 状态模式3.3.1 IState3.3.2 IdleState3.3.3 RunState3.3.4 JumpState3.3.5 PlayerController_ComplexStateMode3.3.6 注意事项 3.4 SMB 四 基于SMB的角色控制4.1 项目实战案…

【NOIP提高组】 自由落体

【NOIP提高组】 自由落体 &#x1f490;The Begin&#x1f490;点点关注&#xff0c;收藏不迷路&#x1f490; 在高为 H 的天花板上有 n 个小球&#xff0c;体积不计&#xff0c;位置分别为 0&#xff0c;1&#xff0c;2&#xff0c;…&#xff0e;n-1。在地面上有一个小车&…

ECMAScript 标准详解

ECMAScript 是 JavaScript 的基础标准&#xff0c;由 Ecma International 制定。它定义了脚本语言的语法和行为。自 1997 年以来&#xff0c;ECMAScript 经过了多个版本的迭代&#xff0c;每个版本都对 JavaScript 产生了深远的影响。 1. ECMAScript 1 (ES1) 发布时间&#xf…

react18中的受控与非受控组件及ref的使用

受控与非受控组件 受控组件,基于修改 state 的值,修改组件内部的状态&#xff0c;来实现页面的更新&#xff0c;推荐使用 非受控组件&#xff0c;基于 ref 获取 dom 的值&#xff0c;来实现页面的更新,不推荐使用,偶尔特殊的场景会使用 给需要获取的元素设置 ref“xxx”,后期基…

Pytorch学习--如何下载及使用Pytorch中自带数据集,如何把数据集和transforms联合在一起使用

一、标准数据集使用 pytorch官网–标准数据集 这里以CIFAR10数据集为例&#xff1a;CIFAR10 下载数据集 代码&#xff1a; import torchvision train_datatorchvision.datasets.CIFAR10(root"datasets",trainTrue,downloadTrue) test_datatorchvision.datasets.…

【实用知识】Spring Boot 优雅捕捉异常的几种姿势

&#x1f449;博主介绍&#xff1a; 博主从事应用安全和大数据领域&#xff0c;有8年研发经验&#xff0c;5年面试官经验&#xff0c;Java技术专家&#xff0c;WEB架构师&#xff0c;阿里云专家博主&#xff0c;华为云云享专家&#xff0c;51CTO 专家博主 ⛪️ 个人社区&#x…

计算机网络:数据链路层 —— 虚拟局域网 VLAN

文章目录 局域网虚拟局域网 VLAN虚拟局域网 VLAN 概述实现机制IEEE 802.1Q帧以太网交换机的接口类型Access 接口Trunk 接口Hybrid 接口不进行人为的VLAN划分划分两个不同VLANTrunk接口去标签后进行转发Trunk接口直接转发 局域网 局域网&#xff08;Local Area Network&#xf…

ICP之点云特征计算

这次我们来聊一下点云的特征计算方法&#xff0c; 主流的有两类 1&#xff1a;基于直方图的特征计算 2&#xff1a;基于签名的特征计算 这次我将介绍基于直方图的方式。 基于直方图的特征方法中&#xff0c;PFH&#xff08;Point Feature Histograms&#xff09;和FPFH&#x…

vue3项目中引入阿里图标库

开篇 本篇的主题是在vue3项目中引入阿里图标库 步骤 注册阿里图标库账号(阿里图标)&#xff0c;并创建项目 将图标加入项目中 将需要的图标先加入购物车&#xff0c;随后加入到项目中 生成项目代码 在项目中生成项目代码&#xff0c;便于后续复制到vue项目中 ## 在vue3项目…

基于Ubuntu24.04,下载并编译Android12系统源码 (一)

1. 前言 1.1 编译源码可以干什么 定制Android系统将最新版本的Android系统刷入到自己的Android设备中将整个系统源码导入到Android Studio中&#xff08;可以不用编译源码来实现&#xff09;。 只要有对应的Android源码版本的android.iml和android.ipr文件&#xff0c;就可以…

使用 v-html 指令渲染的标签, 标签内绑定的 click 事件不生效

背景 在项目开发中&#xff0c;实现用户友好的输入交互是提升用户体验的关键之一。例如&#xff0c;在客服对话框中&#xff0c;其中有包含多个快捷选项用于快速问答&#xff0c;每个快捷选项都是一个可点击的按钮&#xff0c;并需要绑定点击事件来执行相应操作。然而&#xf…

JavaSE笔记2】面向对象

目录 一、深刻认识面向对象 二、对象在计算机中的执行原理 三、this 四、构造器 五、封装 六、实体Javabean(实体类) 1. 是什么&#xff1f; 2. 实体类用来干什么&#xff1f; 七、成员变量和局部变量的区别 一、深刻认识面向对象 二、对象在计算机中的执行原理 三、this Java中…

LINUX1.3

cp&#xff08;复制&#xff09;: 将需要复制的文件或目录&#xff08;源&#xff09;重建一份&#xff0c;并保存为新的文件或目录 cp 源文件 -------目标地址 在当前文件夹时&#xff1a; cp 源文件 &#xff08;要改名&#xff09;------目的地址&#xff08;可以改名或…

Redis高频面试题

一、Redis有什么好处? 高性能:Redis是一个基于内存的数据存储系统,相比于传统的基于磁盘的数据库系统,它能够提供更高的读写性能。支持丰富的数据类型:Redis支持多种数据结构,包括字符串、哈希、列表、集合、有序集合等,这使得它可以用于多种不同的应用场景。持久化:Re…

4.2-7 运行MR应用:词频统计

文章目录 1. 准备数据文件2. 文件上传到HDFS指定目录2.1 创建HDFS目录2.2 上传文件到HDFS2.3 查看上传的文件 3. 运行词频统计程序的jar包3.1 查看Hadoop自带示例jar包3.2 运行示例jar包里的词频统计 4. 查看词频统计结果5. 在HDFS集群UI界面查看结果文件6. 在YARN集群UI界面查…