当前位置: 首页 > news >正文

尚融宝03-mybatis-plus基本CRUD和常用注解

目录

一、通用Mapper

1、Create

2、Retrieve

3、Update

4、Delete

二、通用Service

1、创建Service接口

2、创建Service实现类

3、创建测试类

4、测试记录数

5、测试批量插入

三、自定义Mapper

1、接口方法定义

2、创建xml文件

3、测试条件查询

四、自定义Service

1、添加接口方法

2、实现接口方法

4、测试

五、常用注解

1、@TableName

2、@TableId

3、@TableField 

4、@TableLogic

Mybatis-Plus快速入门
mybatis-plus入门篇尚融宝02-mybatisplus复习

一、通用Mapper

MP中的基本CRUD在内置的BaseMapper中都已得到了实现。

创建MapperTests测试类:

package com.atguigu.mybatisplus;@SpringBootTest
public class MapperTests {@Resourceprivate UserMapper userMapper;
}

1、Create

@Test
public void testInsert(){User user = new User();user.setName("Helen");user.setAge(18);//不设置email属性,则生成的动态sql中不包括email字段int result = userMapper.insert(user);System.out.println("影响的行数:" + result); //影响的行数System.out.println("id:" + user.getId()); //id自动回填
}

2、Retrieve

@Test
public void testSelect(){//按id查询User user = userMapper.selectById(1);System.out.println(user);//按id列表查询List<User> users = userMapper.selectBatchIds(Arrays.asList(1, 2, 3));users.forEach(System.out::println);//按条件查询Map<String, Object> map = new HashMap<>();map.put("name", "Helen"); //注意此处是表中的列名,不是类中的属性名map.put("age", 18);List<User> users1 = userMapper.selectByMap(map);users1.forEach(System.out::println);
}

3、Update

@Test
public void testUpdate(){User user = new User();user.setId(1L);user.setAge(28);//注意:update时生成的sql自动是动态sqlint result = userMapper.updateById(user);System.out.println("影响的行数:" + result);
}

4、Delete

@Test
public void testDelete(){int result = userMapper.deleteById(5);System.out.println("影响的行数:" + result);
}

二、通用Service

MP中有一个接口 IService和其实现类 ServiceImpl,封装了常见的业务层逻辑

1、创建Service接口

创建 service 包,创建 UserService,继承 IService

package com.atguigu.mybatisplus.service;public interface UserService extends IService<User> {}

2、创建Service实现类

创建 impl 包,创建 UserServiceImpl,继承 ServiceImpl,实现 UserService

package com.atguigu.mybatisplus.service.impl;@Service
public class UserServiceImpl extends ServiceImpl<UserMapper, User> implements UserService {}

3、创建测试类

创建ServiceTests

package com.atguigu.mybatisplus;@SpringBootTest
public class ServiceTests {@Resourceprivate UserService userService;}

4、测试记录数

@Test
public void testCount(){int count = userService.count();System.out.println("总记录数:" + count);
}

5、测试批量插入

@Test
public void testSaveBatch(){// SQL长度有限制,海量数据插入单条SQL无法实行,// 因此MP将批量插入放在了通用Service中实现,而不是通用MapperArrayList<User> users = new ArrayList<>();for (int i = 0; i < 5; i++) {User user = new User();user.setName("Helen" + i);user.setAge(10 + i);users.add(user);}userService.saveBatch(users);
}

三、自定义Mapper

当通用Mapper无法满足我们的需求时,我们可以自定义基于Mapper接口的xml文件,并在xml文件中配置SQL语句

1、接口方法定义

在UserMapper接口中定义如下方法

List<User> selectAllByName(String name);

2、创建xml文件

在resources目录中创建mapper目录,创建UserMapper.xml

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd"><mapper namespace="com.atguigu.mybatisplus.mapper.UserMapper"><sql id="Base_Column_List">id, name, age, email</sql><select id="selectAllByName" resultType="com.atguigu.mybatisplus.entity.User">select<include refid="Base_Column_List"/>from userwherename = #{name}</select>
</mapper>

注意:MP中mapper目录是持久层映射文件的默认目录,如果是其他目录,需要配置mapper-locations,例如:

mybatis-plus.mapper-locations=classpath:xml/*.xml

3、测试条件查询

在MapperTests中创建如下测试用例

@Test
public void testSelectAllByName(){List<User> users = userMapper.selectAllByName("Helen");users.forEach(System.out::println);
}

四、自定义Service

1、添加接口方法

UserService中添加接口方法

List<User> listAllByName(String name);

2、实现接口方法

@Override
public List<User> listAllByName(String name) {// baseMapper对象指向当前业务的mapper对象return baseMapper.selectAllByName("Helen");
}

4、测试

ServiceTests中添加测试方法

@Test
public void testListAllByName(){List<User> users = userService.listAllByName("Helen");users.forEach(System.out::println);
}

五、常用注解

1、@TableName

① value属性

实体类的名字是User,数据库表名是t_user

@TableName(value = "t_user")
public class User {

2、@TableId

① 指定主键列

  • 测试:将数据库表中的id列改为 uid,将实体类中的id属性改成 uid,执行数据插入,则报告如下错误

 

  • 原因:因为MP默认认为id是主键列,其他名字的属性MP无法默认自动填充
  • 解决方案:为主键列添加 @TableId 注解

② value属性

实体类的属性名是 id,数据库的列名是 uid,此时使用 value 属性将属性名映射到列名

@TableId(value = "uid")
private String id;

③ type类型

type属性用来定义主键策略

  • IdType.ASSIGN_ID:使用基于雪花算法的策略生成数据id
@TableId(value = "uid", type = IdType.ASSIGN_ID)
private Long id;

注意:当对象的id被明确赋值时,不会使用雪花算法

  • IdType.AUTO:使用数据库的自增策略
@TableId(value = "uid", type = IdType.AUTO)
private Long id;

注意:该类型请确保数据库设置了 ID自增 否则无效

  • 全局配置:要想影响所有实体的配置,可以设置全局主键配置
#全局设置主键生成策略
mybatis-plus.global-config.db-config.id-type=auto

关于雪花算法,不了解的同学可以看看我的这篇文章:UUID的弊端以及雪花算法

3、@TableField 

① value属性

功能同TableId的value属性

注意:MP会自动将数据库中的下划线命名风格转化为实体类中的驼峰命名风格

例如,数据库中的列 create_time 和 update_time 自动对应实体类中的 createTime 和 updateTime

 

private LocalDateTime createTime;
private LocalDateTime updateTime;

 

扩展知识:为什么建议使用你 LocalDateTime ,而不是 Date?为什么建议使用你 LocalDateTime ,而不是 Date? - 知乎

  • java.util.Date的大多数方法已经过时
  • java.util.Date的输出可读性差
  • java.util.Date对应的格式化类SimpleDateFormat是线程不安全的类。阿里巴巴开发手册中禁用static修饰SimpleDateFormat。
  • LocalDateTime 对应的格式化类DateTimeFormatter是线程安全的

② 自动填充

需求描述:

项目中经常会遇到一些数据,每次都使用相同的方式填充,例如记录的创建时间,更新时间等。我们可以使用MyBatis Plus的自动填充功能,完成这些字段的赋值工作。

例如,阿里巴巴的开发手册中建议每个数据库表必须要有create_time 和 update_time字段,我们可以使用自动填充功能维护这两个字段

  • step1:添加fill属性
@TableField(fill = FieldFill.INSERT)
private LocalDateTime createTime;@TableField(fill = FieldFill.INSERT_UPDATE)
private LocalDateTime updateTime;
  • step2:实现元对象处理器接口 -> 创建handler包,创建MyMetaObjectHandler类

注意:不要忘记添加 @Component 注解

package com.atguigu.mybatisplus.handler;@Slf4j
@Component
public class MyMetaObjectHandler implements MetaObjectHandler {@Overridepublic void insertFill(MetaObject metaObject) {log.info("start insert fill ....");this.strictInsertFill(metaObject, "createTime", LocalDateTime.class, LocalDateTime.now());this.strictInsertFill(metaObject, "updateTime", LocalDateTime.class, LocalDateTime.now());}@Overridepublic void updateFill(MetaObject metaObject) {log.info("start update fill ....");this.strictUpdateFill(metaObject, "updateTime", LocalDateTime.class, LocalDateTime.now());}
}

③ 测试

  • 测试新增
  • 测试修改

④ 优化

  • 避免自动填充时开销过大,填充前先判断当前对象中是否有相关属性
@Override
public void insertFill(MetaObject metaObject) {//其他代码//判断是否具备author属性boolean hasAuthor = metaObject.hasSetter("author");if(hasAuthor){log.info("start insert fill author....");this.strictInsertFill(metaObject, "author", String.class, "Helen"); }
}
  • 用户明确定义了属性值,则无需自动填充,否则使用自动填充
@TableField(fill = FieldFill.INSERT)
private Integer age;@Override
public void insertFill(MetaObject metaObject) {//其他代码//判断age是否赋值Object age = this.getFieldValByName("age", metaObject);if(age == null){log.info("start insert fill age....");this.strictInsertFill(metaObject, "age", String.class, "18");}}

4、@TableLogic

① 逻辑删除

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

使用场景:可以进行数据恢复

② 实现逻辑删除

  • step1:数据库中创建逻辑删除状态列

 

  • step2:实体类中添加逻辑删除属性
@TableLogic
@TableField(value = "is_deleted")
private Integer deleted;

③ 测试

  • 测试删除:删除功能被转变为更新功能
-- 实际执行的SQL
update user set is_deleted=1 where id = 1 and is_deleted=0
  • 测试查询:被逻辑删除的数据默认不会被查询
-- 实际执行的SQL
select id,name,is_deleted from user where is_deleted=0

@TableLogic默认1为删除0为未删除,可以通过application.xml配置改变默认标识

mybatis-plus:global-config:db-config:logic-delete-field: -1   # 设置-1为删除logic-not-delete-value: 1  # 设置1为未删除

相关文章:

尚融宝03-mybatis-plus基本CRUD和常用注解

目录 一、通用Mapper 1、Create 2、Retrieve 3、Update 4、Delete 二、通用Service 1、创建Service接口 2、创建Service实现类 3、创建测试类 4、测试记录数 5、测试批量插入 三、自定义Mapper 1、接口方法定义 2、创建xml文件 3、测试条件查询 四、自定义Serv…...

vue多行显示文字展开

这几天项目里面有一个需求&#xff0c;多行需要进行展开文字&#xff0c;类似实现这种效果 难点就在于页面布局 一开始就跟无头苍蝇似的&#xff0c;到处百度 &#xff0c;后面发现网上的都不适合自己&#xff0c;最终想到了解决方案 下面是思路&#xff1a; 需求是超过3行&a…...

SpringBoot:SpringBoot 的底层运行原理解析

声明原文出处&#xff1a;狂神说 文章目录1. pom.xml1 . 父依赖2 . 启动器 spring-boot-starter2. 主启动类的注解1. 默认的主启动类2. SpringBootApplication3. ComponentScan4. SpringBootConfiguration5. SpringBootApplication 注解6. spring.factories7. 结论8. 简单图解3…...

哪些场景会产生OOM?怎么解决?

文章目录 堆内存溢出方法区(运行时常量池)和元空间溢出直接内存溢出栈内存溢出什么时候会抛出OutOfMemery异常呢?初看好像挺简单的,其实深究起来考察的是对整个JVM的了解,而这个问题从网上可以翻到一些乱七八糟的答案,其实在总结下来基本上4个场景可以概括下来。 堆内存溢出…...

金三银四、金九银十 面试宝典 Spring、MyBatis、SpringMVC面试题 超级无敌全的面试题汇总(超万字的面试题,让你的SSM框架无可挑剔)

Spring、MyBatis、SpringMVC 框架 - 面试宝典 又到了 金三银四、金九银十 的时候了&#xff0c;是时候收藏一波面试题了&#xff0c;面试题可以不学&#xff0c;但不能没有&#xff01;&#x1f941;&#x1f941;&#x1f941; 一个合格的 计算机打工人 &#xff0c;收藏夹里…...

JAVA开发(Spring框架详解)

javaweb项目几乎已经离不开spring框架了&#xff0c;spring 是一个典型的分层架构框架&#xff0c;它包含一系列的功能并被分为多个功能模块&#xff0c;springboot对spring框架又做了一层封装&#xff0c;以至于很多人对原来的spring框架越来越不了解。 要谈Spring的历史&…...

自学大数据第八天~HDFS命令(二)

嗨喽,好久不见,最近抽空复习了一下hadoop,书读百遍,其意自现这句话还真是; 继续学习HDFS常用命令 改变文件 拥有者~chown hdfs dfs -chown -R hadoop /user/hadoop使用 -R 将使改变在目录结构下递归进行。命令的使用者必须是超级用户。 改变文件所属组-chgrp hdfs dfs -chgr…...

贪心算法(几种常规样例)

贪心算法&#xff08;几种常规样例&#xff09; 贪心算法&#xff0c;指在对问题进行求解的时候&#xff0c;总是做出当前看来是最好的选择。也就是说不从整体上最优上考虑&#xff0c;算法得到的结果是某种意义上的局部最优解 文章目录贪心算法&#xff08;几种常规样例&…...

【数据结构】基础知识总结

系列综述&#xff1a; &#x1f49e;目的&#xff1a;本系列是个人整理为了数据结构复习用的&#xff0c;由于牛客刷题发现数据结构方面和王道数据结构的题目非常像&#xff0c;甚至很多都是王道中的&#xff0c;所以将基础知识进行了整理&#xff0c;后续会将牛客刷题的错题一…...

宣布推出 .NET 社区工具包 8.1!

我们很高兴地宣布 .NET Community Toolkit 8.1 版正式发布&#xff01;这个新版本包括呼声很高的新功能、bug 修复和对 MVVM 工具包源代码生成器的大量性能改进&#xff0c;使开发人员在使用它们时的用户体验比以往更好&#xff01; 就像在我们之前的版本中一样&#xff0c;我…...

ChatGPT解开了我一直以来对自动化测试的疑惑

目录 前言 与ChatGPT的对话 什么是自动化测试,我该如何做到自动化测试,或者说需要借助什么工具可以做到自动化测试&#xff1f; 自动化测试如何确保数据的准确性 自动化测试是怎么去验证数据的 如何通过断言验证数据 自动化测试有哪些验证工具可以验证数据 总结 前言…...

十大经典排序算法(上)

目录 1.1冒泡排序 1. 算法步骤 3.什么时候最快 4. 什么时候最慢 5.代码实现 1.2选择排序 1. 算法步骤 2. 动图演示 3.代码实现 1.3 插入排序 1. 算法步骤 2. 动图演示 3. 算法实现 1.4 希尔排序 1. 算法步骤 2. 动图演示 3.代码实现 1.5 归并排序 1. 算法步骤 2…...

如何从 MySQL 读取 100w 数据进行处理

文章目录 场景常规查询流式查询MyBatis 流式查询接口非流式查询和流式查询区别游标查询场景 大数据量操作的场景大致如下: 1、 数据迁移; 2、 数据导出; 3、 批量处理数据; 在实际工作中当指定查询数据过大时,我们一般使用分页查询的方式一页一页的将数据放到内存处理。…...

【数据降维-第2篇】核主成分分析(KPCA)快速理解,及MATLAB实现

一篇介绍了PCA算法的快速理解和应用&#xff0c;本章讲一下KPCA。KPCA方法与PCA方法一样&#xff0c;是有着扎实的理论基础的&#xff0c;相关理论在论文上以及网络上可以找到大量的材料&#xff0c;所以这篇文章还是聚焦在方法的快速理解以及应用上&#xff0c;此外还会对同学…...

Python+ChatGPT实战之进行游戏运营数据分析

文章目录一、数据二、目标三、解决方案1. DAU2. 用户等级分布3. 付费率4. 收入情况5. 付费用户的ARPU最近ChatGPT蛮火的&#xff0c;今天试着让ta写了一篇数据分析实战案例&#xff0c;大家来评价一下&#xff01;一、数据 您的团队已经为您提供了一些游戏数据&#xff0c;包括…...

Java每日一练(20230313)

目录 1. 字符串统计 ★ 2. 单词反转 ★★ 3. 俄罗斯套娃信封问题 ★★★ &#x1f31f; 每日一练刷题专栏 C/C 每日一练 ​专栏 Python 每日一练 专栏 Java 每日一练 专栏 1. 字符串统计 编写一个程序&#xff0c;对于输入的一段英语文本&#xff0c;可以统计&#…...

国内ChatGPT日趋成熟后,可以优先解决的几个日常小问题

现在ChatGPT的发展可谓如日中天&#xff0c;国内很多大的公司例如百度、京东等也开始拥抱新技术&#xff0c;推出自己的应用场景&#xff0c;但可以想象到的是&#xff0c;他们必定利用这个新技术在巩固自己的现有应用场景&#xff0c;比如某些客服&#xff0c;你都不用想&…...

业内人士真心话,软件测试是没有前途的,我慌了......

我在测试行业爬模滚打7年&#xff0c;从点点点的功能测试到现在成为高级测试&#xff0c;工资也翻了几倍。个人觉得&#xff0c;测试的前景并不差&#xff0c;只要自己肯努力。 我刚出来的时候是在鹅厂做外包的功能测试&#xff0c;天天点点点&#xff0c;很悠闲&#xff0c;点…...

哈佛与冯诺依曼结构

1. 下图是典型的冯诺依曼结构 2. CPU分为三部分&#xff1a;ALU运算单元&#xff0c;CU控制单元&#xff0c;寄存器组。 3. 分析51单片机为何能使用汇编进行编程 51指令集&#xff08;Instruction Set&#xff09;是单片机CPU能够执行的所有指令的集合。在编写51单片机程序时&a…...

传输安全HTTPS

为什么要有 HTTPS 为什么要有 HTTPS&#xff1f;简单的回答是&#xff1a;“因为 HTTP 不安全”。HTTP 怎么不安全呢&#xff1f; 通信的消息会被窃取&#xff0c;无法保证机密性&#xff08;保密性&#xff09;&#xff1a;由于 HTTP 是 “明文” 传输&#xff0c;整个通信过…...

论文解读:交大港大上海AI Lab开源论文 | 宇树机器人多姿态起立控制强化学习框架(二)

HoST框架核心实现方法详解 - 论文深度解读(第二部分) 《Learning Humanoid Standing-up Control across Diverse Postures》 系列文章: 论文深度解读 + 算法与代码分析(二) 作者机构: 上海AI Lab, 上海交通大学, 香港大学, 浙江大学, 香港中文大学 论文主题: 人形机器人…...

Appium+python自动化(十六)- ADB命令

简介 Android 调试桥(adb)是多种用途的工具&#xff0c;该工具可以帮助你你管理设备或模拟器 的状态。 adb ( Android Debug Bridge)是一个通用命令行工具&#xff0c;其允许您与模拟器实例或连接的 Android 设备进行通信。它可为各种设备操作提供便利&#xff0c;如安装和调试…...

1688商品列表API与其他数据源的对接思路

将1688商品列表API与其他数据源对接时&#xff0c;需结合业务场景设计数据流转链路&#xff0c;重点关注数据格式兼容性、接口调用频率控制及数据一致性维护。以下是具体对接思路及关键技术点&#xff1a; 一、核心对接场景与目标 商品数据同步 场景&#xff1a;将1688商品信息…...

【SQL学习笔记1】增删改查+多表连接全解析(内附SQL免费在线练习工具)

可以使用Sqliteviz这个网站免费编写sql语句&#xff0c;它能够让用户直接在浏览器内练习SQL的语法&#xff0c;不需要安装任何软件。 链接如下&#xff1a; sqliteviz 注意&#xff1a; 在转写SQL语法时&#xff0c;关键字之间有一个特定的顺序&#xff0c;这个顺序会影响到…...

技术栈RabbitMq的介绍和使用

目录 1. 什么是消息队列&#xff1f;2. 消息队列的优点3. RabbitMQ 消息队列概述4. RabbitMQ 安装5. Exchange 四种类型5.1 direct 精准匹配5.2 fanout 广播5.3 topic 正则匹配 6. RabbitMQ 队列模式6.1 简单队列模式6.2 工作队列模式6.3 发布/订阅模式6.4 路由模式6.5 主题模式…...

【C++特殊工具与技术】优化内存分配(一):C++中的内存分配

目录 一、C 内存的基本概念​ 1.1 内存的物理与逻辑结构​ 1.2 C 程序的内存区域划分​ 二、栈内存分配​ 2.1 栈内存的特点​ 2.2 栈内存分配示例​ 三、堆内存分配​ 3.1 new和delete操作符​ 4.2 内存泄漏与悬空指针问题​ 4.3 new和delete的重载​ 四、智能指针…...

Chromium 136 编译指南 Windows篇:depot_tools 配置与源码获取(二)

引言 工欲善其事&#xff0c;必先利其器。在完成了 Visual Studio 2022 和 Windows SDK 的安装后&#xff0c;我们即将接触到 Chromium 开发生态中最核心的工具——depot_tools。这个由 Google 精心打造的工具集&#xff0c;就像是连接开发者与 Chromium 庞大代码库的智能桥梁…...

探索Selenium:自动化测试的神奇钥匙

目录 一、Selenium 是什么1.1 定义与概念1.2 发展历程1.3 功能概述 二、Selenium 工作原理剖析2.1 架构组成2.2 工作流程2.3 通信机制 三、Selenium 的优势3.1 跨浏览器与平台支持3.2 丰富的语言支持3.3 强大的社区支持 四、Selenium 的应用场景4.1 Web 应用自动化测试4.2 数据…...

Proxmox Mail Gateway安装指南:从零开始配置高效邮件过滤系统

&#x1f49d;&#x1f49d;&#x1f49d;欢迎莅临我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 推荐&#xff1a;「storms…...

深度学习之模型压缩三驾马车:模型剪枝、模型量化、知识蒸馏

一、引言 在深度学习中&#xff0c;我们训练出的神经网络往往非常庞大&#xff08;比如像 ResNet、YOLOv8、Vision Transformer&#xff09;&#xff0c;虽然精度很高&#xff0c;但“太重”了&#xff0c;运行起来很慢&#xff0c;占用内存大&#xff0c;不适合部署到手机、摄…...