一同养成写作习气!这是我参加「日新计划 4 月更文挑战」的第14天,点击检查活动概况。

一、参数的获取方法

在xml文件中编写sql句子的时分有两种取值的方法,分别是#{}和${}。

1-1、#{} 传值

运用#{}传值相当于jdbc中的

String sql=" SELECT id,user_name FROM EMP WHERE id=?"

这样就会经过JDBC当中PreparedStatement的预编译,会根据不同的数据类型来编译成对应数据库所对应的数据。然后能够有效的避免SQL注入。 推荐运用!!

1-1-1、#{}的特别用法

自带很多内置参数的特点:一般不会运用。了解 javaType、jdbcType、mode、numericScale、resultMap、typeHandler.
比方 需求改变默认的NULL===>OTHER:#{id,javaType=NULL}
想保存小数点后两位:#{id,numericScale=2}

1-2、 ${}传值

运用#{}传值相当于jdbc中的

String sql=" SELECT id,user_name FROM EMP WHERE id="+id

这样就不会进行预编译,会直接将输入进来的数据拼接在SQL中。存在SQL注入的危险。不推荐运用。

1-2-1、${}的特别用法

1.调试情况下能够暂时运用。
2.实现一些特别功用:条件一定要保证数据的安全性。
比方:动态表、动态列. 动态SQL.

比方咱们把EmpMapper.xml中的#{}改为${}检查履行sql如下:
修正前:

MyBatis基于XML的详细使用-参数、返回结果 处理

修正后:

MyBatis基于XML的详细使用-参数、返回结果 处理

这样在运用复杂句子的时分,咱们调试就比较方便了,不用自己挨个去匹配参数值。

二、select的参数传递

2-1、单个参数传递

如:SelectEmp(Integer id);mybatis 不会做任何特别要求
获取方法: #:{输入任何字符获取参数}

MyBatis基于XML的详细使用-参数、返回结果 处理
如上:尽管咱们传递的是ID,可是接纳参数的时分能够随意写,不做特别约束。

2-2、多个参数传递

2-2-1、运用arg或许param获取参数

Emp SelectEmp(Integer id,String name);
mybatis 会进行封装,会将传进来的参数封装成map:
1个值就会对应2个map项 :
id===> {key:arg0 ,value:id的值},{key:param1 ,value:id的值}
name===> {key:arg1 ,value:id的值},{key:param2 ,value:id的值}

如下运用arg获取参数

MyBatis基于XML的详细使用-参数、返回结果 处理

运用param获取参数

MyBatis基于XML的详细使用-参数、返回结果 处理

获取方法
id=====> #{arg0} 或许 #{param1}
name=====> #{arg1} 或许 #{param2}\

总结:运用arg从0开端,param从1开端

2-2-2、运用@Param注解设置参数

除了运用这种方法还有别的方法,由于这种方法参数名没有意义:
设置参数的别号:@Param(“”):
SelectEmp(@Param(“id”) Integer id,@Param(“name”) String name);\

当运用了@Param:
id=====> #{id} 或许 #{param1}
name=====> #{name} 或许 #{param2}

经过运用别号的方法获取参数

MyBatis基于XML的详细使用-参数、返回结果 处理

假如运用@Param的方法也能够运用param来获取参数

MyBatis基于XML的详细使用-参数、返回结果 处理

在实际项目中主张运用经过@Param来设置参数别号,这样在获参数的时分就比较明晰了,方便后期的维护。

需求留意的是,假如经过@Param设置别号,就不能运用arg来获取参数了。

2-3、javaBean的参数

2-3-1、运用一个javaBean传参

单个参数:Emp SelectEmp(Emp emp);
获取方法:能够直接运用特点名
emp.id=====>#{id}
emp.name=====>#{name}\

MyBatis基于XML的详细使用-参数、返回结果 处理
如上图经过传递一个javaBean,在运用的时分只能输入特点名来获取参数值。

2-3-2、多个参数

多个参数:Emp SelectEmp(Integer num,Emp emp);\

取得非javaBean就能够经过如下方法获取 num===> #{param1} 或许 @Param\

取得javaBean目标的参数能够经过如下方法获取 emp===> 必须加上目标别号:
emp.id===> #{param2.id} 或许 @Param(“emp”)Emp emp ====>#{emp.id}
emp.name===> #{param2.name} 或许 @Param(“emp”)Emp emp ====>#{emp.name}

如下在未设置@Param的情况下,只能经过param来获取参数,javaBean目标的在param后边跟上特点称号即可

MyBatis基于XML的详细使用-参数、返回结果 处理

在设置了@Param的情况下,就能够愈加设置的别号来获取了

MyBatis基于XML的详细使用-参数、返回结果 处理

即便在设置了@Param的情况下,依然能够经过param来获取参数值,入下:

MyBatis基于XML的详细使用-参数、返回结果 处理

2-4、调集或许数组参数

2-4-1、调集传递参数

Emp SelectEmp(List< String> name);

假如是list,MyBatis会主动封装为map:
{key:”list”:value:name}
没用@Param(“”)要取得

name.get(0) =====> #{list[0]}

MyBatis基于XML的详细使用-参数、返回结果 处理

name.get(0) =====> #{agr0[0]}

MyBatis基于XML的详细使用-参数、返回结果 处理

有@Param(“names”)要取得

names.get(0) =====> #{names[0]}

MyBatis基于XML的详细使用-参数、返回结果 处理

names.get(0) =====> #{param1[0]}

MyBatis基于XML的详细使用-参数、返回结果 处理

2-4-2、数组传递参数

假如是数组,MyBatis会主动封装为map:
{key:”array”:value:name}

没用@Param(“”)要取得
name.get(0) =====> #{array[0]}
name.get(0) =====> #{agr0[0]}

有@Param(“name”)要取得:
name.get(0) =====> #{name[0]}
name.get(0) =====> #{param1[0]}

2-5、map方法传参

和javaBean的参数传递是相同,一般情况下:
恳求进来的参数 和pojo对应,就用pojo
恳求进来的参数 没有和pojo对应,就用map
恳求进来的参数 没有和pojo对应上,可是运用频率很高,就用TO、DTO(就是单独为这些参数创立一个对应的javaBean出来,使参数传递更标准、更重用)

三、处理调集回来成果

回来成果类型:
假如回来一行数据,就能够运用pojo接纳,或许map 假如回来多行数据,就能够运用List< pojo>或许List< map>然后resultType指定List中的泛型就能够了

如下,尽管回来数据类型为List< Emp> 可是在EmpMapper.xml中的resultType指定为Emp即可

MyBatis基于XML的详细使用-参数、返回结果 处理

假如是基础数据类型或许包装数据类型直接指定别号就行了

MyBatis基于XML的详细使用-参数、返回结果 处理

四、自定义成果集

能够运用ResultMap自定义成果集,需求将数据库字段和pojo的字段特点进行一一对应,这样就能够方便咱们把数据库字段的蛇形命名指向到pojo中特点的驼峰命名上,比方:create_time–>createTime.

4-1、为何运用自定义成果集

MyBatis基于XML的详细使用-参数、返回结果 处理
如上图,数据库字段为create_time,pojo中的字段为createTime,这样再经过sql查询的时分就无法将查出的时间对应到pojo的特点上了,当然也能够经过sql 的as 设置别号来处理如下:

MyBatis基于XML的详细使用-参数、返回结果 处理

这样一般为比较小的体系运用,可是假如这个Mapper.xml中的sql量比较多,而且用create_time的sql也很多,就得每条都进行设置了,这样不仅增加了一些工作流,在今后的维护中也带来了比较多的影响。

因而咱们就能够运用resultMap来进行映射处理了

MyBatis基于XML的详细使用-参数、返回结果 处理

4-2、自定义成果集的留意事项

声明resultMap自定义成果集 resultType 和 resultMap 只能运用一个。
id 仅有标识, 需求和<select 上的resultMap 进行对应
type 需求映射的pojo目标, 能够设置别号
autoMapping 主动映射,(默认=true) 只需字段名和特点名遵循映射规矩就能够主动映射,可是不主张,哪怕特点名和字段名一一对应上了也要显现的装备映射 如下在设置false,而且将对映射联系注释的情况下,就无法进行主动映射了

MyBatis基于XML的详细使用-参数、返回结果 处理
在设置为true的情况下,即便注释的字段名和特点名一直的映射联系,也能够进行自定映射

MyBatis基于XML的详细使用-参数、返回结果 处理

extends 假如多个resultMap有重复映射,能够声明父resultMap,将公共的映射提取出来, 能够减少子resultMap的映射冗余

MyBatis基于XML的详细使用-参数、返回结果 处理
如上图能够看到,把回来的id映射注释掉,而且设置不主动映射,可是运用了extends,承继了common_map这样就相当于具有了其下面的映射。

另外假如数据库字段和pojo特点能够对应上,那么Mapper.xml中的映射是能够省略的,可是不主张,这样关于后边代码的可读性会有一些影响。

需求留意的是,尽管上面咱们关于主键id相同运用了 能够完成映射,可是实际上应该运用id的方法来设置主键(对底层存储有功能作用)

<id column="id" property="id"/>

五、select查询相关特点

特点 描述
id 在命名空间中仅有的标识符,能够被用来引证这条句子。
parameterType 将会传入这条句子的参数的类全限定名或别号。这个特点是可选的,由于 MyBatis 能够经过类型处理器(TypeHandler)推断出详细传入句子的参数,默认值为未设置(unset)。
parameterMap 用于引证外部 parameterMap 的特点,现在已被废弃。请运用行内参数映射和 parameterType 特点。
resultType 期望从这条句子中回来成果的类全限定名或别号。 留意,假如回来的是调集,那应该设置为调集包含的类型,而不是调集本身的类型。 resultType 和 resultMap 之间只能一起运用一个。
resultMap 对外部 resultMap 的命名引证。成果映射是 MyBatis 最强大的特性,假如你对其了解透彻,许多复杂的映射问题都能迎刃而解。 resultType 和 resultMap 之间只能一起运用一个。
flushCache 将其设置为 true 后,只需句子被调用,都会导致本地缓存和二级缓存被清空,默认值:false。
useCache 将其设置为 true 后,将会导致本条句子的成果被二级缓存缓存起来,默认值:对 select 元素为 true。
timeout 这个设置是在抛出反常之前,驱动程序等候数据库回来恳求成果的秒数。默认值为未设置(unset)(依靠数据库驱动)。
fetchSize 这是一个给驱动的主张值,测验让驱动程序每次批量回来的成果行数等于这个设置值。 默认值为未设置(unset)(依靠驱动)。
statementType 可选 STATEMENT,PREPARED 或 CALLABLE。这会让 MyBatis 分别运用 Statement,PreparedStatement 或 CallableStatement,默认值:PREPARED。
resultSetType FORWARD_ONLY,SCROLL_SENSITIVE, SCROLL_INSENSITIVE 或 DEFAULT(等价于 unset) 中的一个,默认值为 unset (依靠数据库驱动)。
databaseId 假如装备了数据库厂商标识(databaseIdProvider),MyBatis 会加载一切不带 databaseId 或匹配当时 databaseId 的句子;假如带和不带的句子都有,则不带的会被疏忽。
resultOrdered 这个设置仅针对嵌套成果 select 句子:假如为 true,将会假设包含了嵌套成果集或是分组,当回来一个主成果行时,就不会产生对前面成果集的引证。 这就使得在获取嵌套成果集的时分不至于内存不够用。默认值:false
resultSets 这个设置仅适用于多成果集的情况。它将列出句子履行后回来的成果集并赋予每个成果集一个称号,多个称号之间以逗号分隔。

以上部分,常常运用的有:id、parameterType、resultType、resultMap、flushCache、useCache、statementType(运用存储进程运用,运用频率也不高)