【JavaEE】MyBatis - Plus

目录

  • 一、快速使用
  • 二、CRUD简单使用
  • 三、常见注解
    • 3.1 @TableName
    • 3.2 @TableFiled
    • 3.3 @TableId
  • 四、条件构造器
    • 4.1 QueryWrapper
    • 4.2 UpdateWrapper
    • 4.3 LambdaQueryWrapper
    • 4.4 LambdaUpdateWrapper
  • 五、自定义SQL

一、快速使用

MyBatis Plus官方文档:MyBatis Plus官方文档

添加依赖:官方文档都有。
Spring Boot 3的依赖:

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

配置文件:

mybatis-plus:configuration:# MyBatis 配置map-underscore-to-camel-case: trueglobal-config:# 全局配置db-config:# 数据库配置id-type: auto

也要配置数据库:

spring:datasource:url: jdbc:mysql://127.0.0.1:3306/mybatis_test?characterEncoding=utf8&useSSL=falseusername: rootpassword: 1234driver-class-name: com.mysql.cj.jdbc.Driver

再写实体类,

package com.example.mybatisplus.demo.model;import lombok.Data;import java.util.Date;
@Data
public class UserInfo {private Integer id;private String username;private String password;private Byte age;private Byte gender;private String phone;private Byte deleteFlag;private Date createTime;private Date updateTime;}

写Mapper接口,要继承BaseMapper,泛型指代要操作的实体类。

package com.example.mybatisplus.demo.mapper;import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.example.mybatisplus.demo.model.UserInfo;
import org.apache.ibatis.annotations.Mapper;@Mapper
public interface UserInfoMapper extends BaseMapper<UserInfo> {
}

打印日志配置:

mybatis-plus:configuration:# 配置打印 MyBatis⽇志 log-impl: org.apache.ibatis.logging.stdout.StdOutImpl

二、CRUD简单使用

直接调用对应方法即可,方法名十分清晰。

  • 增:



  • 查:

三、常见注解

如果我们的数据库设计是按照蛇形标准来设计数据库名以及字段名的话,驼峰方式命名类属性的话,MyBatis Plus会自动帮我们映射,但是如果有不和规范无法映射的话,就需要使用注解来帮我们映射。

3.1 @TableName

@TableName是类注解,用来表示当前类对应的数据库表名。

通过错误日志可以看见mybatis-Plus是通过我们的类名去找表名的,当不符合规范就会找不到,但是加上@TableName注解讲明表名,就可以找到。

3.2 @TableFiled

@TableFiled注解这个是属性注解,跟@TableName作用一样,是用来对应当不符合规范命名时,对应类属性与数据库表字段的。

 @TableField("update_time")private Date updateTime;

3.3 @TableId

@TableId注解,是用来对应主键的。MyBatis - Plus默认主键是id,但是如果主键不是,就可以加上该注解表明这是主键对应的属性。还可以用 @TableId注解的type属性来设置当前是否是自增的。

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

四、条件构造器

前面介绍的都是简单的CRUD,在实际的应⽤场景中,我们还需要使⽤更复杂的操作,MyBatisPlus也给我们提供了相应的⽀持。
MyBatis-Plus 提供了⼀套强⼤的条件构造器(Wrapper),⽤于构建复杂的数据库查询条件。Wrapper 类允许开发者以链式调⽤的⽅式构造查询条件,⽆需编写繁琐的 SQL 语句, 从⽽提⾼开发效率并减少 SQL注⼊的⻛险。

以下是主要的 Wrapper 类及其功能:

  • AbstractWrapper:这是⼀个抽象基类,提供了所有 Wrapper 类共有的⽅法和属性。详情看官网
  • QueryWrapper:⽤于构造查询条件,在AbstractWrapper的基础上拓展了⼀个select⽅法,允许指定查询字段。
  • UpdateWrapper: ⽤于构造更新条件,可以在更新数据时指定条件。
  • LambdaQueryWrapper:基于 Lambda 表达式的查询条件构造器,它通过 Lambda 表达式来引⽤实体类的属性,从⽽避免了硬编码字段名。
  • LambdaUpdateWrapper:基于 Lambda 表达式的更新条件构造器, 它允许你使⽤ Lambda 表达式来指定更新字段和条件,同样避免了硬编码字段名的问题。

介绍一些简写过的方法:

  • lt : “less than” 的缩写,表⽰⼩于.
  • le : "less than or equal to"的缩写, 表⽰⼩于等于
  • ge : “greater than or equal to” 的缩写, 表⽰⼤于等于.
  • gt : “greater than” 的缩写, 表⽰⼤于.
  • eq : “equals” 的缩写, 表⽰等于.
  • ne : “not equals” 的缩写, 表⽰不等于.

4.1 QueryWrapper

QueryWrapper并不只⽤于查询语句, ⽆论是修改, 删除, 查询,后面需要跟条件查询的时候都可以使⽤QueryWrapper来构建查询条件。

例如下面的sql语句:

select id,username, password, age, gender from `user_info` where age = 18 and username  like "%s%"

结果如下:

当我们使用QueryMapper对应的代码如下:

@Testpublic void selectByCondition() {QueryWrapper<UserInfo> queryWrapper = new QueryWrapper<>();queryWrapper.select(" id","username", "password", "age", "gender").eq("age",18).like("username","s");System.out.println(userInfoMapper.selectList(queryWrapper));}

结果:

默认情况下Mybatis-Plus会根据 @TableFiled ⽣成别名, 当指定了QueryWrapper的select属性后就仅仅是属性值⽽没有了别名. 查询出来的结果会对应不上
解决办法:

  1. ⾃⼰写⾃定义SQL
  2. 实体类名和字段名保持⼀致
  3. 不指定QueryWrapper的select字段
  4. 使⽤LambdaQueryWrapper实现

4.2 UpdateWrapper

完成下面的sql语句:

update user_info set delete_flag = 1, age = age + 10 where id in(1,2,3)

运行前数据:

使用UpdateWrapper的代码:

@Testpublic void updateByCondition() {UpdateWrapper<UserInfo> updateWrapper = new UpdateWrapper<>();updateWrapper.set("delete_flag",1).setSql("age = age + 10").in("id", List.of(1,2,3));userInfoMapper.update(updateWrapper);}

运行后结果:

4.3 LambdaQueryWrapper

LambdaQueryWrapper是基于Lambda表达式的条件构造器,它通过 Lambda 表达式来引⽤实体类的属性,从⽽避免了硬编码字段名。也提⾼了代码的可读性和可维护性。

查询下面的sql

select id,username, password, age, gender from `user_info` where age = 28 and username  like "%s%"

结果:

对应的使用LambdaQueryWrapper的代码:

    @Testpublic void selectByCondition2() {LambdaQueryWrapper<UserInfo> lambdaQueryWrapper = new LambdaQueryWrapper<>();lambdaQueryWrapper.select(UserInfo::getId, UserInfo::getUsername, UserInfo::getPassword,UserInfo::getAge,UserInfo::getGender, UserInfo::getDeleteFlag).eq(UserInfo::getAge,28).like(UserInfo::getUsername,"s");System.out.println(userInfoMapper.selectList(lambdaQueryWrapper));}

结果:

4.4 LambdaUpdateWrapper

update user_info set delete_flag = 1, age = age - 10 where id in(1,2,3)

运行前数据:

对应使用LambdaUpdateWrapper代码:

@Testpublic void updateByCondition2() {LambdaUpdateWrapper<UserInfo> lambdaUpdateWrapper = new LambdaUpdateWrapper<>();lambdaUpdateWrapper.set(UserInfo::getDeleteFlag, 1).setSql("age = age - 10").in(UserInfo::getId, List.of(1,2,3));userInfoMapper.update(lambdaUpdateWrapper);}

执行结果:

五、自定义SQL

官方文档,MyBatis Plus官方文档介绍自定义SQL如下:

示例一:
SQL语句:

select id,username, password, age from `user_info` where age = 18 or username  like "%s%"

结果:

代码:

@Select(" select id,username, password, age from user_info  ${ew.customSqlSegment}")List<UserInfo> select (@Param(Constants.WRAPPER) Wrapper<UserInfo> wrapper);

测试代码:

    @Testvoid testSelect() {QueryWrapper<UserInfo> queryWrapper = new QueryWrapper<>();queryWrapper.eq("age",18).or().like("username","s");userInfoMapper.select(queryWrapper);}

结果:

示例二:
执行的SQL语句:

update user_info set delete_flag = 0, age = age + 10 where id in(1,2,3)

原始数据:

xml代码:

    <update id="update">update user_info set delete_flag = 0, age = age + #{age} ${ew.customSqlSegment}</update>

测试代码:

    @Testvoid testUpdate() {UpdateWrapper<UserInfo> updateWrapper = new UpdateWrapper<>();updateWrapper.in("id", List.of(1,2,3));userInfoMapper.update(10,updateWrapper);}

结果:

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

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

相关文章

采用前端技术开源了一个数据结构算法的可视化工具

今天要推荐的开源项目叫VisuAlgoX,是一个面向计算机科学和游戏开发的 交互式算法可视化工具&#xff0c;帮助用户通过直观的动画理解各种数据结构和算法。 项目的前身 由于最近在做一些关于游戏和图形化方面的文章&#xff0c;因此做了一部分相关算法的动态可视化来做配图展示…

体验智谱清言的AutoGLM进行自动化的操作(Chrome插件)

最近体验了很多的大模型&#xff0c;大模型我是一直关注着ChatGLM&#xff0c;因为它确实在7b和8b这档模型里&#xff0c;非常聪明&#xff01; 最近还体验了很多大模型的应用软件&#xff0c;比如Agently、5ire、 mcphost、 Dive、 NextChat等。但是这些一般都是图形界面或者…

pytorch中dataloader自定义数据集

前言 在深度学习中我们需要使用自己的数据集做训练&#xff0c;因此需要将自定义的数据和标签加载到pytorch里面的dataloader里&#xff0c;也就是自实现一个dataloader。 数据集处理 以花卉识别项目为例&#xff0c;我们分别做出图片的训练集和测试集&#xff0c;训练集的标…

Blender模型导入虚幻引擎设置

单位系统不一致 Blender默认单位是米&#xff08;Meters&#xff09;&#xff0c;而虚幻引擎默认使用**厘米&#xff08;Centimeters&#xff09;**作为单位。 当模型从Blender导出为FBX或其他格式时&#xff0c;如果没有调整单位&#xff0c;虚幻引擎会将1米&#xff08;Blen…

Docker基础详解

Docker 技术详解 一、概述 Docker官网&#xff1a;https://docs.docker.com/ 菜鸟教程&#xff1a;https://www.runoob.com/docker/docker-tutorial.html 1.1 什么是Docker&#xff1f; Docker 是一个开源的容器化平台&#xff0c;它允许开发者将应用程序和其依赖项打包到…

FastPillars:一种易于部署的基于支柱的 3D 探测器

FastPillars&#xff1a;一种易于部署的基于支柱的 3D 探测器Report issue for preceding element Sifan Zhou 1 , Zhi Tian 2 , Xiangxiang Chu 2 , Xinyu Zhang 2 , Bo Zhang 2 , Xiaobo Lu11{}^{1}start_FLOATSUPERSCRIPT 1 end_FLOATSUPERSCRIPT11footnotemark: 1 Chengji…

NLP语言模型训练里的特殊向量

1. CLS 向量和 DEC 向量的区别及训练方式 (1) CLS 向量与 DEC 向量是否都是特殊 token&#xff1f; CLS 向量&#xff08;[CLS] token&#xff09;和 DEC 向量&#xff08;Decoder Input token&#xff09;都是特殊的 token&#xff0c;但它们出现在不同类型的 NLP 模型中&am…

字节跳动 UI-TARS 汇总整理报告

1. 摘要 UI-TARS 是字节跳动开发的一种原生图形用户界面&#xff08;GUI&#xff09;代理模型 。它将感知、行动、推理和记忆整合到一个统一的视觉语言模型&#xff08;VLM&#xff09;中 。UI-TARS 旨在跨桌面、移动和 Web 平台实现与 GUI 的无缝交互 。实验结果表明&#xf…

基于Python深度学习的鲨鱼识别分类系统

摘要&#xff1a;鲨鱼是海洋环境健康的指标&#xff0c;但受到过度捕捞和数据缺乏的挑战。传统的观察方法成本高昂且难以收集数据&#xff0c;特别是对于具有较大活动范围的物种。论文讨论了如何利用基于媒体的远程监测方法&#xff0c;结合机器学习和自动化技术&#xff0c;来…

【漫话机器学习系列】168.最大最小值缩放(Min-Max Scaling)

在机器学习和数据预处理中&#xff0c;特征缩放&#xff08;Feature Scaling&#xff09; 是一个至关重要的步骤&#xff0c;它可以使模型更稳定&#xff0c;提高训练速度&#xff0c;并优化收敛效果。最大最小值缩放&#xff08;Min-Max Scaling&#xff09; 是其中最常见的方…

开源测试用例管理平台

不可错过的10个开源测试用例管理平台&#xff1a; PingCode、TestLink、Kiwi TCMS、Squash TM、FitNesse、Tuleap、Robot Framework、SpecFlow、TestMaster、Nitrate。 开源测试用例管理工具提供了一种透明、灵活的解决方案&#xff0c;使团队能够在不受限的情况下适应具体的测…

鸿蒙阔折叠Pura X外屏开发适配

首先看下鸿蒙中断点分类 内外屏开合规则 Pura X开合连续规则: 外屏切换到内屏,界面可以直接接续。内屏(锁屏或非锁屏状态)切换到外屏,默认都显示为锁屏的亮屏状态。用户解锁后:对于应用已适配外屏的情况下,应用界面可以接续到外屏。折叠外屏显示展开内屏显示折叠状态…

DRM_CLIENT_CAP_UNIVERSAL_PLANES和DRM_CLIENT_CAP_ATOMIC

drmSetClientCap(fd, DRM_CLIENT_CAP_UNIVERSAL_PLANES, 1); drmSetClientCap(fd, DRM_CLIENT_CAP_ATOMIC, 1); 这两行代码用于启用 Linux DRM&#xff08;Direct Rendering Manager&#xff09;客户端的两个关键特性&#xff0c;具体作用如下&#xff1a; 1. drmSetClientCap…

敏捷开发10:精益软件开发和看板kanban开发方法的区别是什么

简介 精益生产起源于丰田生产系统&#xff0c;核心是消除浪费&#xff0c;而看板最初是由丰田用于物料管理的信号卡片&#xff0c;后来被引入软件开发。 Kanban 后来引入到敏捷开发中&#xff0c;强调持续交付和流程可视化。 精益软件开发原则是基于精益生产的原则&#xff0…

用matlab探索卷积神经网络(Convolutional Neural Networks)-3

5.GoogLeNet中的Filters 这里我们探索GoogLeNet中的Filters&#xff0c;首先你需要安装GoogLeNet.在Matlab的APPS里找到Deep Network Designer,然后找到GoogLeNet&#xff0c;安装后的网络是没有右下角的黄色感叹号的&#xff0c;没有安装的神经网络都有黄色感叹号。 一个层&a…

Verilog中X态的危险:仿真漏掉的bug

由于Verilog中X态的微妙语义,RTL仿真可能PASS,而网表仿真却会fail。 目前进行的网表仿真越来越少,这个问题尤其严重,主要是网表仿真比RTL仿真慢得多,因此对整个回归测试而言成本效益不高。 上面的例子中,用Verilog RTL中的case语句描述了一个简单的AND函数,它被综合成AN…

PyTorch中知识蒸馏浅讲

知识蒸馏 在 PyTorch 中,使用 teacher_model.eval() 和冻结教师模型参数是知识蒸馏(Knowledge Distillation)中的关键步骤。 ​1. teacher_model.eval() 的作用 目的: 将教师模型切换到评估模式,影响某些特定层(如 Dropout、BatchNorm)的行为。 ​具体影响: ​Dropo…

Odoo/OpenERP 和 psql 命令行的快速参考总结

Odoo/OpenERP 和 psql 命令行的快速参考总结 psql 命令行选项 选项意义-a从脚本中响应所有输入-A取消表数据输出的对齐模式-c <查询>仅运行一个简单的查询&#xff0c;然后退出-d <数据库名>指定连接的数据库名&#xff08;默认为当前登录用户名&#xff09;-e回显…

ChatGPT 迎来 4o模型:更强大的图像生成能力与潜在风险

OpenAI 对 ChatGPT 进行重大升级&#xff0c;图像生成功能即将迎来新的 4o 模型&#xff0c;并取代原本的 DALLE。此次更新不仅提升了图像生成质量&#xff0c;还增强了对话内容和上传文件的融合能力&#xff0c;使 AI 生成的图像更加智能化和精准化。 4o 模型带来的革新 Ope…

Python 实现的运筹优化系统代码详解(整数规划问题)

一、引言 在数学建模的广袤领域里&#xff0c;整数规划问题占据着极为重要的地位。它广泛应用于工业生产、资源分配、项目管理等诸多实际场景&#xff0c;旨在寻求在一系列约束条件下&#xff0c;使目标函数达到最优&#xff08;最大或最小&#xff09;且决策变量取整数值的解决…