每日五道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, password
    FROM person
    WHERE 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.java

package 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.java

import 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 {
    
    @Test
    public 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++) {
                // 使用随机生成的 ID
                mapper.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() {
        // 实现该方法以获取正确的 SqlSessionFactory
        return null;
    }
}

第五题 MyBatis框架适用场景

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

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

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

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

相关文章

3.程序语言基础知识

主要议题&#xff1a; 掌握高级语言、低级语言的特点和应用场景&#xff1b; 程序编译&#xff0c;记词法、文法规则&#xff1b; 表达式主要考察中缀表达式和后缀表达式之间的相互转换&#xff1b; 传值与传址&#xff0c;分清特点&#xff0c;结合程序代码求值&#xff1b; …

python知识点总结(二)

这里写目录标题 1、什么是解释性语言&#xff0c;什么是编译性语言&#xff1f;2、说说中作用域是怎么划分的3、type和isinstance方法的区别4、浅拷贝和深拷贝5、python中变量在内存中存储方式6、python中的封装、继承、多态7、python中内存管理机制是怎么样的&#xff1f;8、简…

S32DS 中编译生成bin文件

1、按下图执行 按下图勾选 Create flash image 再次打开Properties 选择 Raw Binary 选择Debug_Flash进行编译后&#xff0c;在Debug_Flasg文件夹下就会出现bin文件 若没有出现 右键选择refresh 刷新一下即可

Python Web开发记录 Day13:Django part7 Ajax入门与案例(任务管理)

名人说&#xff1a;莫道桑榆晚&#xff0c;为霞尚满天。——刘禹锡&#xff08;刘梦得&#xff0c;诗豪&#xff09; 创作者&#xff1a;Code_流苏(CSDN)&#xff08;一个喜欢古诗词和编程的Coder&#x1f60a;&#xff09; 目录 1、Ajax入门①简介②工作原理③优点④缺点⑤使用…

明远创意生活引领经典家纺品牌“大朴”走向新生

十二年前,有一个初创的国产家纺品牌,大胆地向消费者喊出领先于行业的标准——“无甲醛、无荧光增白剂、无致癌物”。凭借这样极致的健康承诺,“大朴”国内销售规模迅速超过一亿人民币,成功引领行业风气,收获了众多忠实粉丝。 2023年,因资金链断裂,“大朴”原公司破产清算,这个…

图书管理系统

一.book包 1.书的类 一本书的基本内容&#xff1a; 成员变量是private那么我们就需要set和get方法&#xff0c;也需要一个构造方法&#xff1a; Tostring的方法也需要加上&#xff1a; 2.书的增加是i在书架上操作的&#xff0c;创建一个BookList类 首先我们需要让书和书…

nginx 基本使用、借助 nginx 和 mkcert 实现本地 https://localhost 测试。

CSDN 如何将资源设置为免费&#xff1f; 安装和基本使用 进入 nginx 官网 下载 Mainline version 版本 解压到一个你喜欢的位置&#xff0c;比如解压到 C: 目录 不管配不配置环境变量&#xff0c;对 nginx 的所有操作都应该在对应文件夹中 基本命令的使用&#xff1a; cd …

初级爬虫实战——哥伦比亚大学新闻

文章目录 发现宝藏一、 目标二、简单分析网页1. 寻找所有新闻2. 分析模块、版面和文章 三、爬取新闻1. 爬取模块2. 爬取版面3. 爬取文章 四、完整代码五、效果展示 发现宝藏 前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不…

手写微前端micro-app-页面渲染

我们可以使用循环递归的方式提取上面字符串资源中所有遍历到的link、style、script标签&#xff0c;提取静态资源地址并格式化标签。 在source.js文件中&#xff0c;添加extraSourceDom函数&#xff0c;用来提取link&#xff0c;script这种特殊标签 // 提取link的css链接 fun…

一些 AI 工具

AI 搜索&#xff1a;Phind&#xff0c;perplexity AI聊天大模型&#xff1a;chatgpt&#xff0c; kimi&#xff08;国内可用&#xff0c;支持上传文件&#xff09; AI 机器人&#xff1a;https://www.coze.com/ AI工具集&#xff1b;https://ai-bot.cn/#term-2 agent GPT&a…

【REST2SQL】13 用户角色功能权限设计

【REST2SQL】01RDB关系型数据库REST初设计 【REST2SQL】02 GO连接Oracle数据库 【REST2SQL】03 GO读取JSON文件 【REST2SQL】04 REST2SQL第一版Oracle版实现 【REST2SQL】05 GO 操作 达梦 数据库 【REST2SQL】06 GO 跨包接口重构代码 【REST2SQL】07 GO 操作 Mysql 数据库 【RE…

【每日一题】2024年3月汇编(上)

3.1【2369】检查数组是否存在有效划分 2369. 检查数组是否存在有效划分https://leetcode.cn/problems/check-if-there-is-a-valid-partition-for-the-array/ 1.这样的判断可以用动态规划来解决&#xff0c;用一个长度为(n1) 的数组来记录 是否存在有效划分&#xff0c;dp[i]…

【iOS】ARC学习

文章目录 前言一、autorelease实现二、苹果的实现三、内存管理的思考方式__strong修饰符取得非自己生成并持有的对象__strong 修饰符的变量之间可以相互赋值类的成员变量也可以使用strong修饰 __weak修饰符循环引用 __unsafe_unretained修饰符什么时候使用__unsafe_unretained …

webstorm 使用prettier格式化保存 导致代码缩进与gitlab代码不一致问题

问题 webstorm显示缩进正常 gitlab显示不正常 解决 .prettierrc.js module.exports {printWidth: 100,tabWidth: 2,useTabs: false, //设置为false 不使用tab作为缩进符semi: true,vueIndentScriptAndStyle: true,singleQuote: true,quoteProps: as-needed,bracketSpaci…

肖恩的投球游戏——前缀和

题目链接&#xff1a;1.肖恩的投球游戏 - 蓝桥云课 (lanqiao.cn) 前缀和&#xff1a; package lanqiao;import java.util.Arrays; import java.util.Scanner;/*** 2023/11/29* 前缀和问题*/ public class lanqiao3693_肖恩的投球游戏 {public static void main(String[] args) …

vue3+vite项目打包遇到的问题

一、项目打包出现空白页 vite.config.js中&#xff0c;添加base: ./ import { defineConfig } from vite import vue from vitejs/plugin-vueexport default defineConfig({base: ./, })router/index.js&#xff0c;将路由模式改成hash模式 import { createRouter, createWe…

性能分析调优模型

性能测试除了为获取性能指标外&#xff0c;更多是为了发现性能瓶颈和性能问题&#xff0c;然后针对性能问题和性能瓶颈进行分析和调优。在当今互联网高速发展的时代&#xff0c;结合传统软件系统模型以及互联网网站特征&#xff0c;性能调优的模型可以归纳总结为如图1-5-1所示的…

idea 的基本配置

一、安装目录介绍 其中&#xff1a;bin 目录下&#xff1a; 二、配置信息目录结构 这是 IDEA 的各种配置的保存目录。这个设置目录有一个特性&#xff0c;就是你删除掉整个目录之后&#xff0c;重新启动 IntelliJ IDEA 会再自动帮你生成一个全新的默认配置&#xff0c;所以很多…

力扣● 583. 两个字符串的删除操作 ● 72. 编辑距离 ● 编辑距离总结篇

● 583. 两个字符串的删除操作 注意审题&#xff1a; 给定两个单词 word1 和 word2 &#xff0c;返回使得 word1 和 word2 相同所需的最小步数。 每步 可以删除任意一个字符串中的一个字符。 删除最少的字符使两者相同&#xff0c;说明留下来的就是最大公共子序列。不要求…

01.Vue2入门

一、为什么要学习Vue 1.前端必备技能 2.岗位多&#xff0c;绝大互联网公司都在使用Vue 3.提高开发效率 4.高薪必备技能&#xff08;Vue2Vue3&#xff09; 二、什么是Vue 概念&#xff1a;Vue (读音 /vjuː/&#xff0c;类似于 view) 是一套 **构建用户界面 ** 的 渐进式 …