CDATA
总结自:http://blog.csdn.net/glory1234work2115/article/details/51695540
在 XML 元素中,”<” 和 “&” 是非法的。
“<” 会产生错误,因为解析器会把该字符解释为新元素的开始。
“&” 也会产生错误,因为解析器会把该字符解释为字符实体的开始。
一般要写成:
Item | Value | Qty | ||
---|---|---|---|---|
< | < | 小于 | ||
> | > | 大于 | ||
& | & | 和号 | ||
' | ‘ | 省略号 | ||
" | “ | 引号 | ||
注释:严格地讲,在 XML 中仅有字符 “<”和”&” 是非法的。省略号、引号和大于号是合法的,但是把它们替换为实体引用是个好的习惯。 | ||||
|
关于 CDATA 部分的注释:
CDATA 部分不能包含字符串 “]]>”。也不允许嵌套的 CDATA 部分。
标记 CDATA 部分结尾的 “]]>” 不能包含空格或折行。
foreach
来自:http://blog.csdn.net/jason5186/article/details/40896043
属性 | 描述 |
---|---|
item | 循环体中的具体对象。支持属性的点路径访问,如item.age,item.info.details。具体说明:在list和数组中是其中的对象,在map中是value。该参数为必选。 |
collection | 要做foreach的对象,作为入参时,List<?>对象默认用list代替作为键,数组对象有array代替作为键,Map对象用map代替作为键。当然在作为入参时可以使用@Param(“keyName”)来设置键,设置keyName后,list,array,map将会失效。 除了入参这种情况外,还有一种作为参数对象的某个字段的时候。举个例子:如果User有属性List ids。入参是User对象,那么这个collection = “ids”如果User有属性Ids ids;其中Ids是个对象,Ids有个属性List id;入参是User对象,那么collection = “ids.id”上面只是举例,具体collection等于什么,就看你想对那个元素做循环。该参数为必选。 |
separator | 元素之间的分隔符,例如在in()的时候,separator=”,”会自动在元素中间用“,“隔开,避免手动输入逗号导致sql错误,如in(1,2,)这样。该参数可选。 |
open | foreach代码的开始符号,一般是(和close=”)”合用。常用在in(),values()时。该参数可选。 |
close | foreach代码的关闭符号,一般是)和open=”(“合用。常用在in(),values()时。该参数可选。 |
index | 在list和数组中,index是元素的序号,在map中,index是元素的key,该参数可选。 |
简单例子:
1 | <insert id="tmpInsertCount" parameterType="list"> |
resultType or resultMap
mybatis推荐自定义类使用resultMap,而不用resultType,原因:
(1)resultMap适合返回值是自定义实体类的情况。需要在mapper中自定义resultMap,把数据库中的列和model对应起来。
(2)resultType适合使用返回值的数据类型是非自定义。如果想用自定义类型就必须命名规范,需要先设置mapUnderscoreToCamelCase为true,之后必须和数据库字段的下划线对应成驼峰。
(3)将来如果Model中的成员变量名字变了,resultMap只需要到Mapper中改对应resultMap;而resultType需要到数据库里改表字段的名字,如果其他项目用了这个数据库,还要改其他项目的东西。把问题的影响范围缩小的考虑,应该使用resultMap。
(4)而且查询时列名想用别名时就需要resultMap。
resultMap 需要自己定义,将数据库中的字段和model对应,简单例子:
1 | <resultMap id="hotelInfoResultMap" type="HotelInfoModel"> |
resultMap的属性id在写上去了时作为resultMap的值;属性type是model的值。
column是数据库字段名,property是model字段名。
typeHandlers
如果有自己的类型想默认转成数据库的类型,可以配置
例如,一种应用场景:公司存小数用的money,存到数据库时想默认转成float等,就可以配一个typeHandlers。
1 | <plugins> |
choose标签
使用场景:在if...else if ...else
的需求
1 | <where> |
但是在 test里不能用大于小于号,目前没有找到可以替代的用法。
#{}和${}区别
(1)
# 将传入的数据都当成一个字符串,会对自动传入的数据加一个双引号。
如:order by #{user_id}
,如果传入的值是111,那么解析成sql时的值为order by "111"
,
如果传入的值是id,则解析成的sql为order by "id"
.
$ 将传入的数据直接显示生成在sql中。
如:order by ${user_id}
,如果传入的值是111,那么解析成sql时的值为order by user_id
,
如果传入的值是id,则解析成的sql为order by id
(2)
/#方式能够很大程度防止sql注入。
$方式无法防止Sql注入.
(3)、$方式一般用于传入数据库对象,例如传入表名.
(4)、一般能用#的就别用$.
(5)、MyBatis排序时使用order by 动态参数时需要注意,用$而不是#