1、第一容易混淆的 resultMap、resultType

resultMap

resultType

2、parameterMap、parameterType(推荐parameterType)

Map结尾对应映射
Type结尾对应class类型


3、#{}、${}

#{} 解析成SQL语句后会替换成 ?
${} 解析成SQL语句后会直接替换内容值

要向正确执行,还需要加上单引号

4、#{}、ognl表达式

#{}与ognl表达式
1、单一参数时#{}随便写啥。自定义类型时就不行了
2、单一参数时ognl必须使用_parameter来获取参数
#{}与ognl表达式
${} 的使用场景--------------order by场景
${} 的使用场景--------------order by场景
${} 的使用
#{}:会被mybatis解析成预编译的?然后通过prepareStament为这个?赋值为段子
${}:直接拼接在后面,然后赋值。它没有预编译效果
#{}与${}的--------区别1
parameterMap和parameterType
1、它们的作用和resultMap与resultType的区别是差不多的
2、表示传参的对应关系
resultMap与resultType的区别
1、都是用于sql结果集与java对象的关系
2、resultType适合直接映射的,字段与数据库的一致,不区分大小写
3、resultMap适合自己指定对应关系,typeHandel用于数据类型转换(比如用 0 1 表示男女就可以用resultMap方式)
#{} 与 ognl表达式区别
${}可用于列名要动态传入的情况,#{}会被替换成 '值',${}会被替换成 值,所以在用${}时要用引号包裹起来即'${}'
Mybatis #{} 与 ognl
建议统一写法:_parameter
Mybatis #{} 与 ${}
#{}: 预编译的。自动数据类型转换。防止sql注入,优先使用。
${}: 直接拼接的。需自行判断数据类型。使用场景:order by,传入数据库对象(如:列名,表明),模糊查询,分页等。
Mybatis总结——容易混淆的概念

【1】resultMap与resultType:
<select>标签有resultMap属性和resultType属性,都是为了表示结果集与java对象之间的一种映射关系,这样Mybatis就可以把结果集放在java对象中。
resultMap:的值为<resultMap>标签的id,它需要配置<resultMap>标签进行映射,它不受名称的影响(即实体类的属性名可以和结果集的名不相同)。<resultMap>的子标签提供了typeHandler可以用来类型转换(一般出现这样的问题可能是日期类型、布尔类型等,例如用数据库中的0和1表示java中的true和false,都可以通过配置resultMap来解决)
resultType:的值为java的类型,resultType按结果集的名字与实体类的名字相同来映射的,并且resultType的映射关系不区分大小写。它还可以是java.util.Map,这样结果集就会放在Map集合中,key就是结果集中的列名,value就是结果集的值了,使用该方式大小写是敏感的,sql语句返回的结果集是什么key就是什么。

【2】parameterMap与parameterType:
parameterType:指向一个java类型,它与OGNL表达式有联系(#{})
parameterMap:它和resultMap相似,也需要指向一个<parameterMap>标签配置的映射关系的id,只不过是resultMap表明结果集与java中属性间的映射关系,而parameterMap表明参数中的属性与数据库中的列对应的关系(Mybatis官方不推荐使用的属性)。
Mybatis曾经的名称为iBatis,原来在apache发布,后来在GoogleCode发布,原来的resultClass和parameterClass对应现在的resultType和parameterType。
【3】#{}与${}
这两种取值都是写在配置文件的sql语句中,${}取值写法和#{}是相同的。
#{}与${}的区别:#{command}会被Mybatis解析为预处理的?,然后再通过preparedStatement为该?赋值。而${command}会直接把command拼接在sql语句后,它是没有预编译效果的,类似于字符串拼接变量,但是当前是错误,两侧没有'',所以需要'${command}'。


${}使用场景:排序,当前端传入一个按照某列进行查询时,使用order by并不希望预处理给参数两边加上''。

【4】#{}与OGNL表达式
#{}与OGNL表达式取值写法是相同的,当parameterType的类型为String或者基本数据类型时,#{}里并不是一定要写成_parameter才能取到值,变量名可以写成任意名称,而OGNL中取值必须写成_parameter。

#{}会预编译,用占位符 ? 代替,${}直接用查询字符串替换,比如要查询“消息”则会直接替换为 消息,注意是没有 双引号 的。
String 或 基本数据类型取值写法不是非要写成 #{_parameter} 而是可以写成 #{任意,随便写什么} ,但是自定义的类型,就只能写成 #{自定义类型}
容易混淆的概念
1.resultMap和resultType的区别:
resultMap需要在xml中配置相应的映射
resultType对SQL语句大小写敏感。
2.parameterMap和parameterType的区别:
1.parameterMap已经废弃
3.#{}和${}的区别:
#{}会在预编译时变成一个?,而${}直接写入参数的值(如果想使用,需要用'${}')
${}多用在排序sql语句中(order by ${})

parameterType取值写法
容易混淆的概念
parmeterType取值写法总结:


前者有预编译效果,多用于where子句中
后者没有预编译效果,不会自动拼上‘’,可用于orderby后面根据列名排序时
看到Map结尾的应该想到映射关系,看到Type结尾的想到Java的类型,Map的使用由于映射关系会使用受限。
SSM学习---Mybatis之容易混淆的概念
1、resultMap和resultType
resultType中类的属性名要和数据库表中的列名一致,但是是大小写不敏感的;如果要把结果放在一个map中,key为表的列名,value为值,且是大小写敏感的
2、parameterMap和parameterType
parameterMap不推荐使用
3、#{}和${}
#{}有个预编译的过程,首先会被?代替,然后通过prepareStatement传入参数;${}会被直接替换为参数,使用场景例如order by 后的参数传入
4、#{}和ognl
mybatis容易混淆的概念:
1、resultMap和resultType
resultType中类的属性名要和数据库表中的列名一致,但是是大小写不敏感的;如果要把结果放在一个map中,key为表的列名,value为值,且是大小写敏感的
2、parameterMap和parameterType
parameterMap不推荐使用
3、#{}和${}
#{}有个预编译的过程,首先会被?代替,然后通过prepareStatement传入参数;${}会被直接替换为参数,使用场景例如order by 后的参数传入
4、#{}和ognl

一、resultMap和resultType:当配置resultType时,就不需要配置resultMap,看似resultType方便,但是会被受限制,没有resultMap开放多。
相同点:都是表示查询结果集的类型。
不同点:
resultMap需要手动配置映射关系,而resultType是直接指定java类型或者自定义的实体类型,查询结果集的列名必须和实体属性名称一致(实体类:名称大小写可以忽略;java类型,如Map集合的key大小写要一致,尽量都大小写规范,如果不放心可以select ID id,...)。
优缺点:
1、resultType结果集列名要与java属性名一样,但是resultMap不受限制,因为resultMap有column来规定。
2、由于SQL类型与Java中类型部分不匹配,resultMap可以通过typeHandler=""来匹配(如:SQL中的0和1来表示java中的false和true;Date类型的转换),但是resultType无能为力。
二、parameterMap和patameterType:
表示传入参数的对应关系,前者不推荐使用,只是mybatis为了适应以前的版本。
提示:看到Map字眼的想到映射关系,看到Type字眼的想到类型。
三、#{}和${}:
相同点:都是用来作为占位符。
不同点:#{}在预编译的时候会呗替换为?,而${}在预编译的时候直接将变量的值替换进去,而且没有引号(所以还要加上“'${...}'”),故一般都是用前者,个别情况会使用后者:如需进行排序,且排序字段为参数时可以使用${}(order by后面不喜欢被预编译,所以使用${}更为恰当)。
四、#{}和ognl:在#{}中如果是基本类型,其中的名称可以随便写(不推荐),但一般都用_parameter,因为值唯一,而ognl中必须写成_parameter的方式。
sql中:
#{}会被Mybaits解析成预编译的?然后再将值赋给?
${}会直接将值拼接在sql语句中相应的位置,没有预编译的效果,加上‘’才正确。
容易混淆概念(2)