每日五道java面试题之mybatis篇(四)

在这里插入图片描述

目录:

  • 第一题. 映射器#{}和${}的区别
  • 第二题. 模糊查询like语句该怎么写?
  • 第三题. 在mapper中如何传递多个参数?
  • 第四题. Mybatis如何执行批量操作
  • 第五题 MyBatis框架适用场景

第一题. 映射器#{}和${}的区别

  • #{}是占位符,预编译处理;${}是拼接符,字符串替换,没有预编译处理。
  • Mybatis在处理#{}时,#{}传入参数是以字符串传入,会将SQL中的#{}替换为?号,调用PreparedStatement的set方法来赋值。
  • Mybatis在处理" role=“presentation” style=‘font-size:19.36px;font­style:normal;font-­weight:400;font-family:KaTeX_Main, “Times New Roman”, serif;color:rgb(77, 77,77);’>时,是原值传入,就是把时,是原值传入,就是把{}替换成变量的值,相当于JDBC中的Statement编译
  • 变量替换后,#{} 对应的变量自动加上单引号 ‘’;变量替换后,${}对应的变量不会加上单引号 ‘’
  • #{} 可以有效的防止SQL注入,提高系统安全性;${} 不能防止SQL 注入
  • #{} 的变量替换是在DBMS 中;${} 的变量替换是在 DBMS 外

第二题. 模糊查询like语句该怎么写?

(1)’%${question}%’ 可能引起SQL注入,不推荐
(2)“%”#{question}“%” 注意:因为#{…}解析成sql语句时候,会在变量外侧自动加单引号’ ',所以这里 % 需要使用双引号" ",不能使用单引号 ’ ',不然会查不到任何结果。
(3)CONCAT(’%’,#{question},’%’) 使用CONCAT()函数,推荐
(4)使用bind标签

<select id="listUserLikeUsername" resultType="com.jourwon.pojo.User"><bind name="pattern" value="'%' + username + '%'"/>SELECT id, sex, age, username, passwordFROM personWHERE username LIKE #{pattern}
</select>

第三题. 在mapper中如何传递多个参数?

方法1:顺序传参法

public User selectUser(String name, int deptId);
<select id="selectUser" resultMap="UserResultMap">select * from user where user_name = #{0} and dept_id = #{1}
</select>

#{}里面的数字代表传入参数的顺序。
这种方法不建议使用,sql层表达不直观,且一旦顺序调整容易出错。

方法2:@Param注解传参法

public User selectUser(@Param("userName") String name, @Param("deptId") int deptId);
<select id="selectUser" resultMap="UserResultMap">select * from user where user_name = #{userName} and dept_id = #{deptId}
</select>

#{}里面的名称对应的是注解@Param括号里面修饰的名称。
这种方法在参数不多的情况还是比较直观的,推荐使用。

方法3:Map传参法

public User selectUser(Map<String, Object> params);
<select id="selectUser" parameterType="java.util.Map" resultMap="UserResultMap">select * from user where user_name = #{userName} and dept_id = #{deptId}
</select>

#{}里面的名称对应的是Map里面的key名称。
这种方法适合传递多个参数,且参数易变能灵活传递的情况。

方法4:Java Bean传参法

public User selectUser(User user);
<select id="selectUser" parameterType="com.jourwon.pojo.User" resultMap="UserResultMap">select * from user where user_name = #{userName} and dept_id = #{deptId}
</select>

#{}里面的名称对应的是User类里面的成员属性。
这种方法直观,需要建一个实体类,扩展不容易,需要加属性,但代码可读性强,业务逻辑处理方便,推荐使用。

第四题. Mybatis如何执行批量操作

使用foreach标签
foreach的主要用在构建in条件中,它可以在SQL语句中进行迭代一个集合。
foreach标签的属性主要有item,index,collection,open,separator,close。

  • item 表示集合中每一个元素进行迭代时的别名,随便起的变量名;
  • index 指定一个名字,用于表示在迭代过程中,每次迭代到的位置,不常用;
  • open 表示该语句以什么开始,常用“(”;
  • separator表示在每次进行迭代之间以什么符号作为分隔符,常用“,”;
  • close 表示以什么结束,常用“)”。

在使用foreach的时候最关键的也是最容易出错的就是collection属性,该属性是必须指定的,但是在不同情况下,该属性的值是不一样的,主要有一下3种情况:

  1. 如果传入的是单参数且参数类型是一个List的时候,collection属性值为list
  2. 如果传入的是单参数且参数类型是一个array数组的时候,collection的属性值为array
  3. 如果传入的参数是多个的时候,我们就需要把它们封装成一个Map了,当然单参数也可以封装成map,实际上如果你在传入参数的时候,在MyBatis里面也是会把它封装成一个Map的集合,

map的key就是参数名,所以这个时候collection属性值就是传入的List或array对
象在自己封装的map里面的key
具体用法如下:

<insert id="addEmpsBatch">INSERT INTO emp(ename, gender, email, did) VALUES<foreach collection="emps" item="emp" separator=",">(#{emp.eName}, #{emp.gender}, #{emp.email}, #{emp.dept.id})</foreach>
</insert>
<insert id="addEmpsBatch"><foreach collection="emps" item="emp" separator=";">INSERT INTO emp(ename, gender, email, did) VALUES (#{emp.eName}, #{emp.gender}, #{emp.email}, #{emp.dept.id})</foreach>
</insert>

使用ExecutorType.BATCH
Mybatis内置的ExecutorType有3种,默认为simple,该模式下它为每个语句的执行创建一个新的预处理语句,单条提交sql;而batch模式重复使用已经预处理的语句,并且批量执行所有更新语句,显然batch性能将更优; 但batch模式也有自己的问题,比如在Insert操作时,在事务没有提交之前,是没有办法获取到自增的id,这在某型情形下是不符合业务要求的
具体用法如下

// EmployeeMapper.javapackage com.jourwon.mapper;import com.jourwon.model.Employee;public interface EmployeeMapper {Long addEmp(Employee employee);
}
<!-- EmployeeMapper.xml --><mapper namespace="com.jourwon.mapper.EmployeeMapper"><insert id="addEmp" parameterType="com.jourwon.model.Employee"><!-- 根据实际情况调整SQL语句 -->INSERT INTO employee (id, name, department) VALUES (#{id}, #{name}, #{department})</insert>
</mapper>
// YourTestClass.javaimport java.io.IOException;
import java.util.UUID;
import org.apache.ibatis.session.ExecutorType;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.junit.Test;
import com.jourwon.mapper.EmployeeMapper;public class YourTestClass {@Testpublic void testBatch() throws IOException {SqlSessionFactory sqlSessionFactory = getSqlSessionFactory();SqlSession openSession = sqlSessionFactory.openSession(ExecutorType.BATCH);// 批量保存执行前时间long start = System.currentTimeMillis();try {EmployeeMapper mapper = openSession.getMapper(EmployeeMapper.class);for (int i = 0; i < 1000; i++) {// 使用随机生成的 IDmapper.addEmp(new Employee(UUID.randomUUID().toString().substring(0, 5), "b", "1"));}openSession.commit();// 批量保存执行后时间long end = System.currentTimeMillis();System.out.println("执行时长:" + (end - start)); // 批量保存执行时间} finally {openSession.close();}}// 获取 SqlSessionFactory 的方法,请根据您的实际情况实现private SqlSessionFactory getSqlSessionFactory() {// 实现该方法以获取正确的 SqlSessionFactoryreturn null;}
}

第五题 MyBatis框架适用场景

  • MyBatis专注于SQL本身,是一个足够灵活的DAO层解决方案。
  • 对性能的要求很高,或者需求变化较多的项目,如互联网项目,MyBatis将是不错的选择。

如果我的内容对你有帮助,请点赞,评论,收藏。创作不易,大家的支持就是我坚持下去的动力
在这里插入图片描述

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

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

相关文章

windows 安装cuda 11.2过程记录

参考&#xff1a; https://blog.csdn.net/m0_45447650/article/details/123704930 https://zhuanlan.zhihu.com/p/99880204?from_voters_pagetrue 在显卡驱动被正确安装的前提下&#xff0c;在命令行里输入nvidia-smi.exe 下载CUDA Toolkit: https://developer.nvidia.com/…

CrossEntropyLoss 和NLLLoss的关系

交叉熵损失在做一件什么事? 看公式: x是预测(不需要softmax归一化),y是label, N是batch维度的数量,交叉熵损失,干了三件事. 1. 对输入在类别维度求softmax 2. 多softmax后的数,求log 3. 对(样本数, 类别数)为shape的tensor计算NLLLoss. 其中,NLLloss做的就是log取负, 和o…

java入门 - 规范你的代码注释

java基础语法-代码注释 注释只是为了提高可读性&#xff0c;不会被计算机编译。代码注释是架起程序设计者与程序阅读者之间的通信桥梁,最大限度的提高团队开发合作效率。也是程序代码可维护性的重要环节之一。 开发中注释可以分为三种方式&#xff1a; 行注释块注释类/方法注释…

Linux 大页内存 Huge Pages 虚拟内存

Linux 大页内存 Huge Pages 虚拟内存 - 秋来叶黄 - 博客园 (cnblogs.com) Linux为什么要有大页内存&#xff1f;为什么DPDK必须要设置大页内存&#xff1f;这都是由系统架构决定的。一开始为了解决一个问题&#xff0c;设计了对应的方案&#xff0c;随着事物的发展&#xff0c…

Splitpanes拆分窗格插件使用

目录 基本用法 纵向排列 遍历渲染 动态拆分宽度 项目开发中用到了拆分窗格(就是下面的效果&#xff0c;可以拆分网页&#xff0c;我们项目通常都是用左右两块拆分&#xff0c;可以通过拖动图标进行左右拖动)&#xff0c;于是就发现了一个很好用的插件&#xff1a;Splitpane…

上位机图像处理和嵌入式模块部署(qmacvisual畸变矫正)

【 声明&#xff1a;版权所有&#xff0c;欢迎转载&#xff0c;请勿用于商业用途。 联系信箱&#xff1a;feixiaoxing 163.com】 大部分同学在开始做计算机图像的时候&#xff0c;是没有意识到畸变矫正这个问题的。当然不仅仅是畸变矫正&#xff0c;很多同学还会忽略光源的问题…

python异常:Exception、BaseException接收异常,并打印异常信息msg

except IOEerror 只能接收到 IO 类型的错误&#xff0c;对于抛出的 NameError 类型的错误&#xff0c;在 Python 中所有的异常类都继承 Exception&#xff0c;所以我们可以使用它来接收所有的异常。 1.Exception接收异常 源码&#xff1a; open("test1.py",r) pr…

4款智能文章生成器推荐,为你创作文章效率高

智能文章生成器的出现为创作者带来了很多方便&#xff0c;尤其是在当今信息爆炸的时代&#xff0c;内容创作已经成为许多人日常工作中不可或缺的一部分。无论是博客、新闻报道、营销文案还是学术论文&#xff0c;高质量的文章往往需要耗费大量的时间和精力来撰写。但有了智能文…

固态硬盘格式化后怎么恢复 固态硬盘被格式化后如何恢复

你知道吗,固态硬盘被格式化后,还有一线生机可以让你把数据找回来!固态硬盘被格式化后如何恢复?不要慌张,我们来一步一步地看看该怎么做。首先,你需要知道格式化并不是真正意义上的删除数据,而是把硬盘上的文件系统清空,让数据变得不可见。所以,只要你没有在格式化后往…

Linux —— 定时任务(sleep、crontab、at)

目录 1、使用 sleep 来完成定时任务 2、使用 crontab 来进行定时任务 3、使用 at 来执行单次的定时任务 1、使用 sleep 来完成定时任务 sleep n 等待 n 秒再继续往后执行 usleep n 等待 n 微秒再继续往后执行&#xff08;1 秒等于 1 000 000 微秒&#xf…

uniapp使用Echarts图表H5显示正常 打包app显示异常

uniapp使用Echarts在H5页面调试 调试完在H5正常显示 然后通过安卓机调试的时候 发现直接空白了 还有这个爆错 Initialize failed: invalid dom 我有多个图表、图表是通过v-for循环出来的 解决方案 原来是yarn直接安装Echarts 然后改成本地JS文件引入 gitbub文件地址 — dist/…

二十几岁的我们:在旷野中找寻自我

二十几岁&#xff0c;这是一个充满变数、充满机遇和挑战的年纪。它如同一片辽阔的旷野&#xff0c;每个人都在其中寻找自己的方向&#xff0c;摸索着自己的道路。这是一个既令人兴奋又令人迷茫的年纪&#xff0c;我们穿着不同的鞋子&#xff0c;注定要走不同的路。 在这个年纪里…

面向对象(下)

目录 01、static1.1、static的使用1.2、static应用举例1.3、单例(Singleton)设计模式 02、main方法的语法03、类的成员之四&#xff1a;代码块04、关键字&#xff1a;final05、抽象类与抽象方法5.1、多态的应用&#xff1a;模板方法设计模式(TemplateMethod) 06、接口(interfac…

(九)Android布局类型(约束布局ConstraintLayout)

约束布局&#xff08;ConstraintLayout&#xff09;与相对布局差不多&#xff0c;是创建一个应用后默认的布局方式&#xff0c;比相对布局更加灵活&#xff0c;一般用于平铺的布局&#xff08;不适用于层叠布局&#xff09;&#xff0c;常用于托拖拽方式构建页面&#xff0c;最…

第五篇:数字视频广告格式概述 - IAB视频广告标准《数字视频和有线电视广告格式指南》

第五篇&#xff1a;第五篇&#xff1a;数字视频广告格式概述 - IAB视频广告标准《数字视频和有线电视广告格式指南 --- 我为什么要翻译介绍美国人工智能科技公司IAB系列技术标准&#xff08;2&#xff09; ​​​​​​​翻译计划 第一篇序言第二篇简介和目录第三篇概述- IA…

由浅到深认识C语言(2):C语言的类型及语句

该文章Github地址&#xff1a;https://github.com/AntonyCheng/c-notes 在此介绍一下作者开源的SpringBoot项目初始化模板&#xff08;Github仓库地址&#xff1a;https://github.com/AntonyCheng/spring-boot-init-template & CSDN文章地址&#xff1a;https://blog.csdn…

pr画中画模板视频素材

pr画中画视频模板&#xff0c;视频聊天对话模板。软件支持&#xff1a;Premiere Pro 2021或更高版本。 来自&#xff1a;pr模板网&#xff0c;下载地址&#xff1a;https://prmuban.com/38196.html

代码随想录算法训练营第day26|39. 组合总和、 40.组合总和II、 131.分割回文串

39. 组合总和 力扣题目链接(opens new window) 给定一个无重复元素的数组 candidates 和一个目标数 target &#xff0c;找出 candidates 中所有可以使数字和为 target 的组合。 candidates 中的数字可以无限制重复被选取。 说明&#xff1a; 所有数字&#xff08;包括 ta…

execl数据多维度建模(二)

源数据 1.选择数据 1&#xff09;插入透视表 选中源数据的数据区域--插入--数据透视表&#xff08;新的工作表名&#xff1a;透视表&#xff09; 2&#xff09;透视表设置 ShipCountry拉入行标签&#xff1b;CategoryName拉入列标签&#xff1b;sales拉入值的位置 3&#xf…

计算机二级Python题目12

目录 1. 基础题 1.1 基础题1 1.2 基础题2 1.3 基础题3 2. turtle画图题 3. 大题 3.1 大题1 3.2 大题2 1. 基础题 1.1 基础题1 sinput("请输入一个小数&#xff1a;") ss[::-1] cs0 for c in s:if c.:breakcseval(c) print({:*>10}.format(cs)) 1.2 基础…