今天中午回到工位已经是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)使用替代符号,这些特殊字符都有对应替代符号,常用的如下:

       &lt;          < 
        &gt;          >  
        &amp;      & 
        &apos;      '
        &quot;      "

    比如上个例子也可以这样写: select * from userinfo where id &gt; 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]的更多相关文章

  1. mybatis中有趣的符号#与$

    ${ }是字符串替换,相当于直接显示数据,#{ }是预编译处理,相当于对数据加上双引号 即#是将传入的值当做字符串的形式,先替换为?号,然后调用PreparedStatement的set方法来赋值,而 ...

  2. MyBatis中特殊符号的转义

    在MyBatis中遇到特殊符号时有两种转义方式: 第一种 描述 空格 小于 大于 小于等于 大于等于 与 单引号 双引号 原符号 < > <= >= & ' " ...

  3. Mybatis中的XML中需要用到的转义符号整理

    使用这么久的Mybatis中需要转义的符号整理一下,小结一下: 1.       <         小于符号        < 2.       <=       小于等于     ...

  4. Mybatis中的in查询和foreach标签

    Mybatis中的foreach的主要用在构建in条件中,它可以在SQL语句中进行迭代一个集合. foreach元素的属性主要有 item,index,collection,open,separato ...

  5. mybatis中foreach的用法(转)

    foreach一共有三种类型,分别为List,[](array),Map三种. foreach属性 属性 描述 item 循环体中的具体对象.支持属性的点路径访问,如item.age,item.inf ...

  6. mybatis 中#{}与${}的区别 (面试题)

    MyBatis/Ibatis中#和$的区别 1. #将传入的数据都当成一个字符串,会对自动传入的数据加一个双引号. 如:order by #user_id#,如果传入的值是111,那么解析成sql时的 ...

  7. Mybatis 中的转义字符

    记录以下mybatis中的转义字符,方便以后自己看一下 Mybatis转义字符表 < < 小于 > > 大于 & & 与 &apos; ' 单引号 &q ...

  8. mybatis中常见的问题总结

    如下所有举例基于springboot+mybatis项目中,SSH使用mybatis的写法也一样,只是形式不同而已 问题1.org.apache.ibatis.binding.BindingExcep ...

  9. mybatis中resultMap配置细则

    resultMap算是mybatis映射器中最复杂的一个节点了,能够配置的属性较多,我们在mybatis映射器配置细则这篇博客中已经简单介绍过resultMap的配置了,当时我们介绍了resultMa ...

随机推荐

  1. android中自定义view---实现竖直方向的文字功能,文字方向朝上,同时提供接口,判断当前touch的是哪个字符,并改变颜色

    android自定义view,实现竖直方向的文字功能,文字方向朝上,同时提供接口,判断当前touch的是哪个字符,并改变颜色. 由于时间比较仓促,因此没有对代码进行过多的优化,功能远远不如androi ...

  2. Xcode 6 UITextField 键盘不弹出

    iOS Simulator -> Hardware -> Keyboard Uncheck "Connect Hardware Keyboard"

  3. VS2013 解决方案文件结构分析

    http://www.cnblogs.com/haogj/p/4248030.html Visual Studio 的解决方案文件是一个文本文件,其中的内容不是太复杂,有些时候 Visual Stud ...

  4. English Metric Units and Open XML

    English Metric Units and Open XML 在Open XML里使用了English Metric Units(EMUs)来作为度量单位.比如 public class Ext ...

  5. html5开发之viewport使用

    随着高端手机(Andriod,Iphone,Ipod,WinPhone等)的盛行,移动互联应用开发也越来越受到人们的重视,用html5开发移动应用是最好的选择.然而,每一款手机有不同的分辨率,不同屏幕 ...

  6. Windows Store 开发总结——文件操作

    1.读取Isolated Storage 每个Metro程序都有三个文件夹:Local,Roaming,Temp.每个文件夹的访问方法都是相同的. Local用于将数据存储在本地,这是程序特定的文件夹 ...

  7. MxNet Windows下安装

    项目链接:https://github.com/dmlc/mxnet 因为要做一些开发工作,prebuilt的lib不能满足需求.由于工作环境要求是windows,所以可以利用cmake工具来构建. ...

  8. 关于windows的service编程

    最近需要学习下windows的service编程框架,查了下msdn发现不知所云.于是谷歌之,发现了一个非常不错的文章,重点推荐讲的非常详细,深入,看完之后基本上就能很清楚windows的servic ...

  9. 查询修改linux 打开文件句柄数量

    查询系统支持最大可打开文件句柄数量: #vi /proc/sys/fs/file-max 查询当前连接用户最大可打开文件句柄数量: #ulimit -a 修改当前连接用户最大可打开文件句柄数量: #u ...

  10. mongodb备份恢复

    注意:在备份文件存放目录的选择上有这样一个条件,文件存放目录不管有多深,都只能有它一个文件:(即除了备份文件之外只能存在文件夹,这个条件约束其整个目录树) 数据备份 : /mongodump --ho ...