第4章 映射文件
< 返回列表时间: 2020-06-19来源:OSCHINA
映射文件指导着MyBatis如何进行数据库的CRUD操作。 cache:命名空间的二级缓存配置。 cache-ref:其他命名空间缓存配置的引用。 resultMap:自定义结果集映射。 parameterMap:已废弃!老式风格的参数映射。 sql:抽取 可重用 语句块。 insert:映射插入语句。 update:映射更新语句。 delete:映射删除语句。 select:映射查询语句。
insert、update、delete元素

主键生成方式 若数据库支持 自动生成主键 的方式(如MySQL),则可以设置 useGeneratedKeys=”true” ,然后再把 keyProperty 设置到目标属性上。
对于不支持自增型主键的数据库(如Oracle),则可以使用 selectKey 子元素。 selectKey 元素会首先运行,id会被设置,然后插入语句会被调用。

selectKey

参数传递
单个参数 可接受基本类型、对象类型、集合类型的值。 这种情况下MyBatis可 直接使用 这个参数,不需要经过任何处理。
多个参数 任意多个参数,都会被MyBatis重新包装成一个 Map 传入。
Map 的key是param1,param2,0,1…,值就是参数的值。
命名参数 为参数使用 @Param 起一个名字。
MyBatis就会将这些参数封装进 Map 中。其中, key 是我们指定的名字。
POJO 当这些参数属于我们业务 POJO 时,我们直接传递 POJO 。
Map 封装多个参数为 Map ,直接传递。
参数处理
参数也可指定一个特殊的数据类型:
javaType通常可以从参数对象中来去确定。 如果 null 被当作值来传递,对于所有可能为空的列,jdbcType需要被设置。 对于数值类型,还可以设置小数点后保留的位数。 mode属性允许指定 IN 、 OUT 或 INOUT 参数。如果参数为 OUT 或 INOUT ,参数对象属性的真实值将会被改变,就像在获取输出参数时所期望的那样。 参数位置支持的属性: javaType、jdbcType、mode、numericScale、resultMap、typeHandler、jdbcTypeName、 expression 实际上通常被设置的是:可能为空的列名指定jdbcType 。 #{key}:获取参数的值, 预编译 到SQL中——安全。 ${key}:获取参数的值, 拼接 到SQL中—— 有SQL注入风险 。 例:order by ${name}
select元素
用来定义查询操作。 id :唯一标识符。 用来引用这条语句,需要 和接口的方法名一致 。 parameterType :参数类型。 可不传 ,MyBatis会根据 TypeHandler 自动推断 。 resultType :返回值类型。 指定别名或者全类名 。 若返回的是集合,则定义集合中元素的类型 。 不能和 resultMap 同时使用 。

自动映射 全局setting设置 autoMappingBehavior 默认是 PARTIAL ,表示 开启自动映射 的功能。 唯一的要求是 列名和POJO属性名一致 。 如果 autoMappingBehavior 设置为 null ,则会取消自动映射。 数据库字段命名规范,POJO属性要符合 驼峰命名法 。如: A_COLUMN → aColumn 。 开启自动驼峰命名规则映射功能 : mapUnderscoreToCamelCase=true 。 开启 延迟加载 和 属性按需加载 。
通过自定义resultMap,可实现高级结果集映射。
resultMap constructor:类在实例化时, 用来注入结果到构造方法中。 idArg:ID参数。标记结果作为ID可以帮助提高整体效能。 arg:注入到构造方法的一个普通结果。 id :一个ID结果。标记结果作为ID可以帮助提高整体效能。 result :注入到字段或JavaBean属性的普通结果。 association:一个复杂的类型关联。许多结果将包成这种类型。 嵌入结果映射:结果映射自身的关联或者参考一个。 collection:复杂类型的集合。 嵌入结果映射:结果映射自身的集或者参考一个。 discriminator:使用结果值来决定使用哪个结果映射。 case:基于某些值的结果映射。 嵌入结果映射:这种情形结果也映射它本身。因此,可以包含很多相同的元素或者它可以参照一个外部的结果映射。
id & result
id和result映射一个单独列的值到 简单数据类型 (字符串、整型、双精度浮点数、日期等)的属性或字段。

association(了解) 复杂对象映射。 POJO中的属性可能是一个对象。 可使用联合查询,并以 级联属性 的方式封装对象。
使用 association 标签定义对象的封装规则。
association-嵌套结果集(了解)

association-分步查询(了解)
select:调用目标的方法查询当前属性的值。 column:将指定列的值传入目标方法。
collection-集合类型&嵌套结果集(了解)


collection-分步查询(了解)

扩展:多列值封装Map传递(了解) 分步查询的时候通过column指定,将对应的列的数据传递过去,我们有时需要传递多列数据。 使用 {key1=column1,key2=column2…} 的形式。
association 或者 collection 标签的 fetchType=eager/lazy 可以覆盖全局的延迟加载策略,指定 立即加载(eager) 或 延迟加载(lazy) 。
热门排行