ResultMaps经常用于映射SQL的查询语句,将查询的结果与JavaBean的参数相对应。
我们可以定义ResultMaps和从多个查询的语句中引用它的resultMap查询。MyBatis的ResultMapps是有非常强大的特性,你可以用它查询一对一、一对多的表关系。可能,读者对这样的表述不是很明白,学习了接下的知积之后你就可以明白了。
下面的例子是一个简单的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")); }
我们可以通过其它的<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>