2024年150道高频Java面试题(七十五)

149. MyBatis 中的动态 SQL 是什么,如何使用?

MyBatis 中的动态 SQL 是指可以在 XML 映射文件中编写可适应不同情况的 SQL 语句,它允许 SQL 语句根据传入的参数或查询条件动态构建。这样的特性让开发者可以编写更加灵活和强大的查询,避免了硬编码条件分支,提高了代码的可维护性。

动态 SQL 主要通过以下几种方式实现:

  1. <if>:用于判断条件是否成立,如果成立则拼接 SQL 片段。

    <select id="findUser" resultType="User">SELECT * FROM usersWHERE 1=1<if test="username != null">AND username = #{username}</if>
    </select>
    
  2. <choose><when><otherwise>:类似于 Java 中的 if-else-if 结构,用于选择性的包含 SQL 片段。

    <select id="findActiveBlogWithTitleLike" resultType="Blog">SELECT * FROM BLOGWHERE state = ‘ACTIVE’<choose><when test="title != null">AND title like #{title}</when><otherwise>AND author like #{author}</otherwise></choose>
    </select>
    
  3. <foreach>:用于遍历传入的参数集合,生成批量 SQL。

    <select id="findUserByIds" resultType="User">SELECT * FROM usersWHERE id IN<foreach item="id" collection="list" open="(" separator="," close=")">#{id}</foreach>
    </select>
    
  4. <set>:用于动态更新语句,只更新那些变化的字段。

    <update id="updateUser">UPDATE users<set><if test="username != null">username = #{username},</if><if test="password != null">password = #{password},</if></set>WHERE id = #{id}
    </update>
    
  5. <bind>:可以用来创建一个变量并将其绑定到上下文,可以在同一个语句中使用。

    <select id="selectBlogs" resultType="Blog"><bind name="pattern" value="'%' + title + '%'"/>SELECT * FROM BLOGWHERE title LIKE #{pattern}
    </select>
    

使用动态 SQL 可以让我们的代码更加灵活,能够应对复杂的查询需求,并且保持 SQL 映射文件的可读性和可维护性。在实际使用中,我们需要注意 SQL 注入的风险,确保所有的输入都经过了适当的处理。

150. 如何在 MyBatis 中实现分页查询?

在 MyBatis 中实现分页查询主要有两种方式:使用内存分页和数据库分页。

1)内存分页

内存分页是指在查询出所有数据后,在 Java 内存中对数据进行分页处理。

优点:实现简单,不需要关心使用的数据库类型。

缺点:当数据量大时,占用内存大,性能低。

示例代码:

List<User> users = sqlSession.selectList("User.selectAll");
// 手动进行分页处理
Page<User> page = new Page<>(users, pageNumber, pageSize);
2)数据库分页

数据库分页是指利用数据库自身提供的分页功能,例如 MySQL 的 LIMIT 语句,Oracle 的 ROWNUM

优点:性能高,尤其是在数据量大的情况下。

缺点:需要根据不同的数据库编写不同的 SQL 语句。

3)示例:MySQL 分页查询

SQL Mapper XML:

<select id="selectByPage" resultType="User">SELECT * FROM userORDER BY idLIMIT #{start}, #{pageSize}
</select>

Java 代码:

public Page<User> selectByPage(int pageNumber, int pageSize) {int start = (pageNumber - 1) * pageSize;List<User> users = sqlSession.selectList("User.selectByPage", start, pageSize);int total = sqlSession.selectOne("User.selectTotal");return new Page<>(users, total, pageNumber, pageSize);
}
4)示例:Oracle 分页查询

SQL Mapper XML:

<select id="selectByPage" resultType="User">SELECT * FROM (SELECT t.*, ROWNUM rn FROM (SELECT * FROM user ORDER BY id) t WHERE ROWNUM <= #{end}) WHERE rn >= #{start}
</select>

Java 代码与 MySQL 示例类似,只需要更改 SQL 语句。

在实际应用中,建议使用数据库分页,因为它具有更好的性能。选择哪种分页方式取决于具体的需求和场景。当然,还可以通过 MyBatis 插件如 PageHelper 来简化分页的实现。

编程资料包领取:https://pan.quark.cn/s/601cbea644ff
编程、AI、副业交流:https://t.zsxq.com/19zcqaJ2b
领【150 道精选 Java 高频面试题】请 go 公众号:码路向前 。

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

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

相关文章

Vue进阶之Vue项目实战(四)

Vue项目实战 出码功能知识介绍渲染器性能调优使用 vue devtools 进行分析使用“渲染”进行分析判断打包构建的产物是否符合预期安装插件使用位置使用过程使用lighthouse分析页面加载情况使用performance分析页面加载情况应用自动化部署与发布CI/CD常见的CI/CD服务出码功能 出码…

香橙派OrangePi AIpro上手笔记——之USB摄像头目标检测方案测试(二)

前期笔记回顾 香橙派OrangePi AIpro上手笔记——之USB摄像头目标检测方案测试&#xff08;一&#xff09; 本章前言 在上一章节&#xff1a;测试笔记&#xff08;一&#xff09;中&#xff0c;我们已经掌握并搭建了板卡的初步调试环境。 接下来&#xff0c;我们将逐步上手官方的…

c 的库函数有哪些

C语言的库函数非常丰富&#xff0c;涵盖了多种功能&#xff0c;为程序员提供了大量的工具来完成各种任务。以下是一些主要的C语言库函数及其分类&#xff1a; 标准输入输出函数&#xff1a; printf()&#xff1a;用于输出格式化的数据到标准输出设备。scanf()&#xff1a;用于…

抠像标签合并到原图,jpg 和 png合并,查看标签是否准确

抠像 原图 和 标签合并&#xff0c;查看抠像是否准确 合并后的图&#xff0c;是带有 羽化 效果的 import osimport cv2 import numpy as npdef apply_mask_with_feathering(original_image_path, mask_image_path):# 读取原图和mask图original_image cv2.imread(original_im…

[Halcon学习笔记]Halcon窗口进行等比例显示图像

目录 需求分析Halcon显示原理显示实现具体实现Halcon代码 需求分析 在使用Halcon加载图像时&#xff0c;点击Halcon的适应窗口&#xff0c;图像都会按照窗口大小对图像进行拉伸后显示&#xff0c;实际项目中&#xff0c;需要等比例显示图像&#xff0c;体现图像原本的尺寸细节…

抖音和快手哪个好?来全面了解一下他们的区别!

快手和抖音虽然是短视频领域的两大主流平台&#xff0c;但是两者也存在本质的区别&#xff0c;从产品定位、用户群体到视频风格、变现模式&#xff0c;它们的特征都不一样。 &#xff08;一&#xff09;两个平台核心区别&#xff1a; 1. 核心用户不一样&#xff1a;抖音以1、…

dubbo复习:(7)使用sentinel对dubbo服务进行限流

一、下载sentinel-dashboard 并启动 java -Dserver.port8080 -Dcsp.sentinel.dashboard.serverlocalhost:8080 -Dproject.namesentinel-dashboard -jar sentinel-dashboard.jar二、在spring boot应用中增加sentinel相关依赖 <dependency><groupId>com.alibaba.csp…

HCIA、HCIP学习笔记目录索引(实时更新)

一、基础部分 1、数据通信基础 1.1 数据通信基础概念 1.2 网络设备 1.3 网络类型 1.4 网络拓扑 1.5 网络工程师​​​​​​​ 2、网络参考模型 2.1 OSI参考模型 2.2 TCP/IP参考模型 2.3 TCP/IP模型——物量层 2.4 TCP/IP模型——数据链路层 2.5 TCP/IP模型——网络层 2.6 TCP/…

护网在即,请拿你走你的蓝队神器!~

前言 养兵千日用兵一时&#xff0c;护网已经临近了&#xff0c;你是不是还在考虑现场一系列可能发生的情况&#xff1f;提前找好工具,避免在甲方面前太尴尬? 你需要它&#xff01; 据我了解&#xff0c;去年国护的时候就已经有不少攻城狮在使用我们的蓝队应急响应工具箱&am…

【易错题】数据可视化基础练习题(30道选择题)#CDA Level 1

本文整理了数据可视化基础知识相关的练习题&#xff0c;共30道&#xff0c;适用于想巩固数据可视化知识的同学&#xff0c;也可作为备考CDA一级的补充习题。来源&#xff1a;如荷学数据科学题库&#xff08;技术专项-可视化&#xff09;。 1&#xff09; 2&#xff09; 3&…

Windows10(家庭版)中DockerDesktop(docker)的配置、安装、修改镜像源、使用

场景 Windows10中Docker的安装与遇到的那些坑: Windows10中Docker的安装与遇到的那些坑_在 docker.core.logging.httpclientexceptionintercept-CSDN博客 上面讲Docker Desktop在windows10非家庭版上的安装&#xff0c;如果是家庭版&#xff0c;则需要执行如下步骤。 注&am…

vue3快速上手笔记(尚硅谷)

[TOC]# 1. Vue3简介 2020年9月18日&#xff0c;Vue.js发布版3.0版本&#xff0c;代号&#xff1a;One Piece&#xff08;n 经历了&#xff1a;4800次提交、40个RFC、600次PR、300贡献者 官方发版地址&#xff1a;Release v3.0.0 One Piece vuejs/core 截止2023年10月&#…

CCF20211201——序列查询

CCF20211201——序列查询 代码如下&#xff1a; #include<bits/stdc.h> using namespace std; #define Max 10000000 int a[Max]{0},b[Max]{0}; int main() {int n,m;int sum0,x0,flag0;cin>>n>>m;for(int i1;i<n;i){cin>>a[i];}for(int i0,x0;i&l…

再次疾呼:一稿多投是作者的合法权利!

近日&#xff0c;有作者反应在收到拒稿邮件之后另投他刊&#xff0c;竟然被判定一稿多投。 出版社解释说现在大多数期刊都是使用投稿系统收稿&#xff0c;如果被退稿后马上又投稿其他期刊&#xff0c;由于时间距离太近&#xff0c;仍然会被系统判定为一稿多投的。核心期刊编辑…

【linux:基础IO】

目录 系统调用的文件接口&#xff1a; open read: write: lseek: close: 系统调用的文件接口&#xff1a; open 当文件存在时&#xff1a;int open (const char*pathname,int flags)当文件不存在时&#xff1a;int open (const char* pathname,int flags,mode_t mode) 返…

广东中科产业研究院正式批复成为世界酒中国菜的指导单位

广东中科产业研究院正式批复成为“世界酒中国菜”系列活动指导单位 经过深入审议与严格把关&#xff0c;广东中科产业研究院已正式批复荐酒师国际认证&#xff08;广州&#xff09;有限公司作为“世界酒中国菜”系列活动的指导单位。此举旨在深入贯彻共建“一带一路”倡议&…

ctfshow web 月饼杯II

web签到 <?php //Author:H3h3QAQ include "flag.php"; highlight_file(__FILE__); error_reporting(0); if (isset($_GET["YBB"])) {if (hash("md5", $_GET["YBB"]) $_GET["YBB"]) {echo "小伙子不错嘛&#xff…

《最新出炉》系列入门篇-Python+Playwright自动化测试-46-鼠标滚轮操作

宏哥微信粉丝群&#xff1a;https://bbs.csdn.net/topics/618423372 有兴趣的可以扫码加入 1.简介 有些网站为了节省流量和资源&#xff0c;提高加载效率&#xff0c;采用的是动态加载&#xff08;懒加载&#xff09;的&#xff0c;也就是当拖动页面右侧滚动条后会自动加载网…

【C++ ——— 继承】

文章目录 继承的概念即定义继承概念继承定义定义格式继承关系和访问限定符继承基类成员访问方式的变化 基类对象和派生类对象的赋值转换继承中的作用域派生类中的默认成员函数继承与友元继承与静态成员菱形继承 继承的概念即定义 继承概念 继承(inheritance)机制是面向对象程…

AdroitFisherman模块测试日志(2024/5/28)

测试内容 测试AdroitFisherman分发包中Base64Util模块。 测试用具 Django5.0.3框架&#xff0c;AdroitFisherman0.0.29 项目结构 路由设置 总路由 from django.contrib import admin from django.urls import path,include from Base64Util import urls urlpatterns [path…