MyBatis中的特殊符号[20160713]
今天中午回到工位已经是12:20多了,没有时间睡觉了,本想着还能提前开始,结果看了点新闻之后,又是12:40了,所以新闻坚决不能看,执行力。
今天主要记录一下MyBatis中的特殊符号的问题,这个问题已经在面试中被问到了两回了,但都没答好,事不过三,记录下来,下一次绝对不能再在这里出问题了。
一、mybatis特点
同hibernate一样,mybatis是一个持久层框架,通过这个框架可以减化我们持久层代码的开发。面试的时候我们会经常被问到这个框架同hibernate的比较,下面先罗列几点mybatis的特点:
1)简单易用,相比于hibernate的HQL, session,实体状态,一二级缓存等过于复杂的概念,mybatis显得小巧很多,弄清楚一两个配置文件,了解一下动态SQL的语法,基本上就算是会用mybatis了,正因为简单,所以有的时候会觉得这个框架没有什么可学的。
2)可以进行细致的SQL优化,因为SQL是由开发者自己来设计的,所以更利于进行优化,而在使用Hibernate时,SQL是由框架生成的。
3)支持动态SQL语句的编写,有的时候我们需要根据不同的条件来修改一个复杂SQL的一部分书写方式,用mybatis来做简直再合适不过。
4)对象管理, Hibernate有比较完整的对象管理机制,而在这一块上mybatis是欠缺的,甚至对象和表的映射关系也需要自己定义。
以上只是个人想到的一些对比,不是很全。
二、特殊符号的使用
由于mybatis中的sql是写在xml中的,由于xml语法的特殊性,对于一些特殊字符是需要特殊处理的,比如<,>,<=,>=,',"等,目前来说主要有两种处理方式
1)使用CDATA,具体的方式是把包含特殊字符的内容放在<![CDATA[ ]]>里,
比如: select * from userinfo where <![CDATA[ id > 100 ]]>
2)使用替代符号,这些特殊字符都有对应替代符号,常用的如下:
< <
> >
& &
' '
" "
比如上个例子也可以这样写: select * from userinfo where id > 100.
三、$和#的区别
在我们设计动态sql语句的时候,通常会涉及到参数传递的问题,mybatis允许在动态语句中引用参数名。引用方式即通过$或#,但这两者是有区别的,具体的区别在于:
1) 使用#会进行预编译,mybatis能把参数转化为对应的类型,而$则是将变量的值原样照搬,不会做任何处理
2)使用#可以防止SQL注入,而使用$是无法防止的。
这就有点想我们平时在程序中写SQL语句,使用占位符和直接拼接一样。再举一些例子说明一下:
比如如果是一个变量userId的值是100,则语句可以这样写:
select * from userinfo where id = #{userId}, 也可以写成select * from userinfo where id = ${userId},因为最终的语句都是select * from userinfo where id = 100.
但假设有变量是username值为macs524。则对于
select * from userinfo where username = #{username}来说,其结果是select * from userinfo where username = 'macs524'
而如果换成${username},则其结果为select * from userinfo where username = macs524,这个是有问题的。
通常在字段设置值的时候,我们要使用#而不是$,但$也不是没有任何用处,比如,假设我们的SQL表名是一个变量tbl_name,则查询语句应该写为
select * from ${tbl_name},而这个时候用#就不合适了。
总之,#和$的主要差别就在于一个会预编译,一个不会,了解了这点差别,其适用场合也就容易理解了。
四、总结
今天介绍了mybatis里的一些细节上需要注意的地方,相信下次遇到这类问题,不会再出错了。
MyBatis中的特殊符号[20160713]的更多相关文章
- mybatis中有趣的符号#与$
${ }是字符串替换,相当于直接显示数据,#{ }是预编译处理,相当于对数据加上双引号 即#是将传入的值当做字符串的形式,先替换为?号,然后调用PreparedStatement的set方法来赋值,而 ...
- MyBatis中特殊符号的转义
在MyBatis中遇到特殊符号时有两种转义方式: 第一种 描述 空格 小于 大于 小于等于 大于等于 与 单引号 双引号 原符号 < > <= >= & ' " ...
- Mybatis中的XML中需要用到的转义符号整理
使用这么久的Mybatis中需要转义的符号整理一下,小结一下: 1. < 小于符号 < 2. <= 小于等于 ...
- Mybatis中的in查询和foreach标签
Mybatis中的foreach的主要用在构建in条件中,它可以在SQL语句中进行迭代一个集合. foreach元素的属性主要有 item,index,collection,open,separato ...
- mybatis中foreach的用法(转)
foreach一共有三种类型,分别为List,[](array),Map三种. foreach属性 属性 描述 item 循环体中的具体对象.支持属性的点路径访问,如item.age,item.inf ...
- mybatis 中#{}与${}的区别 (面试题)
MyBatis/Ibatis中#和$的区别 1. #将传入的数据都当成一个字符串,会对自动传入的数据加一个双引号. 如:order by #user_id#,如果传入的值是111,那么解析成sql时的 ...
- Mybatis 中的转义字符
记录以下mybatis中的转义字符,方便以后自己看一下 Mybatis转义字符表 < < 小于 > > 大于 & & 与 ' ' 单引号 &q ...
- mybatis中常见的问题总结
如下所有举例基于springboot+mybatis项目中,SSH使用mybatis的写法也一样,只是形式不同而已 问题1.org.apache.ibatis.binding.BindingExcep ...
- mybatis中resultMap配置细则
resultMap算是mybatis映射器中最复杂的一个节点了,能够配置的属性较多,我们在mybatis映射器配置细则这篇博客中已经简单介绍过resultMap的配置了,当时我们介绍了resultMa ...
随机推荐
- 大型网站系统架构演化之路【mark】
前言 一 个成熟的大型网站(如淘宝.天猫.腾讯等)的系统架构并不是一开始设计时就具备完整的高性能.高可用.高伸缩等特性的,它是随着用户量的增加,业务功能的 扩展逐渐演变完善的,在这个过程中,开发模式. ...
- (笔记)Linux内核学习(七)之内核同步机制和实现方式
一 原子操作 指令以原子的方式执行——执行过程不被打断. 1 原子整数操作 原子操作函数接收的操作数类型——atomic_t //定义 atomic_t v;//初始化 atomic_t u = AT ...
- 【汇总】涉及iOS&iPhone开发相关文章汇总
此文章汇总本博客中有涉及iPhone开发的相关文章,不定时更新中... 1.NSUserDefaults快速存储数据: http://www.cnblogs.com/ios-wmm/archive/2 ...
- Promise 使用心得
this.testPromise=function(){ return new Promise(function(resolve,reject){ co ...
- Cubieboard2裸机开发之(五)看门狗操作
前言 说到看门狗,应该不会陌生,看门狗说白了就是一个定时器,但是它有一个非常重要的功能就是复位系统.在A20里,看门狗的操作非常简单,只有两个寄存器,不需要操作时钟相关的东西,系统起来后可以直接使用, ...
- Window中调试HBase问题小结
1.好久没用log4j了,转到logback好多年了,hbase程序运行时,报缺少log4j配置,那么,就转去logback吧(以下的XXX表示版本号). 原先lib包里面有log4j-XXX.jar ...
- 使用grunt构建seajs项目
1.安装nodejs 2.安装grunt-cli npm install -g grunt-cli 3.进入到项目目录,同时准备好package.json和Gruntfile.js文件 //packa ...
- tomcat的网站屏蔽IP的方法
<Host> <Valve className="org.apache.catalina.valves.RemoteAddrValve" deny=" ...
- 十四、EnterpriseFrameWork框架核心类库之简易ORM
在写本章前先去网上找了一下关于ORM的相关资料,以为本章做准备,发现很多东西今天才了解,所以在这里也对ORM做不了太深入的分析,但还是浅谈一下EFW框架中的设计的简易ORM:文中有一点讲得很有道理,D ...
- easyui textbox event 添加
$('#tt').textbox({ inputEvents:$.extend({},$.fn.textbox.defaults.inputEvents,{ keyup:function(e){ co ...