老司机学习MyBatis之#与$取值区别

一、前言

动态SQL是MyBatis的主要特性之一,在mapper中定义的参数传到XML中之后,在查询之前 mybatis 会对其进行动态解析。MyBatis 为我们提供了两种支持动态SQL的语法:#{} 以及 ${}。

二、案例

下面我们通过相关案例来演示一下$与#的用法。

UserMapper.xml文件中查询语句最初写法

<select id="findUserByMapParam"  parameterType="com.queen.mybatis.bean.User"  resultType="com.queen.mybatis.bean.User">
	select id, loginId, userName, role, note from t_user where id = #{id} and userName=#{userName}
</select>

测试控制台打印SQL如下:

2017-08-06 18:23:24,390 [main] [com.queen.mybatis.mapper.UserMapper.findUserByMapParam]-[DEBUG] ==>  Preparing: select id, loginId, userName, role, note from t_user where id = ? and userName=? 

现在我们修改一下语句,将where id = #{id} 修改成 ${id},如下:

<select id="findUserByMapParam"  parameterType="com.queen.mybatis.bean.User"  resultType="com.queen.mybatis.bean.User">
	select id, loginId, userName, role, note from t_user where id = ${id} and userName=#{userName}
</select>

再次测试,控制台打印SQL如下:

2017-08-06 18:27:58,887 [main] [com.queen.mybatis.mapper.UserMapper.findUserByMapParam]-[DEBUG] ==>  Preparing: select id, loginId, userName, role, note from t_user where id = 1 and userName=? 
可以观察到两条SQL语句的不同,下面一条以${}语句获取参数值时,直接将数据取出来拼接到了SQL语句中;而我们用#{}取得值是以占位符的形式出现。
#{}:是以预编译的方式,将参数设置到SQL语句中,跟我们原来学JDBC时一样,能够很大程度防止sql注入

${}:取出来的值直接拼接到SQL语句中,会有安全问题,无法防止Sql注入。

大多数情况下我们取参数的值都是使用的#{},但是有些情况像表名,排序时使用order by 动态参数时需要注意,用$而不是#。

修改UserMapper.xml:

<select id="findUserByMapParam"  parameterType="com.queen.mybatis.bean.User"  resultType="com.queen.mybatis.bean.User">
	select id, loginId, userName, role, note from t_user where id = #{id} and userName=#{userName} order by userName #{orderDesc}
</select>

测试控制台打印如下:

org.apache.ibatis.exceptions.PersistenceException: 
### Error querying database.  Cause: com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ''desc'' at line 1
### The error may exist in UserMapper.xml
### The error may involve com.queen.mybatis.mapper.UserMapper.findUserByMapParam-Inline
### The error occurred while setting parameters
### SQL: select id, loginId, userName, role, note from t_user where id = ? and userName=? order by userName ?
### Cause: com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ''desc'' at line 1
	at org.apache.ibatis.exceptions.ExceptionFactory.wrapException(ExceptionFactory.java:26)
以#{}号方式取值,控制台报错。

那我们修改一下UserMapper.xml,修改成${}取值方式

<select id="findUserByMapParam"  parameterType="com.queen.mybatis.bean.User"  resultType="com.queen.mybatis.bean.User">
	select id, loginId, userName, role, note from t_user where id = #{id} and userName=#{userName} order by userName ${orderDesc}
</select>

再次测试,控制台打印SQL正常:

2017-08-06 19:17:02,331 [main] [com.queen.mybatis.mapper.UserMapper.findUserByMapParam]-[DEBUG] ==>  Preparing: select id, loginId, userName, role, note from t_user where id = ? and userName=? order by userName desc 


=======欢迎大家拍砖,小手一抖,多多点赞哟!=======

版权声明:本文为博主原创文章,允许转载,但转载必须标明出处。


  • 1
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: Mybatis 是一个持久层框架,它可以将 Java 应用程序和数据库连接起来。它使用 XML 或注解来配置映射,并使用 SQL 动态语句来执行数据库操作。 Mybatis 可以通过简单的配置和映射文件来映射 Java 对象和数据库表之间的关系。 ### 回答2: Mybatis是一种Java持久化框架,它的主要目标是简化数据库访问的过程。与传统的JDBC相比,Mybatis提供了更简洁、灵活的方式来执行SQL语句并映射数据到Java对象中。 Mybatis的核心思想是将SQL语句与Java代码进行分离,通过使用XML或注解来描述SQL语句的编写和映射规则。这样可以使得SQL语句的编写更加方便,并且避免了在Java代码中编写大量的SQL语句。 在Mybatis中,首先需要配置一个SqlSessionFactory对象,它用于创建SqlSession实例。SqlSession对象可以被看作是对数据库操作的一个会话,它提供了许多操作数据库的方法,如插入、更新、删除和查询等。 另外,在Mybatis中还有一个重要的概念是Mapper接口。Mapper接口定义了一组与数据库操作相关的方法,它们对应了SQL语句的执行和数据的映射。Mapper接口的实现类由Mybatis框架自动生成,开发人员只需要编写接口定义即可使用。 Mybatis还提供了一些高级功能,如动态SQL和缓存机制。动态SQL允许在运行时根据条件来动态生成SQL语句,从而实现更灵活的查询。缓存机制可以在查询结果被缓存后,提高查询性能。 总的来说,Mybatis是一个简化数据库访问的框架,它通过将SQL语句与Java代码分离,提供了更方便、灵活的方式来执行数据库操作。它的配置简单,易于使用,并且提供了一些高级功能,使得开发人员可以更加方便地进行数据库操作。 ### 回答3: MyBatis 是一个开源的持久层框架,它是基于Java的ORM (Object Relational Mapping)框架。通过使用XML文件或注解方式,MyBatis 提供了一种将数据库的操作与 Java对象之间的映射关系进行配置的方法。在MyBatis中,我们可以使用SQL语句进行数据库的增删改查操作。 MyBatis的主要特点有: 1. 简化了数据库交互过程:MyBatis通过提供了丰富的映射配置方式,使得开发者可以通过很简单的方式进行数据库的交互操作,减少了冗余的数据库交互代码。 2. 灵活的SQL控制:MyBatis允许开发者将动态SQL映射到数据库中,通过使用if、choose、when等标签,开发者可以轻松地控制SQL的生成过程。 3. 易于集成:MyBatis可以与Spring等框架集成,方便开发者进行开发。与其他框架集成,可以享受到更多的功能扩展和便利性。 4. 性能优化:MyBatis通过缓存和连接池等机制,可以提升数据库访问的性能,减少了对数据库的频繁访问。 5. 支持多种数据库:MyBatis可以与各种主流数据库进行集成,包括MySQL、Oracle、SQLServer等,方便开发者进行数据库的操作。 总之,MyBatis是一个功能强大、易于使用的持久层框架,通过提供灵活的配置方式和强大的SQL控制能力,使得开发者可以方便地进行数据库的操作和优化,提升了开发效率和系统性能。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值