【Java系列】Mybatis-Plus 使用方式介绍

news2024/12/26 12:06:05

1 Mybatis-Plus简介

Mybatis-Plus 提供了多种方式来执行 SQL,包括使用注解、XML 映射文件和 Lambda 表达式等。其中,使用 Lambda 表达式是 Mybatis-Plus 推荐的方式,因为它更加直观和类型安全。

2 使用方法

1  Lambda 表达式执行 SQL

以下是一个使用 Lambda 表达式执行 SQL 的示例,现在我们有一个名为 User 的实体类,其中包含 idname 和 age 属性:

import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import org.springframework.stereotype.Service;
import java.util.List;

@Service
public class UserServiceImpl extends ServiceImpl<UserMapper, User> implements UserService {

    @Override
    public List<User> getUsersByName(String name) {
        LambdaQueryWrapper<User> queryWrapper = new LambdaQueryWrapper<>();
        queryWrapper.eq(User::getName, name);
        return baseMapper.selectList(queryWrapper);
    }
}

在这个示例中,我创建了一个 LambdaQueryWrapper 对象,使用 eq 方法指定查询条件为 name = #{name},其中 #{name} 是参数占位符。

然后,调用 baseMapper.selectList 方法执行查询,并返回查询结果。

2 组合示例 

要传递参数,可以将参数作为方法的参数,并在查询条件中使用 eqneinlike 等方法指定参数值。

例如,假设要查询年龄大于等于 minAge,小于等于 maxAge 的用户,可以修改上面的示例代码如下:

import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import org.springframework.stereotype.Service;
import java.util.List;

@Service
public class UserServiceImpl extends ServiceImpl<UserMapper, User> implements UserService {

    @Override
    public List<User> getUsersByAge(int minAge, int maxAge) {
        LambdaQueryWrapper<User> queryWrapper = new LambdaQueryWrapper<>();
        queryWrapper.ge(User::getAge, minAge).le(User::getAge, maxAge);
        return baseMapper.selectList(queryWrapper);
    }
}

在这个示例中,我添加了一个新的方法 getUsersByAge,其中两个参数 minAge 和 maxAge 分别表示最小年龄和最大年龄。

使用 ge 方法指定年龄大于等于 minAge,使用 le 方法指定年龄小于等于 maxAge

然后,调用 baseMapper.selectList 方法执行查询,并返回查询结果。

3 复杂sql  

另外,如果需要执行复杂的 SQL,例如联合查询、分组查询等,可以使用 Mybatis-Plus 提供的 SQL 构建器,它可以帮助你构建复杂的 SQL 语句。

以下是一个使用 SQL 构建器执行联合查询的示例,假设你有一个名为 Order 的实体类,其中包含 iduserId 和 amount 属性,你需要查询每个用户的订单总金额:

import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import org.springframework.stereotype.Service;
import java.util.List;
import java.util.Map;

@Service
public class OrderServiceImpl extends ServiceImpl<OrderMapper, Order> implements OrderService {

    @Override
    public List<Map<String, Object>> getOrderAmountByUser() {
        QueryWrapper<Order> queryWrapper = new QueryWrapper<>();
        queryWrapper.select("user_id", "sum(amount) as total_amount")
                    .groupBy("user_id");
        return baseMapper.selectMaps(queryWrapper);
    }
}

在这个示例中,我创建了一个 QueryWrapper 对象,使用 select 方法指定要查询的字段为 user_id 和 sum(amount) as total_amount,其中 sum(amount) 表示每个用户的订单总金额,as total_amount 是为结果集中的这个字段取别名。

然后,使用 groupBy 方法将结果按照 user_id 进行分组。

最后,调用 baseMapper.selectMaps 方法执行查询,并返回查询结果。

注意,在使用 SQL 构建器执行复杂的 SQL 语句时,需要使用正确的 SQL 语法,并且需要特别注意 SQL 注入的问题。

可以使用 Mybatis-Plus 提供的参数绑定方式来避免 SQL 注入问题,例如 #{param}${param} 等方式。

3 其他注入sql的方式 

Mybatis-Plus 提供了多种注入 SQL 的方式,包括使用注解、XML 映射文件和 Lambda 表达式等。

不同的注入方式适用于不同的场景和需求,可以根据具体情况选择适合的方式。

以下是几种常用的注入 SQL 的方式:

1 使用注解

可以使用 @Select@Update@Delete@Insert 注解来注入 SQL 语句。例如:

@Select("SELECT * FROM user WHERE name = #{name}")
List<User> selectByName(@Param("name") String name);

在这个示例中,使用 @Select 注解注入了一条查询语句,其中 #{name} 表示参数占位符,@Param("name") 表示参数名称。

使用这种方式注入 SQL 语句比较简单,但是不够灵活,不支持复杂的 SQL 语句。

2 使用 XML 映射文件

可以使用 XML 映射文件来注入 SQL 语句,这种方式可以支持复杂的 SQL 语句,并且可以将 SQL 和 Java 代码分离。

例如:在 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.example.mapper.UserMapper">
    <select id="selectByName" resultType="User">
        SELECT * FROM user WHERE name = #{name}
    </select>
</mapper>

在 UserMapper.java 文件中:

List<User> selectByName(@Param("name") String name);

在这个示例中,将查询语句写在 XML 映射文件中,使用 <select> 标签指定 SQL 语句,并使用 resultType 属性指定返回结果类型。然后,在 Java 代码中调用该方法即可。

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

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

相关文章

pix2pixHD---loss---损失函数

在Pix2PixHDModel代码中首先定义损失&#xff1a; 首先看第一个&#xff1a;输入的两个参数use_gan_feat_loss, use_vgg_loss默认为false&#xff0c;则前缀有not&#xff0c;所以两个参数都是True。 def init_loss_filter(self, use_gan_feat_loss, use_vgg_loss):flags (Tr…

PCIE知识点-022:PCIe 参考时钟结构

图1&#xff1a;参考时钟结构示意图[4] 1. Common Refclk Architecture Common Refclk Architecture&#xff0c;即同源参考时钟架构&#xff0c;PCIe收发设备共用一个时钟源&#xff0c;是目前是使用最为广泛的方案。 缺点&#xff1a; 对于适用同一 Common Clock 作为参考时…

第四章 运行时数据区

文章目录 前言一、&#x1f697; 双亲委派机制1、 问题的引出&#xff1a;是否会被外来程序对系统进行破坏2、总结3、双亲委派的优势4、沙箱安全机制5、其他 二、&#x1f692; 运行时数据区线程 三、&#x1f6fa; PC 寄存器概述&#xff08;记录下一条程序指令的地址&#xf…

Vulnhub: dpwwn: 1靶机

kali&#xff1a;192.168.111.111 靶机&#xff1a;192.168.111.131 信息收集 端口扫描 nmap -A -sC -v -sV -T5 -p- --scripthttp-enum 192.168.111.131 爆破出mysql的root用户为空密码 hydra -l root -P /usr/share/wordlists/rockyou.txt 192.168.111.131 -s 3306 mysq…

UI自动化 Xpath定位必知必会

目录 javascript xpath定位 定位单个元素&#xff1a; 定位多个元素&#xff1a; 验证xpath定位语法是否OK 尽量使用模糊匹配定位元素 模糊匹配contains 使用关联文本值定位 text() 在UI自动化测试中用的最频繁的就是xpath定位了&#xff0c;所以用好xpath定位至关重要&…

关于中断的几个小问题

1. intel 8259芯片中的IRQ2和int2的区别是什么&#xff1f; 答曰&#xff1a;IRQ2是芯片上的引脚&#xff0c;而int2是中断向量表的第2项&#xff0c;两者有很大区别。 Intel8259A芯片的中断引脚分别为&#xff1a; 主片&#xff1a; 0&#xff1a;8254时钟 1&#xff1a;键盘 …

【python代码】Kittle数据集的ground truth生成深度图攻略|彩色深度图|代码无恼运行

目录 1.明确KITTLE数据集特性 2.选择groundtruth 3.转换深度图 4.转换彩色深度图 1.明确KITTLE数据集特性 KITTI数据集包含了来自车载传感器的多模态数据&#xff0c;包括激光雷达、摄像头和GPS/惯性测量单元&#xff08;IMU&#xff09;等。该数据集主要采集于城市环境中…

B3645 数列前缀和 20

题目描述 给定一个长度为 n 的数列 a&#xff0c;请回答 q 次询问&#xff0c;每次给定 l,r&#xff0c;请求出 ()​mod p 的值&#xff0c;其中 p1,145,141。 输入格式 第一行是两个整数&#xff0c;依次表示数列长度 n 和询问次数 q。 第二行有 n 个整数&#xff0c;第 …

Qt下QTcpServer服务端识别多个QTcpSocket客户端

文章目录 Qt官方文档编写QTcpServerDemo和QTcpSocketDemo实现QTcpServerDemo实现QTcpSocketDemo 使用windeployqt生成程序运行所需依赖文件 Qt官方文档 QTcpSocket Class &#xff1a;https://doc.qt.io/qt-5/qtcpsocket.html QAbstractSocket Class&#xff1a;https://doc.q…

分布式RPC框架Dubbo详解

目录 1.架构演进 1.1 单体架构 1.2 垂直架构 1.3 分布式架构 1.4 SOA架构 1.5 微服务架构 2.RPC框架 2.1 RPC基本概念介绍 2.1.1 RPC协议 2.1.2 RPC框架 2.1.3 RPC与HTTP、TCP/ UDP、Socket的区别 2.1.4 RPC的运行流程 2.1.5 为什么需要RPC 2.2 Dubbo 2.2.1 Dub…

Redis的网络模型(未完成)

Redis是单线程还是多线程&#xff1f; 1)如果只是针对于Redis的核心业务部分(命令处理)&#xff0c;答案是单线程 2)如果是说整个redis&#xff0c;那么就是多线程 在Redis的版本迭代过程中&#xff0c;在两个非常重要的时间节点上引入了对多线程的支持: 1)在Redis4.0版本中&am…

redis第二章-第一课-持久化rdb和aof以及混合模式

RDB快照 1.在默认情况下&#xff0c; Redis 将内存数据库快照保存在名字为 dump.rdb 的二进制文件中&#xff0c;默认存储在redis的当前目录下&#xff0c;也就是和redis.conf同级目录下&#xff0c;可以修改位置 2.你可以对 Redis 进行设置&#xff0c; 让它在“ N 秒内数据…

小白怎么入门CTF,看这个就够了(附学习笔记、靶场、工具包下载)

CTF靶场&#xff1a;CTF刷题&#xff0c;在校生备战CTF比赛&#xff0c;信安入门、提升自己、丰富简历之必备&#xff08;一场比赛打出好成绩&#xff0c;可以让你轻松进大厂&#xff0c;如近期的各种CTF杯&#xff09;&#xff0c;在职人员可以工作意外提升信安全技能。 渗透…

00后太卷了,搞的我们这些老油条太难受了......

前几天我们公司一下子也来了几个新人&#xff0c;这些年前人是真能熬啊&#xff0c;本来我们几个老油子都是每天稍微加会班就打算走了&#xff0c;这几个新人一直不走&#xff0c;搞得我们也不好走。 2023年春招结束了&#xff0c;最近内卷严重&#xff0c;各种跳槽裁员&#x…

rk3568 点亮LCD(DP)

rk3568 rk3399 Android11/12 适配 DP DisplayPort&#xff08;简称DP&#xff09;是第一个依赖数据包化数据传输技术的显示通信端口。是一个由PC及芯片制造商联盟开发&#xff0c;视频电子标准协会标准化的数字式视频接口标准。主要用于视频源与显示器等设备的连接&#xff0c…

进程管理(笔记)

如果对内存寻址熟悉的话, 或者认真看过上一节的内容: 内存管理之内存寻址: https://blog.csdn.net/qq_40482358/article/details/130868188. 那么对linux系统中的进程管理应该已经有一个初步的认识了: cr3作为一个控制寄存器, 描述当前进程的页目录的物理内存基地址, 当进程切换…

SpringCloud Ribbon 学习

SpringCloud Ribbon 学习 文章目录 SpringCloud Ribbon 学习1. Ribbon 是什么&#xff1f;2. LB(Load Balance)3 Ribbon 架构图&机制4 Ribbon 常见负载均衡算法5 测试 1. Ribbon 是什么&#xff1f; Spring Cloud Ribbon 是基于 Netflix Ribbon 实现的一套客户端 负载均衡…

Docker容器与虚拟机(VM)大对比

Docker是一个开源应用容器引擎。Docker可以将应用程序与基本架构分开&#xff0c;从而快速交付软件。 传统虚拟机的运行需要占用较高的资源&#xff0c;包括磁盘空间、内存和处理器性能。每个虚拟机都需要完整的操作系统和应用程序副本&#xff0c;这在资源利用和启动时间上存…

好玩!AI文字RPG游戏;播客进入全AI时代?LangChain项目实践手册;OpenAI联创科普GPT | ShowMeAI日报

&#x1f440;日报&周刊合集 | &#x1f3a1;生产力工具与行业应用大全 | &#x1f9e1; 点赞关注评论拜托啦&#xff01; &#x1f916; Microsoft Build 中国黑客松挑战赛&#xff0c;进入AI新纪元 近期&#xff0c;伴随着人工智能的新一轮浪潮&#xff0c;Hackathon (黑…

python+pytest接口自动化之HTTP协议基础

目录 HTTP协议简介 HTTP协议特点 HTTP接口请求方法 HTTP与HTTPS区别 HTTP与TCP/IP区别 HTTP请求过程 总结 HTTP协议简介 HTTP 即 HyperText Transfer Protocol&#xff08;超文本传输协议&#xff09;&#xff0c;是互联网上应用最为广泛的一种网络协议。所有的 WWW 文件…