*** resultType 和 resultMap 的区别
MyBatis 中在查询进行 select 映射的时候,返回类型可以用resultType,也可以用 resultMap;
resultType 是直接表示返回类型的(PO 类),而resultMap 则是对外部 ResultMap 的引用(在 po.xml 中配置的映射 key-->value 关系),但是 resultType 跟 resultMap 不能同时存在。
在 MyBatis 进行查询映射时,其实查询出来的每一个属性都是放在一个对应的Map 里面的,其中键是属性名,值则是其对应的值。
当提供的返回类型属性是 resultType 时,MyBatis 会将 Map 里面的键值对取出赋给 resultType 所指定的对象对应的属性。所以其实 MyBatis 的每一个查询映射的返回类型都是 ResultMap,只是当提供的返回类型属性是 resultType 的时候,MyBatis 对自动的给把对应的值赋给 resultType 所指定对象的属性。当提供的返回类型是 resultMap 时,因为 Map 不能很好表示领域模型,就需要自己再进一步的把它转化为对应的对象。
由于 returnType 中返回的 PO 中的属性默认作为 key 值,所以必须保证 PO 中的属性和数据库表中的字段一致,要不就要配置映射关系。
***Mybatis 中“#”与“$”区别
#相当于对数据加上双引号,$相当于直接显示数据。
1、#将传入的参数值都当成一个字符串,会对自动传入的数据加一个双引号。如:order by #age#,传入的值是 27,那么解析成 sql 时的值为 order by "27", 如果传入的值是regdate,则解析成的 sql 为 order by "regdate",它写入的是你传进去的值。
2、$将传入的属性直接显示生成在 sql 中。如:order by $age$,如果传入的值是 27,那么解析成 sql 时的值为 order by age,如果传入的值是 name,则解析成的 sql 为 order by regdate,它显示的是你传入的属性片段,而不是属性值。这是一个很危险的做法,如果在验证中加一个" or 1=1" 那就可能恒成立了。
3、#是可以防止语句注入的,但$却不能防止语句注入,比较危险;如果可以用#号的地方就尽量不要用$。