MyBatis-Plus核心功能详解:条件构造器、自定义SQL与Service接口

在Java的Web开发中,MyBatis-Plus作为MyBatis的增强工具,提供了许多实用的功能,极大地简化了数据库操作的开发过程。下面,我们将详细探讨MyBatis-Plus的三大核心功能:条件构造器、自定义SQL以及Service接口。

一、条件构造器

条件构造器(Wrapper)是MyBatis-Plus中的一个重要功能,它使得我们能够以面向对象的方式构建SQL查询条件,而无需手动拼接SQL语句。这不仅提高了代码的可读性和可维护性,还降低了出错的可能性。

MyBatis-Plus的条件构造器主要包括Wrapper、QueryWrapper和UpdateWrapper三个类。其中,Wrapper是一个抽象类,QueryWrapper和UpdateWrapper分别是它的两个实现类。QueryWrapper用于构建查询条件,而UpdateWrapper则用于构建更新条件。

在QueryWrapper中,我们可以使用各种方法来添加查询条件,如eq(等于)、ne(不等于)、gt(大于)、lt(小于)等。这些方法都接受两个参数:字段名和字段值。通过这些方法,我们可以轻松地构建出各种复杂的查询条件。

此外,QueryWrapper还支持使用lambda表达式来构建查询条件。这可以进一步简化代码,并提高代码的可读性。例如,我们可以使用lambda表达式来指定字段名,而无需手动拼写字段名的字符串。

条件构造器(Wrapper)允许我们以面向对象的方式构建SQL查询条件。以下是一个使用QueryWrapper的示例:

 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;  
 import com.example.demo.entity.User;  
 import com.example.demo.mapper.UserMapper;  
 import org.springframework.beans.factory.annotation.Autowired;  
 import org.springframework.stereotype.Service;  
 ​
 import java.util.List;  
 ​
 @Service  
 public class UserService {  
 @Autowired  
 private UserMapper userMapper;  
   
 public List<User> selectUsersByNameAndAge(String name, Integer age) {  
     QueryWrapper<User> queryWrapper = new QueryWrapper<>();  
     if (name != null) {  
         queryWrapper.eq("name", name);  
     }  
     if (age != null) {  
         queryWrapper.eq("age", age);  
     }  
     return userMapper.selectList(queryWrapper);  
 }  
   
 // 使用Lambda表达式的方式  
 public List<User> selectUsersByLambda(String name, Integer age) {  
     QueryWrapper<User> lambdaQueryWrapper = new QueryWrapper<User>().lambda();  
     if (name != null) {  
         lambdaQueryWrapper.eq(User::getName, name);  
     }  
     if (age != null) {  
         lambdaQueryWrapper.eq(User::getAge, age);  
     }  
     return userMapper.selectList(lambdaQueryWrapper);  
 }  
 }    

在上面的示例中,我们定义了一个UserService类,并在其中注入了UserMapper。selectUsersByNameAndAge方法使用传统的字段名字符串来构建查询条件,而selectUsersByLambda方法则使用Lambda表达式来指定字段,这种方式更加类型安全且易于阅读。

案例

(1)基于QueryWrapper的查询

 @Test
 void testQueryWrapper() {
     //1.构造查询条件
     QueryWrapper<User> wrapper = new QueryWrapper<User>()
             .select("id", "username", "info", "balance")
             .like("username", "o")
             .ge("balance", 1000);
     //2.查询
     List<User> users = userMapper.selectList(wrapper);
     users.forEach(System.out::println);
 }

 @Test
 void testUpdateByQueryWrapper() {
     //1.要更新的数据
     User user = new User();
     user.setBalance(2000);
     //2.更新的条件
     QueryWrapper<User> wrapper = new QueryWrapper<User>().eq("username","jack");
     //3.执行更新
     userMapper.update(user,wrapper);
 }

(2)基于UpdateWrapper的更新

 @Test
 void testUpdateWrapper() {
     List<Long> ids = List.of(1L,2L,4L);
     UpdateWrapper<User> wrapper = new UpdateWrapper<User>()
             .setSql("balance = blance - 200")
             .in("id",ids);
     userMapper.update(null,wrapper);
 }

(3)基于Lambda的格式

 @Test
 void testLambdaQueryWrapper() {
     //1.构造查询条件
     LambdaQueryWrapper<User> wrapper = new QueryWrapper<User>().lambda()
             .select(User::getId, User::getUsername, User::getInfo, User::getBalance)
             .like(User::getUsername, "o")
             .ge(User::getBalance, 1000);
     //2.查询
     List<User> users = userMapper.selectList(wrapper);
     users.forEach(System.out::println);
 }

二、自定义SQL

虽然MyBatis-Plus提供了丰富的CRUD操作功能,但在某些特殊场景下,我们仍然需要编写自定义的SQL语句。MyBatis-Plus允许我们在Mapper接口中直接编写自定义的SQL语句,并通过注解或XML文件的方式指定。

在Mapper接口中,我们可以使用MyBatis提供的注解来定义SQL语句,如@Select、@Insert、@Update和@Delete等。这些注解可以接受一个SQL语句作为参数,该SQL语句将被直接执行。通过这种方式,我们可以轻松地实现自定义的数据库操作。

除了使用注解外,我们还可以使用XML文件来定义SQL语句。在XML文件中,我们可以编写完整的SQL语句,并通过命名空间(namespace)和ID来标识不同的SQL语句。然后,在Mapper接口中,我们可以使用@Mapper注解来指定XML文件的位置,并通过方法名来引用XML文件中的SQL语句。

案例:

自定义SQL

① 基于Wrapper构建Where条件

 @Test
 void testCustomSqlUpdate() {
     //1.更新条件
     List<Long> ids = List.of(1L,2L,4L);
     int amount = 200;
     //2.定义条件
     LambdaQueryWrapper<User> wrapper = new QueryWrapper<User>().lambda()
                     .in(User::getId,ids);
     //3.调用自定义SQL方法
     userMapper.updateBalanceByIds(wrapper,amount);
 }

② 在mppper方法参数中用Param注解声明的wrapper变量名称,必须是ew

 public interface UserMapper extends BaseMapper<User> {
     void updateBalanceByIds(@Param("ew") LambdaQueryWrapper<User> wrapper, @Param("amount") int amount);
 ​
 }

③ 自定义SQL,并使用Wrapper条件

 <update id="updateBalanceByIds">
     update user
     set balance = balance - #{amount} ${ew.customSqlSegment}
 </update>

三、Service接口

Service接口是MyBatis-Plus中用于封装业务逻辑的接口。在Service接口中,我们可以定义与业务相关的方法,并调用Mapper接口中的方法来执行数据库操作。通过Service接口,我们可以将业务逻辑与数据访问逻辑进行分离,使得代码更加清晰和易于维护。

在MyBatis-Plus中,我们通常会创建一个与Mapper接口相对应的Service接口,并在Service接口中实现具体的业务逻辑。Service接口的实现类需要继承MyBatis-Plus提供的ServiceImpl类,并注入Mapper接口的实例。通过这种方式,我们可以轻松地访问Mapper接口中的方法,并执行相应的数据库操作。

除了基本的CRUD操作外,Service接口还可以实现更加复杂的业务逻辑,如数据校验、事务控制等。这些业务逻辑可以在Service接口的实现类中进行编写和封装,以便于在其他地方进行调用和使用。

IService是MyBatis-Plus提供的一个通用Service接口,它包含了基本的CRUD操作。例如:

 @Service
 public interface UserService extends IService<User> {
 }

实现类

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

在上述代码中,IUserService接口继承了IService<User>接口,表示它是一个通用的User业务处理接口。除了继承自IService的CRUD方法外,我们还可以根据业务需求在UserService接口中添加自定义的业务方法。

IService接口的实现类(如UserServiceImpl)通常由MyBatis-Plus自动生成,我们只需要继承它并实现自定义的业务方法即可。

测试

 @SpringBootTest
 public class IUserServiceTest {
     @Autowired
     private UserService userService;
     @Test
     void testSaveUser(){
         User user = new User();
         user.setId(6L);
         user.setUsername("Lucy");
         user.setPassword("123");
         user.setPhone("18688990011");
         user.setBalance(200);
         user.setInfo("{\"age\": 24, \"intro\": \"英文老师\", \"gender\": \"female\"}");
         user.setCreateTime(LocalDateTime.now());
         user.setUpdateTime(LocalDateTime.now());
 ​
         userService.save(user);
     }
 ​
 }

MyBatis-Plus作为MyBatis的增强工具,提供了丰富的核心功能,包括条件构造器、自定义SQL以及Service接口等。这些功能使得我们在进行Java持久层开发时更加高效和便捷。通过合理地使用这些功能,我们可以提高开发效率,减少错误率,并提升代码的可维护性和可扩展性。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【Vue】更换vue-element-admin左侧 logo

准备&#xff1a;目标svg格式的 logo&#xff0c;并将目标logo命名为 vuejs-fill.svg替换路径&#xff1a;/icons 文件夹下&#xff0c;覆盖掉原本的 vuejs-fill.svg 原因&#xff1a;配置项的logo设置的是 vuejs-fill

摊还分析

一、摊还分析 概念&#xff1a;是求数据结构中一个操作序列执行所有操作的平均时间&#xff0c;与平均复杂度不同&#xff0c;它不涉及输入概率&#xff0c;能够保证在最坏情况下操作的平均性能。 适用场景&#xff1a;用含 n 个操作的序列&#xff08;o1&#xff0c;o2&#x…

【系统架构师】-选择题(十四)数据库基础

1、某企业开发信息管理系统平台进行 E-R 图设计&#xff0c;人力部门定义的是员工实体具有属性&#xff1a;员工号、姓名、性别、出生日期、联系方式和部门,培训部门定义的培训师实体具有属性:培训师号&#xff0c;姓名和职称&#xff0c;其中职称{初级培训师&#xff0c;中级培…

dnf手游攻略,新手入坑必备!

一、角色创建策略 在DNF手游中&#xff0c;角色创建是玩家初入游戏的首要步骤。为最大化游戏体验和收益&#xff0c;新手玩家通常建议创建三个角色&#xff1a;一个主账号和两个副账号。 主账号选择 主账号的选择应基于玩家个人的喜好和对职业的熟悉程度。无论选择哪个职业&a…

Ubuntu 安装chrome和chromedriver

1.安装包下载 百度网盘地址 2.更新软件包 sudo apt-get update 3.安装chrome sudo apt install ./google-chrome-stable_current_amd64.deb 4.检查是否安装成功 google-chrome --version 5.安装chrome-driver驱动&#xff0c;解压zip文件 unzip chromedriver_linux64.z…

哪款骨传导耳机最值得入手?精选5款顶尖配置的骨传导耳机,闭眼入也不踩雷!

作为一名有着多年工作经验的数码博主&#xff0c;我见证了无数因盲目追求新颖而引发的听力问题。在此&#xff0c;我必须郑重提醒大家&#xff0c;虽然市面上充斥着众多声称能提供卓越音质和佩戴舒适度的骨传导耳机品牌&#xff0c;但它们之间存在大量劣质产品&#xff0c;这类…

串联所有单词的子串 ---- 滑动窗口

题目链接 题目: 分析: 我们上次做的题目, 是找到所有字符的异位词, 和这道题有些类似, 使用记录有效字符的个数找到子字符, 此题无非是把字符变成了字符串题目回顾 有一下几方面不同, 我们以示例1为例: 1. 哈希表 上次我们使用的是哈希数组, 因为数组的下标可以是字符, 现…

生产透明化,交付无烦恼

生产进度总延误 质量把控总失守 计划赶不上变化 沟通不畅易误解 ...... 这些问题可能在一些工厂管理中几乎每天都在上演。 在如今快速变化的市场环境中&#xff0c;企业的生产效率和交付能力成为了衡量其竞争力的关键指标。而要实现高效、准确的生产和交付&#xff0c;透明化的…

JVM调优-调优原则和原理分析

1.写在前面 对于JVM调优这个话题&#xff0c;可能大部分程序员都听过这个名词。 但是绝大多数程序员&#xff0c;都没有真真实实去干过&#xff0c;都没有真实的实践过。也不懂得如何调优&#xff1f;不知道要调成怎么样&#xff1f; 那今天咋们就对这个话题来展开描述一下&…

“Linux”目录结构and配置网络

了解完命令格式和vi、vim编辑器后&#xff0c;我们来认识一下目录的结构&#xff1a; 一、目录 &#xff08;1&#xff09;目录的特点 windows特点&#xff1a; Windows中有C、D、E盘&#xff0c;每个都是一个根系统 Linux特点&#xff1a; linux中只有一个根&#xff08;单…

富在术数,不在劳身 财富的积累更多依赖于智慧和策略,而不是单纯的体力劳动 GPT-4o免费用

"富在术数&#xff0c;不在劳身"这句话的意思是财富的积累更多依赖于智慧和策略&#xff0c;而不是单纯的体力劳动。这句话强调了智慧和技巧在获取财富过程中的重要性&#xff0c;提示人们在追求财富时&#xff0c;应注重策略和方法的运用&#xff0c;而不仅仅依靠辛…

【正点原子Linux连载】第四十一章 Linux wifi驱动实验 摘自【正点原子】ATK-DLRK3568嵌入式Linux驱动开发指南

1&#xff09;实验平台&#xff1a;正点原子ATK-DLRK3568开发板 2&#xff09;平台购买地址&#xff1a;https://detail.tmall.com/item.htm?id731866264428 3&#xff09;全套实验源码手册视频下载地址&#xff1a; http://www.openedv.com/docs/boards/xiaoxitongban 第四十…

服务的war包已经丢在tomcat中但是还是没法访问,如何排查?

问题出现的现象是我已经将 XWiki 的 WAR 包放置在 Tomcat 的 webapps目录下但仍然无法访问&#xff0c;反思之后可以从下面以下几个方面来诊断和解决问题&#xff1a; 1. 确认 Tomcat 正在运行 首先&#xff0c;确保 Tomcat 服务正在正常运行。可以使用以下命令检查 Tomcat 的…

嵌入式科普(16)c语言函数参数的传递方式

目录 一、概述 二、C函数参数 2.1 一张图讲清 2.2 按数据类型分类&#xff1a; 2.2.1 基本数据类型参数&#xff1a; 2.2.2 数组参数&#xff1a; 2.2.3 结构体参数&#xff1a; 2.2.4 指针参数&#xff1a; 2.2.5 函数指针参数&#xff1a; 2.3 按传递方式分类&…

nestjs封装一个响应体

封装一个DTO // response.dto.tsimport {CallHandler,ExecutionContext,Injectable,NestInterceptor, } from "nestjs/common"; import { FastifyReply } from "fastify"; import { Observable } from "rxjs"; import { map } from "rxjs/…

电力系统潮流计算的计算机算法(一)——网络方程、功率方程和节点分类

本篇为本科课程《电力系统稳态分析》的笔记。 本篇为这一章的第一篇笔记。下一篇传送门。 实际中的大规模电力系统包含成百上千个节点、发电机组和负荷&#xff0c;网络是复杂的&#xff0c;需要建立复杂电力系统的同一潮流数学模型&#xff0c;借助计算机进行求解。 简介 …

浅谈音频鉴黄技术

随着互联网的迅猛发展和网络智能化的普及&#xff0c;音视频内容已成为互联网传播的主流形式&#xff0c;各大视频网站、直播平台及短视频应用不断涌现&#xff0c;为亿万用户提供了丰富多样的娱乐和资讯内容。然而&#xff0c;这种繁荣背后也隐藏着不容忽视的问题&#xff1a;…

如何申请免费一年SSL证书

申请免费一年的SSL证书可以通过以下几个步骤进行&#xff0c;这里以JoySSL为例&#xff0c;因为它是目前提供此类服务的流行平台之一&#xff0c;同时也提到了宝塔面板中的TrustAsia SSL证书。请根据您的具体需求选择合适的方式&#xff1a; 申请免费一年SSL证书&#xff1a; …

MIT 6.5840(6.824) Lab1:MapReduce 设计实现

1 介绍 本次实验是实现一个简易版本的MapReduce&#xff0c;你需要实现一个工作程序&#xff08;worker process&#xff09;和一个调度程序&#xff08;coordinator process&#xff09;。工作程序用来调用Map和Reduce函数&#xff0c;并处理文件的读取和写入。调度程序用来协…

游戏数值策划关卡策划文案策划系统策划及游戏运营干货

1.《游戏新手村》免费电子书 我2007年开始做网络游戏&#xff0c;后面又做过网页游戏和手机游戏。当时市面上关于游戏策划和运营的书籍屈指可数&#xff0c;于是我就想着要不我写一本吧&#xff0c;然后2014年10月开始撰写。关于本书的更多信息可查看这篇文章>> 游戏新手…