MyBatis—MyBatis参数详解

news2025/1/21 7:12:38

文章目录

  • MyBatis参数详解
    • 1、 parameterType
    • 2、resultType
    • 3、 resultMap结果类型
  • MyBatis获取参数值的两种方式
    • 1.配置sql输出日志
    • 2.看#{}和${}的输出现象
    • 3.#{}的预编译
    • 4.sql注入
    • 5.什么时候使用${}
    • 6.如何选择使用 #{} 和 ${}
    • 7.为什么#{}可以预防sql注入

————————————————————————————————

MyBatis参数详解

1、 parameterType

1、简单数据类型
int double类型 String类型
简单的写法:java.lang.Integer --> int integer Int Integer 都可以,框架提供简写的方式。
2、 POJO(JavaBean实体类)对象类型,默认是不能简写,可以配置。
User对象

2、resultType

1、返回简单数据类型
int double long String
2、返回POJO数据类型
返回User对象类型

3、 resultMap结果类型

resultType可以指定pojo将查询结果映射为pojo,但需要pojo的属性名和sql查询的列名一致方可映射成功。
如果sql查询字段名和pojo的属性名不一致,可以通过resultMap将字段名和属性名作一个对应关系 ,resultMap实质上还需要将查询结果映射到pojo对象中。 resultMap可以实现将查询结果映射为复杂类型的pojo,比如在查询结果映射对象中包括pojo和list实现一对一查询和一对多查询。
dao层

/**
 * resultMap
 * @return
 */
public List<User> findAlResultMap();

mapping层 — 设置resultMap

<resultMap id="ResultMap" type="com.qcby.entity.User">
    <id column="id" property="id" jdbcType="INTEGER"/>
    <result column="username" property="username" jdbcType="VARCHAR"/>
    <result column="birthday" property="birthday" jdbcType="VARCHAR"/>
    <result column="sex" property="sex" jdbcType="VARCHAR"/>
    <result column="address" property="address" jdbcType="VARCHAR"/>
</resultMap>

<select id="findAlResultMap" resultMap="ResultMap">
    select * from user
</select>

测试

@Test
public void findAlResultMap(){
    List<User> users = mapper.findAlResultMap();
    for (User user: users) {
        System.out.println(user);
    }
}

MyBatis获取参数值的两种方式

Mybatis获取参数值得两种方式:${}和#{}

${}的本质是字符串拼接,#{}的本质是占位符赋值

${}使用字符串拼接的方式拼接sql,若为字符串类型或日期类型的字段进行赋值时,需要手动加单引号;

#{}使用占位符赋值的方式拼接sql,此时为字符串类型或日期类型的字段赋值时,可以自动添加单引号;

1.配置sql输出日志

注意:要在配置文件的第一行进行配置

<!-- settings:控制mybatis的全局行为-->
<settings>
    <!--设置mybatis输出日志-->
    <!--logImpl:表示对日志的控制-->
    <!--STDOUT_LOGGING:将日志输出到控制台上-->
    <setting name="logImpl" value="STDOUT_LOGGING" />
</settings>

2.看#{}和${}的输出现象

首先先来看#{}的输出

<!--通过#进行查询-->
<select id="select"  parameterType="java.lang.String" resultType="com.qcby.entity.User">
    select * from user where username = #{username}
</select>

在这里插入图片描述
我们可以看到当前执行的sql语句的日志执行结果最后的条件值是用 ?代替
其次来看${}的输出

<!--通过$进行查询-->
<select id="selectBy$" parameterType="java.lang.String" resultType="com.qcby.entity.User">
    select * from user where username = ${value}
</select>

在这里插入图片描述

我们发现和上边用 #号不同,这次输出的sql 直接在上边拼接好了我们要查询的值,而且还出现了错误
我们将这条sql语句放入到mysql当中去执行,发现原因是我们sql语句在值上没有带单引号
在这里插入图片描述
所有我们需要重新编辑sql
在这里插入图片描述
从上边我们可以看出$使用的是字符串连接的方式,#使用的是占位符的方式

3.#{}的预编译

#{}是占位符:动态解析 -> 预编译 -> 执行
${}是拼接符:动态解析 -> 编译 -> 执行

预编译可以类比java类的编译,java类被编译成class文件,载入虚拟机,载入虚拟机的字节码文件可以先被编译成机器吗,那么在执行某行代码的时候就可以直接执行编译后的机器码,而不用从字节码开始编译再执行,那么执行效率就高了。这也是为啥热机状态比冷机状态可以抗更多负载的原因。

sql的预编译也是一样的道理,在执行前就编译好,等执行时直接取编译结果去执行。省去编译时间。sql预编译后会在参数位置用占位符表示

预编译:数据库驱动在发送sql和参数到DBMS之前,先对sql语句进行编译处理,之后DBMS则可以直接对sql进行处理,不需要再次编译,提高了性能。这一点mybatis 默认情况下,将对所有的 sql 进行预编译处理。

  • 预编译可以将多个操作步骤合并成一个步骤,一般而言,越复杂的sql,编译程度也会复杂,难度大,耗时,费性能,而预编译可以合并这些操作,预编译之后DBMS可以省去编译直接运行sql。
  • 预编译语句可以重复利用。把一个 sql 预编译后产生的 PreparedStatement 对象缓存下来,下次对于同一个sql,可以直接使用这个缓存的 PreparedState 对象。

4.sql注入

使用${}做字符串拼接的方式并不安全,可能存在sql注入问题
比如我们要做如下查询
select * from user where username = ${value};
但是如果我们的传参是: “张三 or username = 李四”
这种通过传参就能改变SQL语句原本规则的操作就是SQL注入,这个在实际生产中当然是危险的,攻击者可以把SQL命令插入到Web表单的输入域或页面请求的查询字符串中,欺骗服务器执行恶意的SQL命令。
以上的情况就属于sql注入攻击。

5.什么时候使用${}

$:可以替换表名或者列名,你能确定数据是安全的,可以使用$

6.如何选择使用 #{} 和 ${}

1.能用 #{} 的地方就用 #{},尽量少用 ${}
2.表名作参数,或者order by 排序时用 ${}
3.传参时参数使用@Param("")注解,@Param注解的作用是给参数命名,参数命名后就能根据名字得到参数值(相当于又加了一层密),
正确的将参数传入sql语句中(一般通过#{}的方式,${}会有sql注入的问题)

7.为什么#{}可以预防sql注入

mybatis的#{}之所以能够预防sql注入是因为底层使用了PrepardStatment类的setString()方法来设置参数,
此方法会获取参数传递过来的每个字符,然后进行循环对比,如果发现有敏感字符(如:单引号、双引号等),
则会在上边加一个‘/’代表转义此符号,让其变成一个普通的字符串,不参与SQL语句的生成,达到预防sql注入的效果

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

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

相关文章

Shuffle的作用以及MapReduce的Shuffle过程

Shuffle的设计 为什么需要Shuffle&#xff1f; Shuffle的本质是基于磁盘划分来解决分布式大数据量的全局分组、全局排序、重新分区【增大】 等问题 因为单台机器的资源处理不了分布式大数据量全局分区/排序/分组 所以需要通过Shuffle对每一台机器的数据构建一个Task来做分区的…

通关剑指 Offer——剑指 Offer II 055. 二叉搜索树迭代器

1.题目描述 剑指 Offer II 055. 二叉搜索树迭代器 实现一个二叉搜索树迭代器类BSTIterator &#xff0c;表示一个按中序遍历二叉搜索树&#xff08;BST&#xff09;的迭代器&#xff1a; BSTIterator(TreeNode root) 初始化 BSTIterator 类的一个对象。BST 的根节点 root 会…

20221221英语学习

今日新词 define v.下定义&#xff1b;确切说明&#xff08;或解释&#xff09;&#xff1b;树立&#xff0c;表明 chemistry n.化学, 物质的化学组成&#xff08;或性质&#xff09; fly v.飞, 飞翔, 航行, &#xff08;乘航空器或航天器&#xff09;航行 forfeit v.&…

港华燃气上线WeOps推动运维效能提升,托举业务智慧运行!

“嘉为蓝鲸WeOps一体化运维平台有效提升了运维工作效率&#xff0c;满足系统安全要求&#xff0c;尤其是补丁安装、巡检自动化、监控告警等功能&#xff0c;为我们节省了运维人力成本和时间成本。” ——来自港华燃气 港华集团介绍&#xff1a; 港华集团为香港中华煤气在内地…

m在LTE-A系统载波聚合下的资源分配算法的matlab仿真

目录 1.算法描述 2.仿真效果预览 3.MATLAB核心程序 4.完整MATLAB 1.算法描述 载波聚合即CA&#xff0c;是LTE-A中的关键技术。是为满足用户峰值速率和系统容量提升的要求&#xff0c;增加系统传输带宽的技术&#xff0c;通过CA技术&#xff0c;用户最高上网速率可提升到300…

IPv4 和 IPv6 报文格式详解

文章目录1 概述2 报文格式2.1 IPv42.2 IPv62.3 两者区别3 网工软考真题1 概述 2 报文格式 2.1 IPv4 中文名英文名长度 bit&#xff08;位&#xff09;解释版本Version4IP协议版本号&#xff0c;固定为 4首部长度Header Length4数据报首部的总长度。 以 4 Byte&#xff08;字节…

【Java基础知识复盘】Java概述篇

本人知识复盘系列的博客并非全部原创&#xff0c;大部分摘自网络&#xff0c;只是为了记录在自己的博客方便查阅&#xff0c;往后也会陆续在本篇博客更新本人查阅到的新的知识点&#xff0c;望悉知&#xff01; Java概述 何为编程 编程就是让计算机为解决某个问题而使用某种程…

100多条2023年元宇宙统计数据!Hubbleverse替你整理好了!

欢迎来到Hubbleverse &#x1f30d; 关注我们 关注宇宙新鲜事 &#x1f4cc; 预计阅读时长&#xff1a;9分钟 本文仅代表作者个人观点&#xff0c;不代表平台意见&#xff0c;不构成投资建议。 元宇宙最近被评为最热门的新兴技术趋势之一。在过去的几年里&#xff0c;元宇宙…

SpringBoot整合Mybatis之Mapper接口和映射文件

一、什么是MyBatis MyBatis中文网https://mybatis.net.cn/ MyBatis 是一款优秀的持久层框架&#xff0c;它支持自定义 SQL、存储过程以及高级映射。MyBatis 免除了几乎所有的 JDBC 代码以及设置参数和获取结果集的工作。MyBatis 可以通过简单的 XML 或注解来配置和映射原始类型…

消息中间件执行原理

1 关于消息中间件 1.1 什么是消息中间件&#xff1f; 消息中间件是指在分布式系统中完成消息的发送和接收的基础软件。 消息中间件也可以称消息队列&#xff08;Message Queue / MQ&#xff09;&#xff0c;用高效可靠的消息传递机制进行与平台无关的数据交流&#xff0c;并基…

区块链技术应用展望

区块链作为一个"去中心化"的分布式账本数据库&#xff0c;能够让数据的产生、运行和应用更加公开与透明。区块链被认为是互联网之后又一大创新之举&#xff0c;是第二个互联网时代——价值互联网时代的来临&#xff0c;区块链将从基础设施层面为各行各业带来巨大的变…

力扣(LeetCode)353. 贪吃蛇(2022.12.20)

请你设计一个 贪吃蛇游戏&#xff0c;该游戏将会在一个 屏幕尺寸 宽度 x 高度 的屏幕上运行。如果你不熟悉这个游戏&#xff0c;可以 点击这里 在线试玩。 起初时&#xff0c;蛇在左上角的 (0, 0) 位置&#xff0c;身体长度为 1 个单位。 你将会被给出一个数组形式的食物位置…

C++中二叉树的递归遍历方法

在《C中二叉树的非递归遍历方法2-1》中提到&#xff0c;二叉树的遍历分为前序遍历、中序遍历、后序遍历和层序遍历四种。要遍历的二叉树如图1所示。 图1 二叉树结构 创建该二叉树的代码请参见《C中二叉树的非递归遍历方法2-1》。 1 前序遍历的递归实现 前序遍历的输出顺序是…

VC2010 的控制台程序中使用 EasyX

以下是在 VC2010 的控制台应用程序中使用 EasyX 的具体步骤&#xff1a; 1. 启动 VC2010&#xff0c;点击菜单 File -> New -> Project...&#xff0c;打开 New Project 对话框&#xff1a; 2. 选择 “Win32 Console Application” 类型的项目&#xff0c;并选择项目所在…

「驱动知识」Linux下RTC时间的读写分析

Linux下RTC时间的读写分析​ 1.1.1 系统时间与RTC时间​ Linux系统下包含两个时间&#xff1a;系统时间和RTC时间。​ 系统时间&#xff1a;是由主芯片的定时器进行维护的时间&#xff0c;一般情况下都会选择芯片上最高精度的定时器作为系统时间的定时基准&#xff0c;以避免…

【我不熟悉的javascript】map和weakmap的区别

map 保存键值对&#xff0c;并且能够记住键的原始插入顺序&#xff0c;任何值(对象或者基本类型)都可以作为一个键或一个值 基本方法有 get, set, has, delete, clear长度 .size迭代 keys, values, extries, forEach可以使用for ...of 迭代任何值(对象或者基本类型)都可以作为…

如何在头条做营销:2022今日头条营销价值洞察报告.pdf(附下载链接)

省时查报告-专业、及时、全面的行研报告库省时查方案-专业、及时、全面的营销策划方案库【免费下载】2022年11月份热门报告盘点《底层逻辑》高清配图华为2021数字化转型&#xff1a;从战略到执行.pdf华为项目管理金种子培训教材.pdf清华大学256页PPT元宇宙研究报告.pdf&#xf…

nn.AdaptiveAvgPool2d和nn.AvgPool2d的区别

nn.AdaptiveAvgPool2d 功能&#xff1a;该函数与二维平均池化运算类似&#xff0c;区别主要体现在自适应上&#xff0c;对于任何输入大小&#xff0c;输出大小均为指定的HW大小。 nn.AdaptiveAvgPool2d(output_size)output_size&#xff1a;指定的输出大小&#xff0c;可以是…

echarts-for-weixin只显示折线图,其他不显示解决办法

小程序使用echarts-for-weixin展示图表&#xff0c;结果只展示折线图&#xff0c;其他的统统不显示&#xff0c;百度大法一下午终于知道可能是echarts包内只有折线图。 下载好替换搞定&#xff01;

【Vue 快速入门系列】3分钟掌握Vue中插槽的使用与理解

文章目录前言一、常规实现方式二、匿名插槽三、具名插槽四、作用域插槽前言 插槽作用&#xff1a;让父组件可以向子组件指定位置插入html结构&#xff0c;也是一种组件间通信的方式&#xff0c;适用于 父组件 > 子组件 。 插槽分类&#xff1a;默认插槽、具名插槽、作用域插…