下面就是关于“Mybatis中resultMap的使用总结”的详细攻略。
什么是resultMap
resultMap是MyBatis中比较重要的一个元素,可以自定义SQL返回结果。通过定义resultMap,我们可以灵活的控制与定制查询结果,使结果集可以和我们Java对象相映射。
resultMap是一个描述如何从JDBCResultSet中加载数据的规则集,它会告诉MyBatis如何映射结果集中的列到对象的属性。
resultMap的使用
1. resultMap的定义
resultMap的定义包含以下属性:
- id:唯一标识resultMap,方便其他select语句引用
- type:映射到的java类型,可以是基本类型、自定义类型或Map类型
- extends:父类resultMap的引用
- autoMapping:是否启用自动映射(默认为false)
<resultMap id="personResultMap" type="com.example.PersonDO" autoMapping="true">
<!-- 表中的字段名和Java类的属性名对应关系 -->
<id property="id" column="id" />
<result property="name" column="person_name" />
<result property="age" column="person_age" />
</resultMap>
2. resultMap的引用
在select语句中直接使用
<select id="selectPersonList" resultMap="personResultMap">
select id, person_name, person_age from person where id = #{id}
</select>
在其他resultMap中使用(继承)
<resultMap id="detailedPersonResultMap" type="com.example.DetailedPersonDO" extends="personResultMap">
<!-- 表中的字段名和Java类的属性名对应关系 -->
<result property="phone" column="person_phone" />
<result property="email" column="person_email" />
</resultMap>
3. 嵌套resultMap
resultMap可以嵌套,例如一个Person类中有多个Address,可以将Address的映射放在另一个resultMap中,然后在Person的resultMap中引用。
<resultMap id="personResultMap" type="com.example.PersonDO" autoMapping="true">
<id property="id" column="id" />
<result property="name" column="person_name" />
<result property="age" column="person_age" />
<!-- 嵌套的Address resultMap -->
<collection property="addressList" ofType="com.example.AddressDO" resultMap="addressResultMap"/>
</resultMap>
<resultMap id="addressResultMap" type="com.example.AddressDO">
<id property="id" column="id" />
<result property="province" column="address_province" />
<result property="city" column="address_city" />
<result property="street" column="address_street" />
</resultMap>
<select id="selectPersonList" resultMap="personResultMap">
select p.id, p.person_name, p.person_age, a.id as address_id, a.address_province, a.address_city, a.address_street
from person p
left join address a on p.id = a.person_id
where p.id = #{id}
</select>
示例1:使用resultMap返回关联表查询结果
例如Person类和Address类都对应数据库中的表,表结构如下:
- person表(id, person_name, person_age)
- address表(id, person_id, address_province, address_city, address_street)
针对Person和Address表做关联查询,使用resultMap返回结果。
定义Person和AddressDO:
public class PersonDO {
private Integer id;
private String name;
private Integer age;
private List<AddressDO> addressList;
}
public class AddressDO {
private Integer id;
private Integer personId;
private String province;
private String city;
private String street;
}
在xml中定义resultMap:
<resultMap id="personResultMap" type="com.example.PersonDO">
<id property="id" column="id" />
<result property="name" column="person_name" />
<result property="age" column="person_age" />
<collection property="addressList" ofType="com.example.AddressDO" resultMap="addressResultMap"/>
</resultMap>
<resultMap id="addressResultMap" type="com.example.AddressDO">
<id property="id" column="id" />
<result property="personId" column="person_id" />
<result property="province" column="address_province" />
<result property="city" column="address_city" />
<result property="street" column="address_street" />
</resultMap>
定义select语句:
<select id="selectPersonList" resultMap="personResultMap">
select p.id, p.person_name, p.person_age, a.id as address_id, a.person_id, a.address_province, a.address_city, a.address_street
from person p
left join address a on p.id = a.person_id
where p.id = #{id}
</select>
查询结果会按照resultMap的映射规则返回PersonDO实例,其中包含了多个AddressDO实例,这些AddressDO实例被封装为List集合并设置到PersonDO实例的addressList属性。
示例2:使用resultMap对结果做类型转换
例如数据库中存储时间的字段都是datetime类型,但是Java中可能需要用LocalDateTime表示时间类型,可以通过resultMap对SQL查询结果进行类型转换。
定义PersonDO:
public class PersonDO {
private Integer id;
private String name;
private Integer age;
private LocalDateTime createTime;
}
在xml中定义resultMap:
<resultMap id="personTimeResultMap" type="com.example.PersonDO">
<id property="id" column="id" />
<result property="name" column="person_name" />
<result property="age" column="person_age" />
<!-- 使用typeHandler实现类型转换 -->
<result property="createTime" column="person_create_time"
typeHandler="org.apache.ibatis.type.LocalDateTimeTypeHandler"/>
</resultMap>
定义select语句:
<select id="selectPersonTime" resultMap="personTimeResultMap">
select id, person_name, person_age, person_create_time from person where id = #{id}
</select>
查询结果会按照resultMap的映射规则返回PersonDO实例,其中createTime属性会被MyBatis自动使用注册的typeHandler进行类型转换封装为LocalDateTime类型。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Mybatis中resultMap的使用总结 - Python技术站