映射文件resultMap

来源:互联网 发布:js对象转为json字符串 编辑:程序博客网 时间:2024/06/05 19:19

基本格式

<resultMap id="map的标识" type="Java实体类"><id column="数据库列名" javaType="Java类型" jdbcType="数据库类型" property="Java实体类属性名" typeHandler="类型处理器"/><result column="数据库列名" javaType="Java类型" jdbcType="数据库类型" property="Java实体类属性名" typeHandler="类型处理器"/><association property="Java实体类属性名" column="数据库列名" select="selectid"/>或 <association property="Java实体类属性名" column="数据库列名" resultMap="resultMapId"/><collection property="Java实体类属性名" column="数据库列名" javaType="ArrayList" ofType="JavaBean" select="selectid"/>或<collection property="Java实体类属性名" column="数据库列名" javaType="ArrayList" ofType="JavaBean" resultMap="resultMapId"/><discriminator column="数据库列名(用于比较值的列)" javaType="Java类型" jdbcType="数据库类型"><case value="值1" resultType="Java实体类"><result column="数据库列名" javaType="Java类型" jdbcType="数据库类型" property="Java实体类属性名" typeHandler="类型处理器"/></discriminator></resultMap>


 id:主键映射

resulut:变通映射(其他基本数据库表字段到实体类属性的映射)。主键映射及普通映射的配置细节如下

属性

描述

property

需要映射到JavaBean 的属性名称。

column

数据表的列名或者标签别名。

javaType

一个完整的类名,或者是一个类型别名。如果你匹配的是一个JavaBean,那MyBatis 通常会自行检测到。然后,如果你是要映射到一个HashMap,那你需要指定javaType 要达到的目的。

jdbcType

数据表支持的类型列表。这个属性只在insert,update 或delete 的时候针对允许空的列有用。JDBC 需要这项,但MyBatis 不需要。如果你是直接针对JDBC 编码,且有允许空的列,而你要指定这项。

typeHandler

使用这个属性可以覆写类型处理器。这项值可以是一个完整的类名,也可以是一个类型别名。

association关联

association关联用于处理“有一个”类型的关系,也就是通常所说的"1对1的情况"比如一个用户有一个博客。

有三种关联方式

(一)关联的嵌套查询

通过执行另一个SQL映射语句来返回预期的复杂类型。<因为此方式会引起N+1问题即是执行多次SQL语句,所以不推荐使用此方式>

格式如下:

<association column="column1,column2,column3" javaType="另一个Java类名" property="属性名" select="otherSelectID"/><select id="otherSelectID" parameterType="int" resultType="另一个Java类名">select * from otherTable where column1=#{column1}</select>


例子:

Java实体类

package  com.myapp.domainimport java.io.Serializable;import com.myapp.domain.Authorpublic class Blog implements Serializable { private static final long serialVersionUID = -4268898209820709788L; private Integer id; private Author author; private String blogName; ......}public class Author implements Serializable {private static final long serialVersionUID = -4268898209820709788L;private Integer id;private String authorName;......}配置文件
<?xml version="1.0" encoding="UTF-8"?><!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd" ><mapper namespace="com.myapp.mapper.BlogMapper" ><resultMap id=”blogResult” type=”com.myapp.domain.Blog”> <association property="author" column="blog_author_id"  javaType="Author" select=”selectAuthor”/> </resultMap> <select id=”selectBlog” parameterType=”int” resultMap=”blogResult”> SELECT * FROM BLOG WHERE ID = #{id} </select> <select id=”selectAuthor” parameterType=”int” resultType="com.myapp.domain.Author"> SELECT * FROM AUTHOR WHERE ID = #{id} </select> </mapper>

 


(二)关联的嵌套结果

映射关联的嵌套结果到一个合适的对象图中

格式如下:

<association property="Java属性名" column="关联主键字段名"  javatype="所嵌套的结果Java类名"  resultMap="otherMapID"/>


例子如下:

<?xml version="1.0" encoding="UTF-8"?><!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd" ><mapper namespace="com.myapp.mapper.ClassesMapper"><select id="getClassesOne2One" resultMap="ClassesResultMap" parameterType="int">    select    <include refid="Base_Column_List"/>  <!--,b.t_id,b.t_name,b.t_c_id from Classes a left join Teacher b on a.c_id=b.t_c_id--> ,b.t_id ,b.t_name,b.t_c_id from Classes a,Teacher b where a.c_id=b.t_c_id </select><resultMap id="ClassesResultMap" type="com.myapp.domain.Classes" >    <id column="c_id" property="id" jdbcType="INTEGER" />    <result column="c_name" property="name" jdbcType="VARCHAR" />    <association property="teacher" column="t_id" javaType="com.myapp.domain.Teacher" resultMap="TeacherMap"/></resultMap><resultMap id="TeacherMap" type="com.myapp.domain.Teacher">  <id column="t_id" property="id"/>  <result column="t_name" property="name" typeHandler="com.myapp.test.MyTestTypeHandler"></result></resultMap>
/** *  */package com.myapp.domain;import java.io.Serializable;/** * @author louisliao * */public class Classes extends BaseObject implements Serializable { private static final long serialVersionUID = -4268898209820709788L; private Integer id; private String name; private Teacher teacher; public Integer getId() {  return id; } public void setId(Integer id) {  this.id = id; } public String getName() {  return name; } public void setName(String name) {  this.name = name; } public Teacher getTeacher() {  return teacher; } public void setTeacher(Teacher teacher) {  this.teacher = teacher; } }/** *  */package com.myapp.domain;import java.io.Serializable;/** * @author louisliao * */public class Teacher extends BaseObject implements Serializable { private static final long serialVersionUID = -4268898209820709788L; private Integer id; private String name; public Integer getId() {  return id; } public void setId(Integer id) {  this.id = id; } public String getName() {  return name; } public void setName(String name) {  this.name = name; } }


 

/*** */package com.myapp.domain;import java.io.Serializable;/*** @author louisliao**/public class Teacher extends BaseObject implements Serializable {private static final long serialVersionUID = -4268898209820709788L;private Integer id;private String name;public Integer getId() {return id;}public void setId(Integer id) {this.id = id;}public String getName() {return name;}public void setName(String name) {this.name = name;}}

 

测试类

 try {   String resource="testConfig.xml";   Reader reader=Resources.getResourceAsReader(resource);   sqlSessionFactory=new SqlSessionFactoryBuilder().build(reader);   SqlSession sqlSession=sqlSessionFactory.openSession();   ClassesMapper classesMapper=sqlSession.getMapper(ClassesMapper.class);   List<Classes> classes=classesMapper.getClassesOne2One(1);   System.out.println(classes.size());   reader.close();  } catch (Exception e) {   System.out.println(e.getMessage());   // TODO: handle exception  } finally  {   sqlSession.close();  }


 

原创粉丝点击