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)使用替代符号,这些特殊字符都有对应替代符号,常用的如下:

       &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里的一些细节上需要注意的地方,相信下次遇到这类问题,不会再出错了。

  

原文地址:https://www.cnblogs.com/macs524/p/5666651.html