mybatis中#和$的区别:
1)##是将传入的数据直接解析成字符串,如: insert into ( aa) values(#id#),传入的id为100,则解析成insert into ( aa) values(”111“),可以起到防止sql注入。
$是将传入的数据直接填充到sql语句中,如: insert into ( aa) values($id$),传入的id为100,则解析成insert into ( aa) values(111),
2)<seletctkey>
SelectKey在Mybatis中是为了解决Insert数据时不支持主键自动生成的问题,他可以很随意的设置生成主键的方式。在使用mybatis插入数据进数据库的时候,会用到一些sequence的数据,有些情况下,在插入完成之后还需要将sequence的值返回,然后才能进行下一步的操作。 使用mybatis的selectKey就可以得到sequence的值,同时也会将值返回。
如;对于mysql
<insert id="insertUser" parameterClass="ibatis.User">
insert into user
(name,password)
values
(#name#,#password#)
<selectKey resultClass="long" keyProperty="id">
SELECT LAST_INSERT_ID() AS ID
</selectKey>
</insert>
将selectKey放在insert之后,通过LAST_INSERT_ID() 获得刚插入的自动增长的id的值。
3)
sql的重用:定义一个sql片段,可在任何SQL语句中重用该片段。
<
sql
id
=
"sql_body"
>
from
table_example
<
where
>
<
if
test
=
"name
!= null"
>
name = #{name} </
if
>
</
where
>
</
sql
>
<
select
id
=
"getResult"
parameterType
=
"map"
resultMap
=
"map"
>
select
name
<
include
refid
=
"sql_body"
/>
</
select
>
<
select
id
=
"getTotalCount"
parameterType
=
"map"
resultMap
=
"map"
>
select
count(0) as totalCount
<
include
refid
=
"sql_body"
/>
</
select
>
select * from ACCOUNT
<dynamic prepend="where">
<isNotNull property="id" prepend="and" open="(" close=")">
id = #id#
</isNotNull>
<isNotEmpty property="name" prepend="and">
name like '%$name$%'
</isNotEmpty>
</dynamic>
</select>
当id和name不为空是生成的SQL语句是:
select * from ACCOUNT where (id=id的值) and name like '%name的值%'
<isNotNull>和<isNotEmpty>子句没有时不会添加前缀where
5)<![cdata]>:所有的标记、实体引用都被忽略,而被XML处理程序一视同仁地当做字符数据看待.否则假如您在 XML 文档中放置了一个类似 "<" 字符,那么这个文档会产生一个错误,这是因为解析器会把它解释为新元素的开始。因此你不能这样写:
<message>if salary < 1000 then</message>
为了避免此类错误,需要把字符 "<" 替换为实体引用,就像这样:
<message>if salary < 1000 then</message>