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 ...
随机推荐
- android中自定义view---实现竖直方向的文字功能,文字方向朝上,同时提供接口,判断当前touch的是哪个字符,并改变颜色
android自定义view,实现竖直方向的文字功能,文字方向朝上,同时提供接口,判断当前touch的是哪个字符,并改变颜色. 由于时间比较仓促,因此没有对代码进行过多的优化,功能远远不如androi ...
- Xcode 6 UITextField 键盘不弹出
iOS Simulator -> Hardware -> Keyboard Uncheck "Connect Hardware Keyboard"
- VS2013 解决方案文件结构分析
http://www.cnblogs.com/haogj/p/4248030.html Visual Studio 的解决方案文件是一个文本文件,其中的内容不是太复杂,有些时候 Visual Stud ...
- English Metric Units and Open XML
English Metric Units and Open XML 在Open XML里使用了English Metric Units(EMUs)来作为度量单位.比如 public class Ext ...
- html5开发之viewport使用
随着高端手机(Andriod,Iphone,Ipod,WinPhone等)的盛行,移动互联应用开发也越来越受到人们的重视,用html5开发移动应用是最好的选择.然而,每一款手机有不同的分辨率,不同屏幕 ...
- Windows Store 开发总结——文件操作
1.读取Isolated Storage 每个Metro程序都有三个文件夹:Local,Roaming,Temp.每个文件夹的访问方法都是相同的. Local用于将数据存储在本地,这是程序特定的文件夹 ...
- MxNet Windows下安装
项目链接:https://github.com/dmlc/mxnet 因为要做一些开发工作,prebuilt的lib不能满足需求.由于工作环境要求是windows,所以可以利用cmake工具来构建. ...
- 关于windows的service编程
最近需要学习下windows的service编程框架,查了下msdn发现不知所云.于是谷歌之,发现了一个非常不错的文章,重点推荐讲的非常详细,深入,看完之后基本上就能很清楚windows的servic ...
- 查询修改linux 打开文件句柄数量
查询系统支持最大可打开文件句柄数量: #vi /proc/sys/fs/file-max 查询当前连接用户最大可打开文件句柄数量: #ulimit -a 修改当前连接用户最大可打开文件句柄数量: #u ...
- mongodb备份恢复
注意:在备份文件存放目录的选择上有这样一个条件,文件存放目录不管有多深,都只能有它一个文件:(即除了备份文件之外只能存在文件夹,这个条件约束其整个目录树) 数据备份 : /mongodump --ho ...