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 ...
- 数据人员Sql必会——行转列
今天被问到列转行的问题,竟然没有回答上来,回想自己也是数据开发人员,平时的积累真是不到位,下面总结一下列转行. 假设咱们有一个学生得分数据表:student_score CREATE TABLE st ...
- jqgrid单元格中增加按钮
1.增加列配置 { label: '问题数据', name: 'action', width: 80, align: 'center' } 2.函数 gridComplete: function () ...
- java之源码路径及api
jav源码地址:D:\Program Files\jdk1.7\src.zip class类地址:D:\Program Files\jdk1.7\jre\lib\rt.jar 在线api底地址:htt ...
- 实现让Lync client也能够"潜水"隐身聊天
看到MSN或QQ,都支持隐身聊天. Lync Server 2013也是支持的. 1.Server端:Lync 2013 Server 缺省策略是没有设置显示脱机功能.(设置前截图) 2.直 ...
- mingW与cygwin
转自:http://hi.baidu.com/ooxxer/item/d25dccc072846a50ac00ef7e# 首先MingW和cygwin都可以用来跨平台开发. MinGW是Minima ...
- iis错误记录
1:iis错误 解决方法: 输入C:\Windows\Microsoft.NET\Framework\v4.0.30319>aspnet_regiis -i 这里由于我的是默认在Administ ...
- MeshCombineUtility.cs method `GetTriangleStrip' of type `UnityEngine.Mesh' could be found
1) Assets/Standard Assets/Scripts/MeshCombineUtility.cs(27,74): error CS1061: Type `UnityEngine.Mesh ...
- 轻应用、Web app 、Native app三者区别关系是什么?
[龙友导读]最近百度公司在大会上宣布推出“轻应用”.轻应用到底是什么呢,和我们说的web app.native app到底有什么区别?是新生物的诞生还是概念的炒作?所以,今天特意为大家整理分享一篇这方 ...
- poj 1474 Video Surveillance - 求多边形有没有核
/* poj 1474 Video Surveillance - 求多边形有没有核 */ #include <stdio.h> #include<math.h> const d ...