Mybatis_plus

前言

Mybatis_plus 是在 mybatis 的基础上进行了增强,在 MyBatis 的基础上只做增强不做改变,为简化开发、提高效率而生。本文章只做简单的使用介绍,更加详细的内容大家可以参考官网。

下面是mybatis_plus 官网地址:
mybatis_plus 官网

配置

springboot 3 maven 需要导入的依赖:

<dependency><groupId>com.baomidou</groupId><artifactId>mybatis-plus-spring-boot3-starter</artifactId><version>3.5.10.1</version>
</dependency>

这里要注意导入了 mybatis_plus 依赖之后就不用导入 mybatis 依赖了,避免依赖的冲突,上面已经说到 mybatis_plus 是 mybatis 的增强版,也就说说 mybatis_plus 其实内部已经配置了 mybatis 的依赖。

之后就要引入数据库的驱动依赖,这里以MySQL为例:

        <dependency><groupId>com.mysql</groupId><artifactId>mysql-connector-j</artifactId><scope>runtime</scope></dependency>

然后在 pom.xml 文件下,配置好数据库的相关信息:

spring:# 数据库连接配置datasource:url: jdbc:mysql://127.0.0.1:3306/数据库名称?characterEncoding=utf8&useSSL=false&allowPublicKeyRetrieval=trueusername: 用户名password: 密码driver-class-name: com.mysql.cj.jdbc.Driver

和 mybatis 一样,mybatis_plus 也可以进行下面的配置:

mybatis-plus:configuration:map-underscore-to-camel-case: true #配置驼峰自动转换log-impl: org.apache.ibatis.logging.stdout.StdOutImpl #打印sql语句

快速开始

和mybatis 一样,创建 mapper 文件夹,在里面创建数据库操作类,这里要注意 mybatis_plus 的类要继承 BaseMapper< T > ,这里面的泛型 T 填写你要操纵的类:

@Mapper
public interface BookInfoMapper extends BaseMapper<BookInfo> {}

之后我们就可以直接调用里面的方法了。

Wrapper

在 MyBatis-Plus 中,Wrapper 类是构建查询和更新条件的核心工具。以下是主要的 Wrapper 类及其功能:

AbstractWrapper:这是一个抽象基类,提供了所有 Wrapper 类共有的方法和属性。它定义了条件构造的基本逻辑,包括字段(column)、值(value)、操作符(condition)等。所有的 QueryWrapper、UpdateWrapper、LambdaQueryWrapper 和 LambdaUpdateWrapper 都继承自 AbstractWrapper。

QueryWrapper:专门用于构造查询条件,支持基本的等于、不等于、大于、小于等各种常见操作。它允许你以链式调用的方式添加多个查询条件,并且可以组合使用 and 和 or 逻辑。

UpdateWrapper:用于构造更新条件,可以在更新数据时指定条件。与 QueryWrapper 类似,它也支持链式调用和逻辑组合。使用 UpdateWrapper 可以在不创建实体对象的情况下,直接设置更新字段和条件。

LambdaQueryWrapper:这是一个基于 Lambda 表达式的查询条件构造器,它通过 Lambda 表达式来引用实体类的属性,从而避免了硬编码字段名。这种方式提高了代码的可读性和可维护性,尤其是在字段名可能发生变化的情况下。

LambdaUpdateWrapper:类似于 LambdaQueryWrapper,LambdaUpdateWrapper 是基于 Lambda 表达式的更新条件构造器。它允许你使用 Lambda 表达式来指定更新字段和条件,同样避免了硬编码字段名的问题。

三个注解

@TableName

用于类指定对应的表明,如果类名命名不规范,mybatis_plus 是找不到对应的表的

假设我们要操控的表为 book_info ,如果你设置的类名不规范,正常来说应该为 BookInfo,假设你的类名为 Bookinfo,这时候mybatis_plus 是找不到表的:
在这里插入图片描述

这时候我们可以使用 @TableName 来指定表名:

在这里插入图片描述

@TableField

如果类的属性命名不规范,mybatis_plus 还是找不到对应的字段:

假设字段名为 book_name , 属性命名为 bookname:
在这里插入图片描述

这时候就可以使用 @TableField 来指定字段名:
在这里插入图片描述

@TableId

mybatis_plus 是不知道表的主键的

如果你类属性命名不规范,无法映射为主键的话,可以使用 @TableId 来指定主键:
假设主键为 id ,但是属性为 bookId

    @TableId("id")private Integer boookId;

如果主键和属性可以映射,并且你的主键是会自增的话,要使用 @TableId(type = IdType.AUTO) 来说明该主键为自增。否则的话,mybaits_plus 是不知道你的主键是会自增的,那么它就会自己生成一个数值来进行填充。

    @TableId(type = IdType.AUTO)private Integer id;

如果主键和属性映射不了,并且主键还是一个自增的话,可以这样写:

    @TableId(value = "id", type = IdType.AUTO)private Integer bookId;

QueryWrapper

示例:

    @Testvoid select2() {QueryWrapper<Bookinfo> wrapper = new QueryWrapper<>();wrapper.select("id, book_name, author, count").gt("count", 20);bookInfoMapper.selectList(wrapper).stream().forEach(System.out::println);}

由于直接使用 QueryWrapper 会写死字段,也就会产生硬编码的问题,所以我们可以使用 LambdaQueryWrapper 用过 Lamda 表达式来指定对应的字段名即可

示例:
可以通过 lambda() 方法将 QueryWrapper 转化为 LambdaQueryWrapper

    @Testvoid select3() {QueryWrapper<Bookinfo> wrapper = new QueryWrapper<>();wrapper.lambda().select(Bookinfo::getId, Bookinfo::getBookname, Bookinfo::getAuthor, Bookinfo::getCount).gt(Bookinfo::getCount, 20);bookInfoMapper.selectList(wrapper).stream().forEach(System.out::println);}
    @Testvoid select4() {LambdaQueryWrapper<Bookinfo> wrapper = new LambdaQueryWrapper<>();wrapper.select(Bookinfo::getId, Bookinfo::getBookname, Bookinfo::getAuthor, Bookinfo::getCount).gt(Bookinfo::getCount, 20);bookInfoMapper.selectList(wrapper).stream().forEach(System.out::println);}

UpdateWrapper

示例:

    @Testvoid select4() {UpdateWrapper<Bookinfo> wrapper = new UpdateWrapper<>();wrapper.set("book_name", "mybatis_plus").set("author","people").set("count",45).in("id", 41);bookInfoMapper.update(wrapper);}

当然也可以使用 Lambda() 方法,使用 LambdaUpdateWrapper:

    @Testvoid select5() {UpdateWrapper<Bookinfo> wrapper = new UpdateWrapper<>();wrapper.lambda().set(Bookinfo::getBookname, "mybatis_plus").set(Bookinfo::getAuthor,"people").set(Bookinfo::getCount,45).in(Bookinfo::getId, 40);bookInfoMapper.update(wrapper);}

或者直接使用LambdaUpdateWrapper

@Testvoid select6() {LambdaUpdateWrapper<Bookinfo> wrapper = new LambdaUpdateWrapper<>();wrapper.set(Bookinfo::getBookname, "mybatis_plus").set(Bookinfo::getAuthor,"people").set(Bookinfo::getCount,45).in(Bookinfo::getId, 40);bookInfoMapper.update(wrapper);}

自定义 SQL

我们可以正常使用 mybatis 定义sql 语句的方式,使用 @Select、@Update、@Delete、@Insert 或者使用 xml 的方式来定义 sql

当然你也可以使用 Wrapper 的条件:

参数命名:在自定义 SQL 时,传递 Wrapper 对象作为参数时,参数名必须为 ew,或者使用注解 @Param(Constants.WRAPPER) 明确指定参数为 Wrapper 对象。
使用 ${ew.customSqlSegment}:在 SQL 语句中,使用 ${ew.customSqlSegment} 来引用 Wrapper 对象生成的 SQL 片段。
不支持基于 entity 的 where 语句:自定义 SQL 时,Wrapper 对象不会基于实体类自动生成 where 子句,你需要手动编写完整的 SQL 语句。

示例:

@Mapper
public interface BookInfoMapper extends BaseMapper<Bookinfo> {@Select("select * from book_info ${ew.customSqlSegment}")List<Bookinfo> selectByIdAndBookName(@Param(Constants.WRAPPER) Wrapper<Bookinfo> wrapper);
}
    @Testvoid selectByBokNamwAndAuthor() {QueryWrapper<Bookinfo> wrapper = new QueryWrapper<>();wrapper.in("id", List.of(9, 28)).like("book_name","图书一号");bookInfoMapper.selectByIdAndBookName(wrapper).stream().forEach(System.out::println);}

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

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

相关文章

深圳问顶安全科技有限公司asktopsec是做什么的?

深圳问顶安全科技有限公司&#xff0c;是一家专业的AI与应用安全公司。 全球领先的AI、Android、IOS应用安全解决方案提供商&#xff0c;官网&#xff1a;https://asktopsec.com 问顶安全主要为企业提供AI和应用安全服务 移动应用安全检测、移动应用安全加固、AI智能体安全、AI…

鸿蒙OS 5 架构设计探秘:从分层设计到多端部署

文章目录 鸿蒙OS架构设计探秘&#xff1a;从分层设计到多端部署一、鸿蒙的分层架构设计二、模块化设计的精髓三、智慧分发设计&#xff1a;资源的动态调度四、一次开发&#xff0c;多端部署的实践总结与思考 鸿蒙OS架构设计探秘&#xff1a;从分层设计到多端部署 最近两年来&a…

idea 没有 add framework support(添加框架支持)选项

在 IntelliJ IDEA 2023 中&#xff0c;若需通过设置手动添加 “添加框架支持” 菜单项&#xff0c;可按照以下步骤操作&#xff1a; 手动添加 “添加框架支持” 菜单项 打开设置 点击顶部菜单栏的 File&#xff08;文件&#xff09; -> Settings&#xff08;设置&#xff09…

计算机网络--传输层(2)

传输层核心机制深度解析 一、可靠传输实现机制 1. 校验和机制 技术原理&#xff1a; 使用16位二进制反码求和算法&#xff0c;计算范围包括TCP伪首部&#xff08;12字节&#xff09;、TCP首部&#xff08;20字节&#xff09;和数据部分接收端重新计算校验和&#xff0c;若与…

再探带权并查集

典型例题 Acwing 权值 故名思义&#xff0c;在带权并查集中&#xff0c;我们需要让每个节点携带一个**“权值”**。 那么这个权值应该是什么呢&#xff1f;其实答案就在并查集当中。 由于在并查集当中我们可以在 O ( 1 ) O(1) O(1) 时间内找到一个节点的根节点&#xff0c;那…

Vala编成语言教程-构造函数和析构函数

构造函数 Vala支持两种略有不同的构造方案&#xff1a;我们将重点讨论Java/C#风格的构造方案&#xff0c;另一种是GObject风格的构造方案。 Vala不支持构造函数重载的原因与方法重载不被允许的原因相同&#xff0c;这意味着一个类不能有多个同名构造函数。但这并不构成问题&…

本地部署Stable Diffusion生成爆火的AI图片

直接上代码 Mapping("/send") Post public Object send(Body String promptBody) { JSONObject postSend new JSONObject(); System.out.println(promptBody); JSONObject body JSONObject.parseObject(promptBody); List<S…

python爬虫WASM

WASM 一.WASM简介 1.1 WASM定义 ​ WebAssembly(简称wasm)是一个虚拟指令集体系架构(virtual ISA),整体架构包括核心的ISA定义、二进制编码、程序语义的定义与执行,以及面向不同的嵌入环境(如Web)的应用编程接口(WebAssembly API)。是一种运行在现代网络浏览器中的…

Docker镜像迁移方案

Docker镜像迁移方案 文章目录 Docker镜像迁移方案一&#xff1a;背景二&#xff1a;操作方式三&#xff1a;异常原因参考&#xff1a; 一&#xff1a;背景 比如机器上已经有先有的容器&#xff0c;但是docker pull的时候是失败的二&#xff1a;操作方式 1、停止正在运行的容器…

关于跨域问题(本地前端访问服务器端接口跨域出错)

问题来源&#xff1a; 当服务器封装了接口但是本地电脑端前端访问出现跨域问题。 解决方案&#xff1b; 1、使用ipconfig 查看本地电脑的ip地址 ipconfig 2、在后端接口处配置如下代码 allow_origins["http://本地ip地址:3001", # 局域网内其他设备访问的本地…

边缘计算 vs. 云计算,谁才是工业物联网的未来?

前言 在物联网&#xff08;IoT&#xff09;飞速发展的今天&#xff0c;边缘计算正在彻底改变数据的处理、存储和分析方式。传统的IoT设备数据通常需要发送到云端进行处理&#xff0c;但随着设备数量的激增&#xff0c;这种模式在延迟、带宽和安全性方面暴露出诸多局限。边缘计…

dell 台式机 电脑 纽扣电池 如何取下?

dell 台式机 电脑 纽扣电池 如何取下&#xff1f; 戴尔-optiplex-3060-塔式机-服务手册

NFC 智能门锁全栈解决方案:移动端、服务器、Web 管理平台

目录 一、系统整体架构 二、移动端 APP 开发 2.1 开发环境与基础准备 2.2 主要功能模块 2.3 示例代码&#xff08;Android/Kotlin 简化示例&#xff09; 三、后台服务开发 3.1 环境准备 3.2 主要功能 3.3 示例代码&#xff08;Node.js Express 简化示例&#xff09; …

DDR4、DDR5、固态硬盘(SSD)和机械硬盘(HDD)在连续读/写、随机读/写性能的对比分析

以下是关于DDR4、DDR5、固态硬盘&#xff08;SSD&#xff09;和机械硬盘&#xff08;HDD&#xff09;在连续读/写、随机读/写性能的对比分析&#xff0c;结合技术特性与应用场景的总结&#xff1a; 一、性能对比表格 存储类型连续读&#xff08;MB/s&#xff09;连续写&#x…

【AI】MAC版本本地Stable Diffusion web ui安装

文章目录 前言环境依赖homebrewpython3下载stable-diffusion-webui webui模型准备模型网站 中文页面设置提示词转汉语转英文controlnet安装controlnet模型下载 结尾 前言 目前&#xff0c;市面上已经出现了很多用Ai 绘图制作的作品&#xff0c;用于自媒体或者商业等。例如表情…

Linux 云服务器开放端口

首先找到你买服务器的官网&#xff0c;我这里是阿里云 点击这里的控制台 这里先点手动添加&#xff0c;再看自己是UDP还是TCP协议&#xff0c;找到对应的协议&#xff0c;目的就填你想开放的端口&#xff0c;源填所有IP/4 0.0.0.0 添加备注点击保存就开放好了。

[unity 点击事件] 区域响应点击事件,排除子节点区域,Raycast Target 应用

当我打开一个二级弹窗后&#xff0c;希望可以通过点击弹窗以外的区域来关闭该弹窗。一开始我是在弹窗主节点上挂载了一个 button 组件&#xff0c;该 button 注册的点击事件中关闭该弹窗。在子节点&#xff08;一个背景图&#xff09;的image组件上启用 Raycast Target 选项&am…

表的约束及代码练习

一.表的约束 查看表&#xff1a;mysql> select * from t_hero; 1.设置t_hero的主键为t_id alter table t_hero add primary key(t_id); 2.设置t_hero t_id属性非空 alter table t_hero modify t_id int not null;3.设置name属性为非空非重复 alter table t_hero modify…

Linux笔记---动静态库(使用篇)

目录 1. 库的概念 2. 静态库&#xff08;Static Libraries&#xff09; 2.1 静态库的制作 2.2 静态库的使用 2.2.1 显式指定库文件及头文件路径 2.2.2 将库文件安装到系统目录 2.2.3 将头文件安装到系统目录 3. 动态库 3.1 动态库的制作 3.2 动态库的使用 3.2.1 显式…

Java并发编程2(锁-Sychronized)

目录 认识Java对象头 sychronized锁原理 基本概念 工作原理 1.作用在方法上 2.作用在代码块上 工作机制 JVM优化锁 Monitor锁 wait/notify park/unpark 线程状态转换案例 死锁 概念 死锁发生的必要条件 哲学家问题 活锁 饥饿 概念 饥饿的原因 Reentrant…