【MyBatis】MyBatis中#{}与${}的区别是什么?

这篇具有很好参考价值的文章主要介绍了【MyBatis】MyBatis中#{}与${}的区别是什么?。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

前言

在开发中使用Mybatis经常使用到#{}与${},二者区别是?来总结一下。

在mybatis中动态 sql 是其主要特性之一,在 mapper 中定义的参数传到 xml 中之后,在执行操作之前 mybatis 会对其进行动态解析。mybatis 提供了两种支持动态 sql 的语法:#{} 以及 $ {},其最大的区别则是#{}方式能够很大程度防止sql注入(安全),${}方式无法防止Sql注入。Sql注入指的是程序解析时会将你传入的参数作为原来SQL语句的一部分,打乱原来SQL的结构,而通常我们只是需要传入一个参数而已。

一、彻底理解SQL注入

什么?还不懂SQL注入,那就来个最简单的例子:一般开发,肯定是在前台有两个输入框,一个用户名,一个密码,会在后台里,读取前台传入的这两个参数,拼成一段SQL,例如: select count(1) from tab where usesr=userinput and pass = passinput,把这段SQL连接数据后,看这个用户名/密码是否存在,如果存在的话,就可以登陆成功了,如果不存在,就报一个登陆失败的错误。

但是有这样的情况,这段SQL是根据用户输入拼出来,如果用户故意输入可以让后台解析失败的字符串,这就是SQL注入,例如,用户在输入密码的时候,输入 ‘’’’ ’ or 1=1’’, 这样,后台的程序在解析的时候,拼成的SQL语句,可能是这样的: select count(1) from tab where user=userinput and pass=’’ or 1=1; 看这条语句,可以知道,在解析之后,用户没有输入密码,加了一个恒等的条件 1=1,这样,这段SQL执行的时候,返回的 count值肯定大于1的,如果程序的逻辑没加过多的判断,这样就能够使用用户名 userinput登陆,而不需要密码。

防止SQL注入,首先要对密码输入中的单引号进行过滤,再在后面加其它的逻辑判断,或者不用这样的动态SQL拼。

二、关于 # { }

  1. #{}表示一个占位符号 相当于 jdbc中的 ? 符号
    #{}实现的是向prepareStatement中的预处理语句中设置参数值,sql语句中#{}表示一个占位符即?

  2. #{}将传入的数据都当成一个字符串,会对自动传入的数据加一个双引号。如:select * from user where id= #{user_id},如果传入的值是11,那么解析成sql时的值为where id=“11” ,

  3. 如果sql语句中只有一个参数,此时参数名称可以随意定义
    如果sql语句有多个参数,此时参数名称应该是与当前表关联[实体类的属性名]或则[Map集合关键字],不能随便写,必须对应!如下图

【MyBatis】MyBatis中#{}与${}的区别是什么?

三、关于$ { }

  1. $ {}将传入的数据直接显示生成在sql中。如:select * from user where id= $ {user_id},如果传入的值是11,那么解析成sql时的值为where id=11

  2. $ {value}中value值有限制只能写对应的value值不能随便写,因为${}不会自动进行jdbc类型转换

  3. 简单来说,在JDBC不支持使用占位符的地方,都可以使用${}

四、Mybatis中#{}与${}的区别

简单来说区别就是

#{}方式能够很大程度防止sql注入(安全),${}方式无法防止Sql注入

在JDBC能使用占位符的地方,最好优先使用#{}

在JDBC不支持使用占位符的地方,就只能使用${},典型情况就是 动态参数

比如 有两张表,分别是emp_2017 和 emp_2018 .如果需要在查询语句中 动态指定表名,就只能使用${}

<select>
      select *  from emp_ ${year}
<select>

再比如MyBatis 排序时使用order by 动态参数时,此时也只能使用${}

<select>
       select  *  from dept order by ${name}
</select>

五、代码案例

一般# {}与$ {}用的比较多的地方是模糊查询方面,所以下面来一个模糊查询的案例

使用#{}案例

  1. 映射文件

在User.xml配置文件中添加如下内容:

<!-- 如果返回多个结果,mybatis会自动把返回的结果放在list容器中 -->
	<!-- resultType的配置和返回一个结果的配置一样 -->
	<select id="queryUserByUsername1" parameterType="string"
		resultType="cn.itcast.mybatis.pojo.User">
		SELECT * FROM `user` WHERE username LIKE #{username}
	</select>
  1. 测试程序

MybatisTest中添加测试方法如下:

@Test
	public void testQueryUserByUsername1() throws Exception {
		// 4. 创建SqlSession对象
		SqlSession sqlSession = sqlSessionFactory.openSession();

		// 5. 执行SqlSession对象执行查询,获取结果User
		// 查询多条数据使用selectList方法
		List<Object> list = sqlSession.selectList("queryUserByUsername1", "%王%");

		// 6. 打印结果
		for (Object user : list) {
			System.out.println(user);
		}

		// 7. 释放资源
		sqlSession.close();
	}

测试效果如下图:

【MyBatis】MyBatis中#{}与${}的区别是什么?

使用$ {}案例

  1. 映射文件:

在User.xml配置文件中添加如下内容:

<!-- 如果传入的参数是简单数据类型,${}里面必须写value -->
	<select id="queryUserByUsername2" parameterType="string"
		resultType="cn.itcast.mybatis.pojo.User">
		SELECT * FROM `user` WHERE username LIKE '%${value}%'
	</select>
  1. 测试程序:
    MybatisTest中添加测试方法如下:
@Test
public void testQueryUserByUsername2() throws Exception {
	// 4. 创建SqlSession对象
	SqlSession sqlSession = sqlSessionFactory.openSession();

	// 5. 执行SqlSession对象执行查询,获取结果User
	// 查询多条数据使用selectList方法
	List<Object> list = sqlSession.selectList("queryUserByUsername2", "王");

	// 6. 打印结果
	for (Object user : list) {
		System.out.println(user);
	}

	// 7. 释放资源
	sqlSession.close();
}

当然两个案例效果一致!文章来源地址https://www.toymoban.com/news/detail-465568.html

到了这里,关于【MyBatis】MyBatis中#{}与${}的区别是什么?的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包赞助服务器费用

相关文章

  • Spring Boot 中的 MyBatis 是什么,如何使用

    Spring Boot 中的 MyBatis 是什么,如何使用

    MyBatis 是一种流行的 Java 持久化框架,可以将 SQL 查询映射到对象上,并提供了简单易用的 API 来执行 CRUD 操作。Spring Boot 可以与 MyBatis 集成,提供了简化配置和自动化配置的功能,使得使用 MyBatis 变得更加容易。 在本文中,我们将介绍 Spring Boot 中的 MyBatis,包括如何配置和使

    2024年02月16日
    浏览(10)
  • Mybatis【使用注解开发】

    Mybatis【使用注解开发】

    我们的SQL语句不再需要在 UserMapper.xml 这样的映射文件中区配置了,直接在接口处定义SQL语句即可。 mappers 只需要指定接口即可。         使用注解来映射简单语句会使代码显得更加简洁,但对于稍微复杂一点的语句,Java 注解不仅力不从心,还会让你本就复杂的 SQL 语句更

    2024年02月13日
    浏览(11)
  • mybatis_使用注解开发

    mybatis_使用注解开发

    第一步:使用注解写一个接口 第二步:绑定接口  第三步:测试 官方提示: 使用注解来映射简单语句会使代码显得更加简洁,但对于稍微复杂一点的语句,Java 注解不仅力不从心,还会让本就复杂的 SQL 语句更加混乱不堪。 因此,如果你需要做一些很复杂的操作,最好用

    2024年02月15日
    浏览(8)
  • 使用MyBatis的mapper接口调用时有哪些要求?Mybatis 动态 sql 有什么用?执行原理?有哪些动态 sql?

    1. Mapper接口方法名和mapper.xml中定义的每个 sql的id相同 2.Mapper接口方法的输入参数类型和mapper.xml中定义的每个sql 的 parameterType的类型相同 3.Mapper接口方法的输出参数类型和mapper.xml中定义的每个sql的 resultType的类型相同 4.Mapper.xml文件中的 namespace 即是 mapper接口的类路径 可以在

    2024年02月16日
    浏览(10)
  • Mybatis的动态SQL及关键属性和标识的区别(对SQL更灵活的使用)

    Mybatis的动态SQL及关键属性和标识的区别(对SQL更灵活的使用)

                                                                                     (  虽然文章中有大多文本内容,想了解更深需要耐心看完,必定大有受益 ) 目录 一、动态SQL ( 1 ) 是什么 ( 2 ) 作用 ( 3 ) 优点 ( 4 ) 特殊标签 ( 5 ) 演示 二、#和$的区别 2.1  #使用  

    2024年02月11日
    浏览(9)
  • MyBatis 中的动态 SQL 是什么? 如何使用动态 SQL?

    在 MyBatis 中,动态 SQL 是指能够根据条件动态生成 SQL 语句的功能。通过使用动态 SQL,可以根据不同的条件生成不同的 SQL 语句,从而实现灵活的查询和操作。 条件判断:通过 , , , 标签实现 SQL 语句中的条件逻辑,根据传入参数的值来决定是否包含某一部分 SQL 语句。 循环遍

    2024年04月15日
    浏览(12)
  • 使用Mybatis Plus进行DAO层开发

    一、特性 Mybatis应该大家现在都知道,而且在项目中都在使用,因为这块ORM框架让大家能专心业务SQL的编写,数据库的连接,连接池的使用都不用关心,极大的提高了生产效率。 今天要给大家介绍的另外一款ORM框架,是Mybatis Plus,这块工具正如其官网说的: 1)润物无声 只做

    2024年02月12日
    浏览(10)
  • Mybatis $与#的区别

    在mybatis中的$与#都是在sql中动态的传入参数。 eg: select id,name,age from student where name=#{name} 这个name是动态的,可变的。当你传入什么样的值,就会根据你传入的值执行sql语句。 #{} : 解析为一个 JDBC 预编译语句(prepared statement)的参数标记符,一个 #{} 被解析为一个参数占位符

    2024年02月06日
    浏览(10)
  • mybatis中的#{}和${}的区别

    mybatis中的#{}和${}的区别

    #{}:底层使用PreparedStatement。 特点:先进行SQL语句的编译,然后给SQL语句中的占位符?传值。 ${}:底层使用Statement. 特点:先进行SQL语句的拼接,然后在对SQL语句进行编译。 【注意】:优先使用#{},这是原则,避免SQL注入的风险。 【什么时候用${}】:传入Mapper的语句不需要带

    2024年01月25日
    浏览(6)
  • MyBatis与Hibernate的区别

    目录 1、MyBatis与Hibernate 1.1 Hibernate简介 1.2 MyBatis简介 2、开发对比 2.1 开发速度 2.2 开发社区 2.3 开发工作量 3、优化对比 3.1 Hibernate的调优方案 3.2 Mybatis调优方案 3.3 SQL优化方面 3.4 扩展性方面 4、对象管理与抓取策略 4.1 对象管理 4.2 抓取策略 5、缓存机制 5.1 Hibernate缓存 5.2 MyB

    2024年04月28日
    浏览(9)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包