引用:http://thoughtfly.iteye.com/blog/1487738
模板
- <resultMap id="userResultMap" type="User">
- <id property="id" column="user_id" />
- <result property="username" column="user_name" />
- <result property="password" column="hashed_password" />
- </resultMap>
- <select id=”selectUsers” parameterType=”int” resultMap=”userResultMap”>
- select user_id, user_name, hashed_password
- from some_table
- where id = #{id}
- </select>
一般的结果集映射已经够用,但如果返回原结果对象很是复杂则可能返回的结果映射也就要多点设计了。
- <resultMap id="detailedBlogResultMap" type="Blog">
- <constructor>
- <idArg column="blog_id" javaType="int" />
- </constructor>
- <result property="title" column="blog_title" />
- <association property="author" column="blog_author_id"
- javaType="Author">
- <id property="id" column="author_id" />
- <result property="username" column="author_username" />
- <result property="password" column="author_password" />
- <result property="email" column="author_email" />
- <result property="bio" column="author_bio" />
- <result property="favouriteSection" column="author_favourite_section" />
- </association>
- <collection property="posts" ofType="Post">
- <id property="id" column="post_id" />
- <result property="subject" column="post_subject" />
- <association property="author" column="post_author_id"
- javaType="Author" />
- <collection property="comments" column="post_id" ofType=" Comment">
- <id property="id" column="comment_id" />
- </collection>
- <collection property="tags" column="post_id" ofType=" Tag">
- <id property="id" column="tag_id" />
- </collection>
- <discriminator javaType="int" column="draft">
- <case value="1" resultType="DraftPost" />
- </discriminator>
- </collection>
- </resultMap>
resultMap
constructor – 类在实例化时,用来注入结果到构造方法中
idArg ID 参数;标记结果作为 ID 可以帮助提高整体效能
arg 注入到构造方法的一个普通结果
id 一个ID 结果;标记结果作为ID 可以帮助提高整体效能
result 注入到字段或JavaBean 属性的普通结果
association 一个复杂的类型关联;许多结果将包成这种类型.嵌入结果映射
collection 复杂类型的集 . 嵌入结果映射
discriminator – 使用结果值来决定使用哪个结果映射
case – 基于某些值的结果映射. 嵌入结果映射
最佳实践:通常逐步建立结果映射。单元测试的真正帮助在这里。如果你尝试创建一次创建一个向上面示例那样的巨大的结果映射,那么可能会有错误而且很难去控制它来工作。开始简单一些,一步一步的发展。而且要进行单元测试!使用该框架
的缺点是它们有时是黑盒(是否可见源代码)。你确定你实现想要的行为的最好选择是编写单元测试。它也可以你帮助得到提交时的错误。
- <id property="id" column="post_id"/>
- <result property="subject" column="post_subject"/>
这些是结果映射最基本内容。id 和 result 都映射一个单独列的值到简单数据类型(字符串,整型,双精度浮点数,日期等)的单独属性或字段。
这两者之间的唯一不同是 id 表示的结果将是当比较对象实例时用到的标识属性。这帮助来改进整体表现,特别是缓存和嵌入结果映射
property 映射到列结果的字段或属性。如果匹配的是存在的,和给定名称相同的 JavaBeans 的属性,那么就会使用。否则 MyBatis 将会寻找给定名称的字段。这两种情形你可以使用通常点式的复杂属性导航。比如,你可以这样映射一些东西:“username”,或者映射到一些复杂的东西:“address.street.number”。
column 从数据库中得到的列名,或者是列名的重命名标签。
javaType 一个 Java 类的完全限定名,或一个类型别名。如果你映射到的是 HashMap,那么你应该明确地指定 javaType来保证所需的行为。
jdbcType 在这个表格之后的所支持的 JDBC 类型列表中的类型。 JDBC 类型是仅仅需要对插入,更新和删除操作可能为空的列进行处理。这是 JDBC的需要,而不是 MyBatis 的。如果你直接使用 JDBC 编程,你需要指定这个类型-但仅仅对可能为空的值。
typeHandler 使用这个属性,你可以覆盖默认的类型处理器。这个属性值是类的完全限定名或者是一个类型处理器的实现,或者是类型别名。
- <constructor>
- <idArg column="id" javaType="int"/>
- <arg column=”username” javaType=”String”/>
- </constructor>
映射类的构造方法,也有四个属性column 、javaType 、jdbcType 、typeHandler
- <association property="author" column="blog_author_id" javaType=" Author">
- <id property="id" column="author_id"/>
- <result property="username" column="author_username"/>
- </association>
关联映射
其属性有property 、column、javaType、jdbcType、typeHandler、select
其中select是关联的嵌套查询另外一个映射语句的 ID,可以加载这个属性映射需要的复杂类型。获取的在列属性中指定的列的值将被传递给目标 select 语句作为参数。
注意:要处理复合主键,你可以指定多个列名通过 column=”{prop1=col1,prop2=col2}”这种语法来传递给嵌套查询语句。这会引起prop1 和 prop2 以参数对象形式来设置给目标嵌套查询语句。
- <resultMap id=”blogResult” type=”Blog”>
- <association property="author" column="blog_author_id"
- javaType="Author" select=”selectAuthor” />
- </resultMap>
- <select id=”selectAuthor” parameterType=”int” resultType="Author">
- SELECT * FROM AUTHOR WHERE ID = #{id}
- </select>