MyBatis之ResultMap的association和collection标签(⼀)
汇编语言指导书1.先说resultMap⽐较容易混淆的点,
2.
Map结尾是映射,Type是类型
resultType 和restltMap
restulyType:
1.对应的是java对象中的属性,⼤⼩写不敏感,
2.如果放的是java.lang.Map,key是查询语句的列名,value是查询的值,⼤⼩写敏感
resultMap:指的是定义好了的id的,是定义好的resyltType的引⽤
注意:⽤resultType的时候,要保证结果集的列名与java对象的属性相同,⽽resultMap则不⽤,⽽且resultMap可以⽤typeHander转换
3.
type:java 对象对应的类,
id:在本⽂件要唯⼀
column :数据库的列名或别名,
protery:对应java对象的属性
jdbcType:java.sql.Types
查询语句中,resultMap属性指向上⾯那个属性的标签的id
parameterType:参数类型,只能传⼀个参数,如果有多个参数要封装,如封装成⼀个类,要写包名加类名,基本数据类型则可以省略
4.⼀对1、⼀对多时,若有表的字段相同必须写别名,不然查询结果⽆法正常映射,出现某属性为空或者返回的结果与想象中的不同,⽽这往往是没有报错的。
5.若有意外中的错误,反复检查以上⼏点,和认真核查⾃⼰的sql语句,l⽂件是否配置正确。
⾼级结果映射
MyBatis的创建基于这样⼀个思想:数据库并不是您想怎样就怎样的。虽然我们希望所有的数据库遵守第三范式或BCNF(修正的第三范式),但它们不是。如果有⼀个数据库能够完美映射到所有应⽤程序,也将是⾮常棒的,但也没有。结果集映射就是MyBatis为解决这些问题⽽提供的解决⽅案。
resultMap
·constructor–实例化的时候通过构造器将结果集注⼊到类中
oidArg– ID 参数; 将结果集标记为ID,以⽅便全局调⽤
oarg–注⼊构造器的结果集
·id–结果集ID,将结果集标记为ID,以⽅便全局调⽤
·result–注⼊⼀个字段或者javabean属性的结果
·association–复杂类型联合;许多查询结果合成这个类型
o嵌套结果映射– associations能引⽤⾃⾝,或者从其它地⽅引⽤,
·collection–复杂类型集合
o嵌套结果映射– collections能引⽤⾃⾝,或者从其它地⽅引⽤
·discriminator–使⽤⼀个结果值以决定使⽤哪个resultMap
ocase–基于不同值的结果映射
§嵌套结果映射–case也能引⽤它⾃⾝, 所以也能包含这些同样的元素。它也可以从外部引⽤resultMap
注意:
public class A{
private B b1;
private List<B> b2;
}
在映射b1属性时⽤association标签, 映射b2时⽤collection标签,分别是⼀对⼀,⼀对多的关系
id, result元素
<id property="id" column="post_id"/>
<result property="subject" column="post_subject"/>
这是最基本的结果集映射。id 和result 将列映射到属性或简单的数据类型字段(String, int, double, Date等)。
这两者唯⼀不同的是,在⽐较对象实例时id 作为结果集的标识属性。这有助于提⾼总体性能,特别是应⽤缓存和嵌套结果映射的时候。
Id、result属性如下:
Attribute Description
property映射数据库列的字段或属性。如果JavaBean 的属性与给定的名称匹配,就
java有哪些基本数据类型会使⽤匹配的名字。否则,MyBatis 将搜索给定名称的字段。两种情况下您
都可以使⽤逗点的属性形式。⽐如,您可以映射到“username”,也可以映射
到“address.street.number”。
column数据库的列名或者列标签别名。与传递给String(columnName)
的参数名称相同。
javaType完整java类名或别名(参考上⾯的内置别名列表)。如果映射到⼀
个JavaBean,那MyBatis 通常会⾃⾏检测到。然⽽,如果映射到⼀
个HashMap,那您应该明确指定javaType 来确保所需⾏为。
jdbcType这张表下⾯⽀持的JDBC类型列表列出的JDBC类型。这个属性只
在insert,update或delete 的时候针对允许空的列有⽤。JDBC 需要这项,
但MyBatis 不需要。如果您直接编写JDBC代码,在允许为空值的情况下需要
指定这个类型。
typeHandler我们已经在⽂档中讨论过默认类型处理器。使⽤这个属性可以重写默认类型
处理器。它的值可以是⼀个TypeHandler实现的完整类名,也可以是⼀个类
型别名。
⽀持的JDBC类型
MyBatis⽀持如下的JDBC类型:
BIT FLOAT CHAR TIMESTAMP OTHER UNDEFINED
TINYINT REAL VARCHAR BINARY BLOB NVARCHAR
SMALLINT DOUBLE LONGVARCHAR VARBINARY CLOB NCHAR
INTEGER NUMERIC DATE LONGVARBINARY BOOLEAN NCLOB
BIGINT DECIMAL TIME NULL CURSOR
Constructor元素
<constructor>
<idArg column="id" javaType="int"/>
<arg column=”username” javaType=”String”/>
</constructor>
当属性与DTO,或者与您⾃⼰的域模型⼀起⼯作的时候,许多场合要⽤到不变类。通常,包含引⽤,或者查的数据很少或者数据不会改变的的表,适合映射到不变类中。构造器注⼊允许您在类实例化后给类设值,这不需要通过public⽅法。MyBatis同样也⽀持private属性和JavaBeans的私有属性达到这⼀点,但是⼀些⽤户可能更喜欢使⽤构造器注⼊。构造器元素可以做到这点。
考虑下⾯的构造器:
public class User {
/
/…
public User(int id, String username) {
//…
}
//…
}
为了将结果注⼊构造器,MyBatis需要使⽤它的参数类型来标记构造器。Java没有办法通过参数名称来反射获得。因此当创建constructor 元素,确保参数是按顺序的并且指定了正确的类型。
java下载太慢<constructor>
<idArg column="id" javaType="int"/>
<arg column=”username” javaType=”String”/>
</constructor>
其它的属性与规则与id、result元素的⼀样。
Attribute Description
column数据库的列名或者列标签别名。与传递给String(columnName)
的参数名称相同。
javaType完整java类名或别名(参考上⾯的内置别名列表)。如果映射到⼀cocos studio
个JavaBean,那MyBatis 通常会⾃⾏检测到。然⽽,如果映射到⼀
个HashMap,那您应该明确指定javaType 来确保所需⾏为。
jdbcType⽀持的JDBC类型列表中列出的JDBC类型。这个属性只
mysql语句的执行顺序在insert,update 或delete 的时候针对允许空的列有⽤。JDBC 需要这项,
但MyBatis 不需要。如果您直接编写JDBC代码,在允许为空值的情况下需要
指定这个类型。
typeHandler我们已经在⽂档中讨论过默认类型处理器。使⽤这个属性可以重写默认类型
typeHandler我们已经在⽂档中讨论过默认类型处理器。使⽤这个属性可以重写默认类型
处理器。它的值可以是⼀个TypeHandler实现的完整类名,也可以是⼀个类
型别名。
Association元素
<association property="author" column="blog_author_id" javaType=" Author">
<id property="id" column="author_id"/>
<result property="username" column="author_username"/>
</association>
Association元素处理“has-one”(⼀对⼀)这种类型关系。⽐如在我们的例⼦中,⼀个Blog有⼀个Author。联合映射与其它的结果集映射⼯作⽅式差不多,指定property、column、javaType(通常MyBatis会⾃动识别)、jdbcType(如果需要)、typeHandler。
不同的地⽅是您需要告诉MyBatis 如何加载⼀个联合查询。MyBatis使⽤两种⽅式来加载:
·Nested Select:通过执⾏另⼀个返回预期复杂类型的映射SQL语句(即引⽤外部定义好的SQL语句块)。
·Nested Results:通过嵌套结果映射(nested result mappings)来处理联接结果集(joined results)的重复⼦集。
⾸先,让我们检查⼀下元素属性。正如您看到的,它不同于普通只有select和resultMap属性的结果映射。
Attribute Description
property映射数据库列的字段或属性。如果JavaBean 的属性与给定的名称匹配,就
会使⽤匹配的名字。否则,MyBatis 将搜索给定名称的字段。两种情况下您
都可以使⽤逗点的属性形式。⽐如,您可以映射到”username”,也可以映射
到更复杂点的”address.street.number”。
column数据库的列名或者列标签别名。与传递给String(columnName)
的参数名称相同。
注意:在处理组合键时,您可以使⽤column= “{prop1=col1,prop2=col2}”这
样的语法,设置多个列名传⼊到嵌套查询语句。这就会把prop1和prop2设置events的翻译
到⽬标嵌套选择语句的参数对象中。
javaType完整java类名或别名(参考上⾯的内置别名列表)。如果映射到⼀
个JavaBean,那MyBatis 通常会⾃⾏检测到。然⽽,如果映射到⼀
个HashMap,那您应该明确指定javaType 来确保所需⾏为。
jdbcType⽀持的JDBC类型列表中列出的JDBC类型。这个属性只
在insert,update 或delete 的时候针对允许空的列有⽤。JDBC 需要这项,
但MyBatis 不需要。如果您直接编写JDBC代码,在允许为空值的情况下需要
指定这个类型。
typeHandler我们已经在⽂档中讨论过默认类型处理器。使⽤这个属性可以重写默认类型
处理器。它的值可以是⼀个TypeHandler实现的完整类名,也可以是⼀个类
型别名。
联合嵌套选择(Nested Select for Association)
select通过这个属性,通过ID引⽤另⼀个加载复杂类型的映射语句。从指定列属性
中返回的值,将作为参数设置给⽬标select 语句。表格下⽅将有⼀个例⼦。
注意:在处理组合键时,您可以使⽤column=”{prop1=col1,prop2=col2}”这样
的语法,设置多个列名传⼊到嵌套语句。这就会把prop1和prop2设置到⽬标
嵌套语句的参数对象中。
参考:也有⾃⼰的总结
下⾯是我的对应的association和collection对照截图
终极杀招l
<?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE configuration
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论