【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 是什么,如何使用

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

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

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

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

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

    2024年02月15日
    浏览(47)
  • 使用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日
    浏览(40)
  • Mybatis的动态SQL及关键属性和标识的区别(对SQL更灵活的使用)

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

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

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

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

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

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

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

    2024年01月25日
    浏览(27)
  • Mybatis $与#的区别

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

    2024年02月06日
    浏览(50)
  • MyBatis和Hibernate的区别

    Hibernate 和 MyBatis 都是目前业界中主流的对象关系映射(ORM)框架,它们的主要区别如下。 1)sql 优化方面 Hibernate 使用 HQL(Hibernate Query Language)语句,独立于数据库。不需要编写大量的 SQL,就可以完全映射,但会多消耗性能,且开发人员不能自主的进行 SQL 性能优化。提供了

    2024年02月09日
    浏览(35)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包