Java EE 进阶:MyBatis-plus

MyBatis-plus的介绍

MyBatis-plus是MyBatis的增强工具,在MyBatis的基础上做出加强,只要MyBatis有的功能MyBatis-plus都有。

MyBatis-plus的上手

添加依赖

在我们创建项目的时候,我们需要添加MyBatis-plus和mysql的依赖

MyBatis-plus的依赖

<dependency><groupId>com.baomidou</groupId><artifactId>mybatis-plus-boot-starter</artifactId><version>3.5.7</version></dependency>

Mysql的依赖 

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

配置数据库

spring:datasource:url: jdbc:mysql://127.0.0.1:3306/mybatis_test?characterEncoding=utf8&useSSL=false&allowPublicKeyRetrieval=true&serverTimezone=Asia/Shanghaiusername: rootpassword: 123456driver-class-name: com.mysql.cj.jdbc.Drivermybatis-plus:configuration:log-impl: org.apache.ibatis.logging.stdout.StdOutImplmapper-locations: "classpath*:/mapper/**.xml" # Mapper.xml

首先我们创建UserInfo类

实体类中的属性和表中的字段要一一对应。

@Data
@TableName("user_info")
public class UserInfo {@TableId("id" )private Integer id;@TableField("username")private String username;private String password;private Integer age;private Integer gender;private String phone;private Integer deleteFlag;private Date createTime;private Date updateTime;
}

编写一个Mapper接口 

@Mapper
public interface UserInfoMapper extends BaseMapper<UserInfo> {

MyBatis-plus提供一个基础的BaseMapper接口,已经实现了单表的增删改查,我们自己的Mapper接口只需要继承这个BaseMapper接口,就可以实现单表的增删改查了

 

CRUD

我们来简单的测试一下MyBatis-plus的CRUD

@SpringBootTest
class UserInfoMapperTest {@Autowiredprivate UserInfoMapper userInfoMapper;@Testvoid select() {userInfoMapper.selectById(1);}@Testvoid update() {UserInfo userInfo = new UserInfo();userInfo.setId(1);userInfo.setAge(12);userInfo.setPassword("5556666");userInfoMapper.updateById(userInfo);}@Testvoid insert() {UserInfo userInfo = new UserInfo();userInfo.setId(27);userInfo.setAge(3);userInfo.setPassword("3");userInfo.setUsername("123333");userInfoMapper.insert(userInfo);}@Testvoid delete() {userInfoMapper.deleteById(8);
}

 @TableName

修改实体类名UserInfo为Userinfo

我们可以用@TableName来标识实体类对应的表

@Data@TableName("user_info")public class Userinfo {private Integer id;private String username;private String password;private Integer age;private Integer gender;private String phone;private Integer deleteFlag;private Date createTime;private Date updateTime;}

 @TableField

修改属性名deleteFlag为deleteflag

@TableField("delete_flag")private Integer deleteflag;

@TableId

修改属性名id为userId

我们可以通过@TableId来指定对应的主键

@TableId("id")private Integer userId;

 

条件构造器

QueryWrapper

⽤于构造查询条件,在AbstractWrapper的基础上拓展了⼀个select⽅法,允许指定查询字段,QueryWrapper并不只用于查询语句,无论是修改,删除,查询都可以使用QueryWrapper来构造条件

Select

SELECT id,username,password,age FROM user_info WHERE age = 18 AND username 
"%min%"
 void selectByCondition() {QueryWrapper<UserInfo> queryWrapper = new QueryWrapper<UserInfo>().select("username", "password", "id", "age").eq("age", 18).like("username", "min");List<UserInfo> userInfos = userInfoMapper.selectList(queryWrapper);userInfos.forEach(x -> System.out.println(x));}

Update 

UPDATE user_info SET delete_flag=? WHERE age < 20
@Testvoid updateByCondition() {UserInfo userInfo = new UserInfo();userInfo.setDeleteFlag(1);QueryWrapper<UserInfo> queryWrapper = new QueryWrapper<UserInfo>().lt("age", 20);userInfoMapper.update(userInfo, queryWrapper);}

Delete

 DELETE FROM user_info WHERE age = 18
@Testvoid deleteByCondition(){QueryWrapper<UserInfo> queryWrapper =new QueryWrapper<UserInfo>().eq("age",18);userInfoMapper.delete(queryWrapper);}

 UpdateWrapper

对于更新,我们也可以直接使⽤UpdateWrapper,在不创建实体对象的情况下,直接设置更新字段和条件

UPDATE user_info SET delete_flag=0, age=5 WHERE id IN (1,2,3)
@Testvoid updateByCondition2(){UpdateWrapper<UserInfo> updateWrapper=new UpdateWrapper<UserInfo>().set("delete_flag",0).set("age",5).in("id",List.of(1,2,3));userInfoMapper.update(updateWrapper);}

 

 UPDATE user_info SET age = age+10 WHERE id IN (1,2,3)
@Testvoid updateByCondition3(){UpdateWrapper<UserInfo> updateWrapper=new UpdateWrapper<UserInfo>().setSql("age=age+10").in("id",List.of(1,2,3));userInfoMapper.update(updateWrapper);}

 LambdaQueryWrapper

 QueryWrapper和UpdateWrapper存在⼀个问题,就是需要写死字段名,如果字段名发⽣变更,可能会 因为测试不到位酿成事故。

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

@Testvoid selectByLambdaCondition() {QueryWrapper<UserInfo> queryWrapper=new QueryWrapper<UserInfo>();queryWrapper.lambda().select(UserInfo::getUsername,UserInfo::getPassword).eq(UserInfo::getAge,18);userInfoMapper.selectList(queryWrapper);}

 LambdaUpdateWrapper

@Testvoid updateByLambdaCondition(){UpdateWrapper<UserInfo> updateWrapper=new UpdateWrapper<UserInfo>();updateWrapper.lambda().set(UserInfo::getUsername,"123").set(UserInfo::getAge,12).in(UserInfo::getId,List.of(1,2,3));userInfoMapper.update(updateWrapper);}

 

⾃定义SQL

在实际的开发中,MyBatis-plus提供的操作不能满足我们的实际需求,MyBatis-plus也提供了自定义SQL的功能,我们可以用Wrapper构造查询条件,结合Mapper编写SQL

 select id,username,password,age FROM user_info WHERE username = "admin"
 @Select("select * from user_info ${ew.customSqlSegment}")List<UserInfo> queryUserByCustom(@Param(Constants.WRAPPER)Wrapper wrapper);
@Testvoid testQueryUserByCustom(){QueryWrapper<UserInfo> queryWrapper = new QueryWrapper<UserInfo>().eq("username","admin");userInfoMapper.queryUserByCustom(queryWrapper).forEach(System.out::println);}

注:

参数命名:在⾃定义SQL时,传递Wrapper对象作为参数时,参数名必须为 ew 或者使⽤注解 ${ew.customSqlSegment},明确指定参数为Wrapper对象

使用 ${ew.customSqlSegment} :在SQL语句中,使⽤ ${ew.customSqlSegment}来引⽤Wrapper对象⽣成的SQL⽚段.

不⽀持基于entity的where语句:⾃定义SQL时,Wrapper对象不会基于实体类⾃动⽣成 where⼦句,你需要⼿动编写完整的SQL语句

MyBatis-plus也支持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.blame.mybatisplus.mapper.UserInfoMapper"><select id="queryUserByCustom2" resultType="com.blame.mybatisplus.model.UserInfo">select id,username,password,age FROM user_info ${ew.customSqlSegment}</select></mapper>
List<UserInfo> queryUserByCustom2(@Param(Constants.WRAPPER)Wrapper<UserInfo> wrapper);
 @Testvoid testQueryUserByCustom2(){QueryWrapper<UserInfo> queryWrapper = new QueryWrapper<UserInfo>().eq("username","admin");userInfoMapper.queryUserByCustom2(queryWrapper).forEach(System.out::println);}

如果需要查看更多关于MyBatis-plus 的资料,点击

简介 | MyBatis-Plushttps://baomidou.com/introduce/ 

希望能对大家有所帮助!!!!!

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

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

相关文章

GitHub和Gitee上的一些AI项目

以下是GitHub和Gitee上的一些AI项目&#xff1a; GitHub上的AI项目 TensorFlow&#xff1a;一个端到端开源机器学习平台&#xff0c;包含大量工具和库&#xff0c;广泛应用于图像识别、自然语言处理等领域。PyTorch&#xff1a;由Facebook开发的开源深度学习框架&#xff0c;…

JavaScript网页设计高级案例:构建交互式图片画廊

JavaScript网页设计高级案例&#xff1a;构建交互式图片画廊 在现代Web开发中&#xff0c;交互式元素已成为提升用户体验的关键因素。本文将通过一个高级案例 - 构建交互式图片画廊&#xff0c;展示如何结合HTML和JavaScript创建引人入胜的网页应用。这个案例不仅涵盖了基础的…

Linux命令大全:从入门到高效运维

适合人群&#xff1a;Linux新手 | 运维工程师 | 开发者 目录 一、Linux常用命令&#xff08;每天必用&#xff09; 1. 文件与目录操作 2. 文件内容查看与编辑 二、次常用命令&#xff08;按需使用&#xff09; 1. 系统管理与监控 2. 网络与通信 3. 权限与用户管理 三、…

Windows 10/11 使用 VSCode + SSH 免密远程连接 Ubuntu 服务器(指定端口)

摘要&#xff1a; 本文详细介绍如何在 Windows 系统上通过 VSCode Remote-SSH 免密登录远程 Ubuntu 服务器&#xff08;SSH 端口 2202&#xff09;&#xff0c;避免每次输入密码的繁琐操作&#xff0c;提高开发效率。 1. 环境准备 本地系统&#xff1a;Windows 10/11远程服务…

一些需要学习的C++库:CGAL和Eysshot

写在前面&#xff1a; 从开始工作到现在&#xff0c;去过多家公司&#xff0c;多个行业&#xff0c; 虽然大部分时间在通信业&#xff0c;但也有其它的行业的工作没有做完&#xff0c;但也很感兴趣。每次想要研究一下时&#xff0c;总是想不起来。 这里写一些信息&#xff0c;…

蓝桥杯16天刷题计划一一Day01

蓝桥杯16天刷题计划一一Day01&#xff08;STL练习&#xff09; 作者&#xff1a;blue 时间&#xff1a;2025.3.26 文章目录 蓝桥杯16天刷题计划一一Day01&#xff08;STL练习&#xff09;[P1540 [NOIP 2010 提高组\] 机器翻译 - 洛谷 (luogu.com.cn)](https://www.luogu.com.…

相对位置2d矩阵和kron运算的思考

文章目录 1. 相对位置矩阵2d2. kron运算 1. 相对位置矩阵2d 在swin-transformer中&#xff0c;我们会计算每个patch之间的相对位置&#xff0c;那么我们看到有一连串的拉伸和相减&#xff0c;直接贴代码&#xff1a; import torch import torch.nn as nntorch.set_printoptio…

Redis 版本演进及主要新特性

Redis 版本发布历史 稳定版本时间线 Redis 2.6 (2012年)Redis 2.8 (2013年11月)Redis 3.0 (2015年4月) - 首次支持集群Redis 3.2 (2016年5月)Redis 4.0 (2017年7月)Redis 5.0 (2018年10月)Redis 6.0 (2020年4月)Redis 6.2 (2021年2月)Redis 7.0 (2022年4月) - 最新稳定版(截至…

HTML5 Geolocation(地理定位)学习笔记

一、HTML5 Geolocation简介 HTML5 Geolocation&#xff08;地理定位&#xff09;API用于获取用户的地理位置信息。通过这个API&#xff0c;可以获取用户的纬度、经度、海拔等信息。由于地理定位可能涉及用户隐私&#xff0c;因此只有在用户同意的情况下&#xff0c;才能获取其…

爱普生VG3225EFN压控晶振5G基站低噪声的解决方案

在 5G 通信网络的高速发展中&#xff0c;系统噪声的控制成为保障网络可靠性与数据吞吐量的关键。爱普生 VG3225EFN 压控晶振凭借其卓越的低噪声特性&#xff0c;成为 5G 基站时钟系统的理想选择。通过创新的技术设计&#xff0c;这款晶振不仅为基站提供了稳定的时钟基准&#x…

【问题解决】Linux安装conda修改~/.bashrc配置文件后,root 用户下显示 -bash-4.2#

问题描述 在Linux安装conda下的python环境时候&#xff0c;修改了~/.bashrc文件&#xff0c;修改完成后&#xff0c;再次进入服务器后&#xff0c;登录时候显示的不是正常的[rootlocalhost ~]#&#xff0c;而是-bash-4.2# 原因分析&#xff1a; 网上原因有&#xff1a;/root下…

机器学习knnlearn5

import numpy as np from os import listdir from sklearn.neighbors import KNeighborsClassifier as kNN# 此函数用于将一个32x32的文本文件转换为一个1x1024的一维向量 def img2vector(filename):"""将32x32的文本文件转换为1x1024的向量:param filename: 要…

git revert 用法实战:撤销一个 commit 或 merge

git revert 1 区别 • 常规的 commit &#xff08;使用 git commit 提交的 commit&#xff09; • merge commit 2 首先构建场景 master上的代码 dev开发分支上&#xff0c;添加一个a标签&#xff0c;并commit这次提交 切到master上&#xff0c;再次进行改动和提交 将de…

自然语言处理|高效法律助手:AI如何解析合同条款?

引言&#xff1a;法律 AI 的崛起 在数字化浪潮快速发展的今天&#xff0c;人工智能&#xff08;AI&#xff09;已不再是一个陌生的概念&#xff0c;它正以快速发展渗透到各个领域&#xff0c;法律行业也不例外。从智能合同审查到法律风险预测&#xff0c;AI 技术为法律工作带来…

【数据分享】2000—2024年我国乡镇的逐年归一化植被指数(NDVI)数据(年最大值/Shp/Excel格式)

之前我们分享过2000-2024年我国逐年的归一化植被指数&#xff08;NDVI&#xff09;栅格数据&#xff0c;该逐年数据是取的当年月归一化植被指数&#xff08;NDVI&#xff09;的年最大值&#xff01;另外&#xff0c;我们基于此年度栅格数据按照行政区划取平均值&#xff0c;得到…

办公网络健康监控(域名健康监控)

需求 办公室访问一些网络经常出现故障 现需要时时观察监控这些网络的健康 包含专线网等其他网络 实施 支持 SNMP 且支持 Webhook 发送报警的开源监控系统 hertzbeat:关系型数据库+时序数据库; Zabbix:关系型数据库; LibreNMS:关系型数据库; Prometheus(包含ale…

蓝桥杯 合并数列

问题描述 小明发现有很多方案可以把一个很大的正整数拆成若干个正整数的和。他采用了其中两种方案&#xff0c;分别将它们列为两个数组&#xff1a; {a₁, a₂, ..., aₙ}{b₁, b₂, ..., bₘ} 两个数组的元素和相同。 定义一次合并操作为&#xff1a;将某个数组中相邻的两…

【行驶证识别】批量咕嘎OCR识别行驶证照片复印件图片里的文字信息保存表格或改名字,基于QT和腾讯云api_ocr的实现方式

项目背景 在许多业务场景中,如物流管理、车辆租赁、保险理赔等,常常需要处理大量的行驶证照片复印件。手动录入行驶证上的文字信息,像车主姓名、车辆型号、车牌号码等,不仅效率低下,还容易出现人为错误。借助 OCR(光学字符识别)技术,能够自动识别行驶证图片中的文字信…

个人学习编程(3-29) leetcode刷题

最后一个单词的长度&#xff1a; 思路&#xff1a;跳过末尾的空格&#xff0c;可以从后向前遍历 然后再利用 while(i>0 && s[i] ! ) 可以得到字符串的长度&#xff0c; int lengthOfLastWord(char* s) {int length 0;int i strlen(s) - 1; //从字符串末尾开始//…

PAT甲级(Advanced Level) Practice 1028 List Sorting

原题 1028 List Sorting - PAT (Advanced Level) Practice 题目大意 输入n个学生的id、姓名、分数&#xff0c;再输入C表示对C列进行排序。 id&#xff1a;从小到大排 姓名&#xff1a;姓名不同时从小到大排&#xff0c;相同时id从小到大排 分数&#xff1a;不同时从小到…