MybatisPlus 的入门与实践:BaseMapper 实现 CRUD

MyBatis 避免了几乎所有的 JDBC 代码和手动设置参数以及获取结果集,可以使用简单的 XML 或注解来配置和映射原始类型、接口和 Java POJO(Plain Old Java Objects,普通的 Java 对象)为数据库中的记录。

下面我们将详细探讨 MyBatis 的基本功能。

BaseMapper

MyBatis-Plus 中的基本 CRUD 在内置的 BaseMapper 中都已得到了实现,因此我们的 Mapper 继承该接口,同时指定泛型类型为对应的实体类,之后就可以直接使用。

BaseMapper 是 MyBatis-Plus 提供的一个核心接口,它定义了一系列基础的 CRUD(Create, Read, Update, Delete) 操作方法,旨在简化基于 MyBatis 的数据访问层代码的编写,提高开发效率。

public interface UserMapper extends BaseMapper<T>{// 在这里可以定义自己的方法
}
  • 调用方法:通过调用 UserMapper 接口中的方法,可以直接执行数据库操作,而无需手动编写 SQL 语句或 XML 映射文件。

  • 泛型 T 为任意实体对象,Mybatis Plus 通过扫描实体类,并基于反射获取实体类信息作为数据库表信息

  • 类名驼峰转下划线作为表名

  • 名为 id 的字段作为主键

  • 变量名驼峰转下划线作为表的字段名

BaseMapper 中提供的 CRUD 方法

  • 通用 CRUD 封装 BaseMapper 接口,为 Mybatis-Plus 启动时自动解析实体表关系映射转换为 Mybatis 内部对象注入容器

  • 参数 Serializable 为任意类型主键 Mybatis-Plus 不推荐使用复合主键约定每一张表都有自己的唯一 id 主键

  • 对象 Wrapper 为条件构造器

@Param

@Param 是 Mybatisplus 提供的注解之一,用于给 SQL 语句中的参数命名,以便在 XML 映射文件中使用这些命名参数,解决 Mybatisplus 在处理多个参数时无法识别参数名的问题。

使用 @Param 注解可以解决 Mybatisplus 在处理多个参数时无法识别参数名的问题。通过为参数添加 @Param 注解,可以在 SQL 语句中使用指定的参数名进行引用。

新增:insert

MyBatis 提供了方便的插入方法,允许我们插入单条记录到数据库中。

// 插入一条记录
int insert(T entity);

调用此方法时,需要传入一个与数据库表结构相对应的 Java 对象(Entity),MyBatis 会根据对象的属性自动生成 INSERT 语句,并将属性值填充到 SQL 语句中。

删除:delete

MyBatis 提供了多种删除方法,包括根据条件删除、根据 ID 删除等。

// 根据 wrapper 条件,删除记录
int delete(@Param(Constants.WRAPPER) Wrapper<T> wrapper);// 删除(根据ID 批量删除)
int deleteBatchIds(@Param(Constants.COLLECTION) Collection<? extends Serializable> idList);// 根据 ID 删除
int deleteById(Serializable id);// 根据 columnMap 条件,删除记录
int deleteByMap(@Param(Constants.COLUMN_MAP) Map<String, Object> columnMap);
修改:update
  • update 方法:根据条件更新记录
  • updateById 方法:根据 ID 更新记录

示例代码与解释:

// 根据 whereWrapper 条件,更新记录
int update(@Param(Constants.ENTITY) T updateEntity,
@Param(Constants.WRAPPER) Wrapper<T> whereWrapper);// 根据 ID 修改
int updateById(@Param(Constants.ENTITY) T entity);
查询:selete
  • selectById:根据 ID 查询
  • selectOne:根据条件查询一条记录
  • selectBatchIds:根据 ID 列表批量查询
  • selectList:根据条件查询全部记录
  • selectByMap:根据 Map 条件查询
  • selectMaps:查询全部记录并返回 Map 列表
  • selectObjs:查询全部记录并只返回第一个字段的值
  • selectPageselectMapsPage:分页查询

示例代码与解释:

// 根据 ID 查询
T selectById(Serializable id);// 根据 entity 条件,查询一条记录
T selectOne(@Param(Constants.WRAPPER) Wrapper<T> queryWrapper);// 查询(根据ID 批量查询)
List<T> selectBatchIds(@Param(Constants.COLLECTION) Collection<? extends Serializable> idList);// 根据 Wrapper 条件,查询全部记录
List<T> selectList(@Param(Constants.WRAPPER) Wrapper<T> queryWrapper);// 查询(根据 columnMap 条件)
List<T> selectByMap(@Param(Constants.COLUMN_MAP) Map<String, Object> columnMap);// 根据 Wrapper 条件,查询全部记录
List<Map<String, Object>> selectMaps(@Param(Constants.WRAPPER) Wrapper<T> queryWrapper);// 根据 Wrapper 条件,查询全部记录。注意: 只返回第一个字段的值
List<Object> selectObjs(@Param(Constants.WRAPPER) Wrapper<T> queryWrapper);// 根据 entity 条件,查询全部记录(并翻页)
IPage<T> selectPage(IPage<T> page, @Param(Constants.WRAPPER) Wrapper<T> queryWrapper);// 根据 Wrapper 条件,查询全部记录(并翻页)
IPage<Map<String, Object>> selectMapsPage(IPage<T> page, @Param(Constants.WRAPPER) Wrapper<T> queryWrapper);// 根据 Wrapper 条件,查询总记录数
Integer selectCount(@Param(Constants.WRAPPER) Wrapper<T> queryWrapper);

示例

当使用 MyBatis-Plus 的 BaseMapper 时,以下是一些示例来展示其功能和用法。我们将按照不同的操作类型进行分点表示和归纳。

创建实体类
public Class User{private String userId;private String name;private Integer age;private Integer gender;
}
继承 BaseMapper
public interface UserMapper extends BaseMapper<User>{// 在这里可以定义自己的方法
}
插入操作
  • insert(T entity): 插入一条记录到数据库中。
// 假设 User 是一个实体类
User user = new User();
user.setName("John Doe");
user.setAge(30);
// ... 设置其他属性// 注入 UserMapper
@Autowired
private UserMapper userMapper;// 调用 insert 方法插入用户
int result = userMapper.insert(user);
if (result > 0) {// 插入成功
} else {// 插入失败
}
删除操作
  • deleteById(Serializable id): 根据主键 ID 删除一条记录。
// 假设要删除的用户 ID 为 1
Long userId = 1L;// 调用 deleteById 方法删除用户
int result = userMapper.deleteById(userId);
if (result > 0) {// 删除成功
} else {// 删除失败或用户不存在
}
更新操作
  • updateById(T entity): 根据主键 ID 更新一条记录。
// 假设要更新的用户 ID 为 1
User userToUpdate = new User();
userToUpdate.setId(1L);
userToUpdate.setName("Jane Doe"); // 更新名字
// ... 更新其他属性// 调用 updateById 方法更新用户
int result = userMapper.updateById(userToUpdate);
if (result > 0) {// 更新成功
} else {// 更新失败或用户不存在
}
查询操作
  • selectById(Serializable id): 根据主键 ID 查询一条记录。
// 假设要查询的用户 ID 为 1
Long userId = 1L;// 调用 selectById 方法查询用户
User user = userMapper.selectById(userId);
if (user != null) {// 查询成功,处理用户数据
} else {// 查询失败或用户不存在
}
  • selectList(Wrapper queryWrapper): 查询所有符合条件的记录列表。
// 构造查询条件
QueryWrapper<User> queryWrapper = new QueryWrapper<>();
queryWrapper.eq("name", "John Doe"); // 查询名字为 John Doe 的用户// 调用 selectList 方法查询用户列表
List<User> userList = userMapper.selectList(queryWrapper);
if (!userList.isEmpty()) {// 查询成功,处理用户列表
} else {// 查询结果为空
}
  • selectPage(IPage page, Wrapper queryWrapper): 分页查询记录。
// 构造分页信息和查询条件
Page<User> page = new Page<>(1, 10); // 第一页,每页10条记录
QueryWrapper<User> queryWrapper = new QueryWrapper<>();
queryWrapper.like("name", "Doe"); // 查询名字包含 Doe 的用户// 调用 selectPage 方法分页查询用户
IPage<User> userPage = userMapper.selectPage(page, queryWrapper);
if (userPage.getRecords().size() > 0) {// 分页查询成功,处理用户分页数据
} else {// 分页查询结果为空
}

以上示例清晰地展示了 MyBatis-Plus 中 BaseMapper 的基本用法,包括插入删除更新查询操作。在实际开发中,可以根据需要选择合适的方法,并结合条件构造器(如 QueryWrapper)来实现更复杂的数据库操作。

总结

BaseMapper 的原理主要基于 MyBatis 的 Mapper 动态代理机制。在运行时,MyBatis-Plus 会动态生成 BaseMapper 接口的实现类,并通过 Java 反射机制来调用相应的数据库操作方法。

综上所述,BaseMapper 作为 MyBatis-Plus 的核心概念之一,通过提供一套基础的 CRUD 操作方法,大大简化了基于 MyBatis 的数据访问层代码的编写,提高了开发效率。

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

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

相关文章

如何解决跨区域文件传输存在的安全管控问题?

⼤型企业和集团为扩⼤市场份额、优化资源配置&#xff0c;会在不同地区设⽴多级下属分⽀机构、研发中心、实验室等&#xff0c;存在研发数据横向或纵向流转的需求&#xff0c;研发数据进行跨区域文件传输的场景。跨区域可能是网络区域&#xff0c;也可能是地理区域&#xff0c;…

2-10 基于matlab的动态时间归整(DTW)算法

基于matlab的动态时间归整&#xff08;DTW&#xff09;算法。16页的试验文档。以一个能识别数字0&#xff5e;9的语音识别系统的实现过程为例&#xff0c;阐述了基于DTW算法的特定人孤立词语音识别的基本原理和关键技术。其中包括对语音端点检测方法、特征参数计算方法和DTW算法…

MT1318 完美平方

题目 输入正整数N&#xff0c;检查它是否为完美平方。完美平方数是指1个平方数可以分成两部分后&#xff0c;每个部分仍然是平方数。如497 * 7&#xff0c;分成4和9&#xff0c;4和9都是平方数。再如168141*41&#xff0c;1681分成16和81&#xff0c;也都是平方数。 格式 输…

elasticsearch的安装和配置

单节点安装与部署 我们通过docker进行安装 1.docker的安装 如果以及安装了docker就可以跳过这个步骤。 首先更新yum: yum update安装docker: yum install docker查看docker的版本&#xff1a; docker -v此时我们的docker就安装成功了。 2.创建网络 我们还需要部署kiban…

八大排序————C语言版实现

Hello&#xff0c;各位未来的高级程序员们&#xff0c;大家好&#xff0c;今天我就来为大家讲解一下有关排序的内容&#xff0c;我们常见的排序就是我们接下来要讲的这八个排序&#xff0c;我们平常所说的排序有十大排序&#xff0c;我们这里的八大排序是我们生活中最为常见的八…

idea的右边栏maven不见了(丢了)解决方案以及idea无法识别maven项目

前言 众所周知&#xff0c;idea是java开发中不可缺少的利器&#xff0c;但是由于功能过多&#xff0c;导致奇怪的问题也很多 问题汇总 idea的右边栏maven丢了 idea无法识别maven项目 对应的解决办法 idea的右边栏maven丢了 原因可能是被自己手动移除了 或者 项目没被正确…

CTF入门指南

何为CTF &#xff1f; CTF&#xff08;Capture The Flag&#xff09;夺旗比赛&#xff0c;在网络安全领域中指的是网络安全技术人员之间进行技术竞技的一种比赛形式。CTF起源于1996年DEFCON全球黑客大会&#xff0c;以代替之前黑客们通过互相发起真实攻击进行技术比拼的方式。…

研究Redis源码的一些前期准备

一 背景 Redis数据结构讲完后&#xff0c;觉得还是有点不过瘾&#xff0c;想研究一下Redis的底层实现。找了一些相关资料&#xff0c;准备借鉴和学习其他各位大佬钻研Redis底层的方法和经验&#xff0c;掌握Redis实现的基本原理。 二 源码归类 网上有大佬已经总结了…

IPC工业电脑的现状、发展未来与破局策略

文章目录 全球工业电脑市场概况1.1 市场规模与增长1.2 区域分布与主要市场 工业电脑的技术发展与应用2.1 技术趋势与创新2.2 应用领域扩展2.3 工业自动化与智能化 竞争格局与市场参与者3.1 主要企业与市场竞争3.2 国内外竞争对比3.3 市场集中度与竞争策略 未来发展趋势与市场预…

Unity3D 大地图分块:分块编辑小AStar地图详解

在Unity3D中&#xff0c;处理大型游戏地图时&#xff0c;通常会遇到性能问题&#xff0c;特别是在进行路径寻找&#xff08;如A算法&#xff09;时。为了优化性能&#xff0c;我们通常会将大地图分块&#xff08;Chunking&#xff09;&#xff0c;并在每个块上单独应用A算法。这…

utf8和utf8mb4的主要区别

utf8和utf8mb4的主要区别可以总结为以下几点&#xff1a; 编码能力&#xff1a; utf8&#xff1a;在MySQL中&#xff0c;utf8编码最大字符长度为3字节。这意味着它支持Unicode中的基本多文种平面&#xff08;BMP&#xff09;&#xff0c;其字符范围是U0000至UFFFF。utf8mb4&am…

算法训练 | 动态规划Part5 | 518.零钱兑换 II、377.组合总和 Ⅳ 、70.爬楼梯 (进阶)

目录 518. 零钱兑换 II 动态规划法 377. 组合总和 Ⅳ 动态规划法 70. 爬楼梯 &#xff08;进阶&#xff09; 动态规划法 518. 零钱兑换 II 题目链接&#xff1a;518. 零钱兑换 II - 力扣&#xff08;LeetCode&#xff09; 文章讲解&#xff1a;代码随想录 动态规划法…

一键简易桌签(带背景)-Word插件-大珩助手

问题整理&#xff1a; 如何Word中设计简易桌签&#xff1f;如何设置带背景图的桌签&#xff1f; Word大珩助手是一款功能丰富的Office Word插件&#xff0c;旨在提高用户在处理文档时的效率。它具有多种实用的功能&#xff0c;能够帮助用户轻松修改、优化和管理Word文件&…

基于改进贝叶斯学习的旋转机械故障诊断(MATLAB)

贝叶斯理论的基础是18世纪的英国数学家Bayes提出的贝叶斯公式&#xff0c;Bayes在统计决策函数、统计推断以及和统计的估算等数学领域都做出了重要贡献。19世纪&#xff0c;法国数学家Laplace创作的《概率的分析理论》一文利用了贝叶斯分析&#xff0c;但由于当时贝叶斯理论在实…

微信小程序使用方法

一.在网页注册小程序账号&#xff08;在未注册的情况下&#xff09; 1.如果你还没有微信公众平台的账号&#xff0c;请先进入微信公众平台首页&#xff0c;点击 “立即注册” 按钮进行注册。我们选择 “小程序” 即可。 接着填写账号信息&#xff0c;需要注意的是&#xff0c;…

FreeRTOS源码分析

目录 1、FreeRTOS目录结构 2、核心文件 3、移植时涉及的文件 4、头文件相关 4.1 头文件目录 4.2 头文件 5、内存管理 6、入口函数 7、数据类型和编程规范 7.1 数据类型 7.2 变量名 7.3 函数名 7.4 宏的名 1、FreeRTOS目录结构 使用 STM32CubeMX 创建的 FreeRTOS 工…

每日练题(py,c,cpp)

检验素数 from math import sqrt a int(input("请输入一个数&#xff1a;")) for i in range(2,int(sqrt(a))):if a%i 0:print("该数不是素数")breakelse: print("该数是素数")# # 1既不是素数也不是合数 # #可以用flag做标志位 # b int(…

Opencv学习项目1——pytesseract

最近开始学习opencv使用&#xff0c;跟着b站一起做实战项目&#xff0c;跟大家分享一下学习成果&#xff0c;大佬勿喷 项目演示 pytesseract 是一个用于文字识别&#xff08;OCR&#xff0c;光学字符识别&#xff09;的 Python 库&#xff0c;它是 Tesseract OCR 引擎的 Python…

ARM服务器虚拟化手机,云手机推流应用案例

大家都知道&#xff0c;ARM 服务器虚拟化手机和云手机推流技术可算是热门话题&#xff0c;不止是企业&#xff0c;个人卖家也会通过云手机推流来获得更多的客源&#xff0c;实现经济自由&#xff0c;但是针对云手机的推流&#xff0c;很多人还是不知道有哪些应用场景~我们可以展…

一文详解分布式 ID

分布式系统中&#xff0c;我们经常需要对数据、消息等进行唯一标识&#xff0c;这个唯一标识就是分布式 ID&#xff0c;那么我们如何设计它呢&#xff1f;本文将详细讲述分布式 ID 及其生成方案。 一、为什么需要分布式 ID 目前大部分的系统都已是分布式系统&#xff0c;所以在…