resultMap的使用以及延时加载机制

1.一对多查询

UserDAOMapper.xml

<SqlMap namespace="User">

  <typeAlias alias="user" type="com.ibatis.sample.User"/>
  <typeAlias alias="address" type="com.ibatis.sample.Address"/>

  <resultMap id="get-user-result" class="user">  resultMap的功能就是将user类的所有属性都映射出来 
    <result property="id" column="id" /> property是user的属性, column是数据库列名
    <result property="name" column="name" />
    <result property="addresses" column="id"   此处指明通过getAddressById获得addresses(一个address的数组)属性,getAddressById的参数是id
      select="User.getAddressesById"/>   此处的  User.getAddressById   User.指的是命名空间
  /<resultMap>

  <select id="getUsers"
    parameterClass="string"
    resultMap="get-user-result" >
    <![CDATA[
    select
      id,
      name
    from t_user
    where  id = #id#
    ]]>
  </select>

  <select id="getAddressesById"
    parameterClass="int"
    resultClass="address">
    <![CDATA[
    select
      address,
      zipcode
    from t_address
    where user_id = #userid#
    ]]>
  </select>

使用方法代码

List userList = sqlMap.queryForList("User.getUsers", ""); 即可返回user的list
Address[] addresses = userList.getAddresses();

*延时加载
在List userList = sqlMap.queryForList("User.getUsers", "")时,只执行了select id, name, sex from t_user一条SQL语句.当
Address[] addresses = userList.getAddresses();时,才开始执行获取Address的sql语句.这就是延时加载

*延迟加载并非对所有属性有效,只有实现了List接口的属性才能进行延迟加载

2.一对一查询

如果user和address是一对一关联,则使用同时select两个表的查询,以提高性能,节省资源

<resultMap id="get-user-result" class="user">
  <result property="id" column="id"/>
  <result property="name" column="name"/>
  <result property="sex" column="sex"/>
  <result property="address" column="t_address.address"/>
  <result property="zipCode" column="t_address.zipcode"/>
</resultMap>

<select parameterClass="string" resultMap="get-user-result" >
  <![CDATA[
  select
    *
  from t_user, t_address
  where t_user.id = t_address.user_id
  ]]>
</select>

猜你喜欢

转载自chinagdvea.iteye.com/blog/1021188
今日推荐