MyBatis的ResultMaps

ResultMaps经常用于映射SQL的查询语句,将查询的结果与JavaBean的参数相对应。

我们可以定义ResultMaps和从多个查询的语句中引用它的resultMap查询。MyBatis的ResultMapps是有非常强大的特性,你可以用它查询一对一、一对多的表关系。可能,读者对这样的表述不是很明白,学习了接下的知积之后你就可以明白了。

1. 简单的ResultMaps

下面的例子是一个简单的resultMap查询,它的查询结果映射到Student的JavaBean。

<resultMap id="StudentResult" type="com.owen.mybati3.domain.Student">
<id property="studId" column="stud_id"/>
<result property="name" column="name"/>
<result property="email" column="email"/>
<result property="phone" column="phone"/>
</resultMap>
<select id="findAllStudents" resultMap="StudentResult" >
SELECT * FROM STUDENTS
</select>
<select id="findStudentById" parameterType="int"
resultMap="StudentResult">
SELECT * FROM STUDENTS WHERE STUD_ID=#{studId}
</select>

我们看到上面的例子,在resultMap的属性中,它的id值是StudentResult,这个值在namespace中是唯一的。而且resultMap的type值是包含返回结果的全名类或是别名。而<result>的子元素经常是用在映射到JavaBean中resultset的列值。<id>子元素跟<result>的子元素是差不多的,不过它是映射唯一性,是用来对象之间的比较。

在<select>语句中,我们使用resultMap来取代resultType,这是因为涉及到了StudentResult的映射。当<select>的语句配置了resultMap的属性,MyBatis将会运用列的属性去填充JavaBean的参数。

让我们来看一个其它的例子,如何使用<select>的语句来填充HashMap的属性。

<select id="findStudentById" parameterType="int" resultType="map">
SELECT * FROM STUDENTS WHERE STUD_ID=#{studId}
</select>

在上面的例子中,我们配置resultType的值为map,这个就是java.util.HashMap的别名。在这个例子中,列名将会作为key,而列的值将会作为value.

HashMap<String,Object> studentMap = sqlSession.selectOne("com.
mybatis3.mappers.StudentMapper.findStudentById", studId);
System.out.println("stud_id :"+studentMap.get("stud_id"));
System.out.println("name :"+studentMap.get("name"));
System.out.println("email :"+studentMap.get("email"));
System.out.println("phone :"+studentMap.get("phone"));
让我们再来看一下其它例子也使用resultType=”map”的多个返回结果。
<select id="findAllStudents" resultType="map">
SELECT STUD_ID, NAME, EMAIL, PHONE FROM STUDENTS
</select>
作为resultType=”map”的语句,且返回的结果是多行的,所以我们在代码 中需要使用List<HashMap<String,Object>>.
 List<HashMap<String,Object>> studentMapList =
sqlSession.selectList("com.owen.mybatis.mappers.StudentMapper.findAllS
tudents");
for(HashMap<String,Object> studentMap : studentMapList)
{
System.out.println("studId :"+studentMap.get("stud_id"));
System.out.println("name :"+studentMap.get("name"));
System.out.println("email :"+studentMap.get("email"));
System.out.println("phone :"+studentMap.get("phone"));
}

2. 扩展ResultMaps

我们可以通过其它的<resultMap>语句来扩展一个<resultMap>语句。因此通过其它的来继承,那么也要继承他的列映射。

<resultMap type="Student" id="StudentResult">
<id property="studId" column="stud_id"/>
<result property="name" column="name"/>
<result property="email" column="email"/>
<result property="phone" column="phone"/>
</resultMap>
<resultMap type="Student" id="StudentWithAddressResult"
extends="StudentResult">
<result property="address.addrId" column="addr_id"/>
<result property="address.street" column="street"/>
<result property="address.city" column="city"/>
<result property="address.state" column="state"/>
<result property="address.zip" column="zip"/>
<result property="address.country" column="country"/>
</resultMap>

现在这个resultMap的ID为StudentWithAddressResult继承了resultMapID为StudentResult.现在如果你只想映射Student的数据,你可以运用resultMap的ID为StudentResutl。

<select id="findStudentById" parameterType="int"
resultMap="StudentResult">
SELECT * FROM STUDENTS WHERE STUD_ID=#{studId}
</select>

如果你想映射多个结果,即有Student也有对应的Address的数据,你可以运用resultMap的ID为StudentWithAddressResult.

<select id="selectStudentWithAddress" parameterType="int"
resultMap="StudentWithAddressResult">
SELECT STUD_ID, NAME, EMAIL, PHONE, A.ADDR_ID, STREET, CITY,
STATE, ZIP, COUNTRY
FROM STUDENTS S LEFT OUTER JOIN ADDRESSES A ON
S.ADDR_ID=A.ADDR_ID
WHERE STUD_ID=#{studId}
</select>







你可能感兴趣的:(java,spring,mybatis,web开发)