mybatis 实现一对一关联表查询

来源:互联网 发布:淘宝颜真卿钢笔字帖 编辑:程序博客网 时间:2024/05/16 09:50

1      一对一查询

1.1  需求

查询订单信息,关联查询创建订单的用户信息

1.2  resultType

1.2.1    sql语句

确定查询的主表:订单表

确定查询的关联表:用户表

         关联查询使用内链接?还是外链接?

         由于orders表中有一个外键(user_id),通过外键关联查询用户表只能查询出一条记录,可以使用内链接。关联查询,orders.* ,USER.username  ,  USER.sex ,  USER.address为关联查询的列,Orders  ,  USER  为关联的表orders.user_id= user.id为关联查询的条件(注意条件中的 ,  号)

 

SELECT

  orders.* ,

  USER.username ,

  USER.sex ,

  USER.address

FROM

  Orders ,

  USER

WHERE orders.user_id = user.id

1.2.2    创建pojo

将上边sql查询的结果映射到pojo中,pojo中必须包括所有查询列名。

原始的Orders.java不能映射全部字段,需要新创建的pojo。

创建 一个pojo继承包括查询字段较多的po类。

 

//通过此类映射订单和用户传查询的结果,让此类继承包括字段较多的POJO

publicclassOrdersCustom extends Orders{

   //添加用户属性

      /*USER.username,

        USER.sex,

        USER.address */

  

   private Stringusername;

   private Stringsex;

   private Stringaddress;

  

1.2.3    mapper.xml

   <!-- 查询订单关联查询用户信息 -->

   <selectid="findOrdersUser"resultType="OrdersCustom">

      SELECTorders.* ,

      user.username,user.sex, user.address FROM orders ,USER

      WHERE

      orders.user_id=user.id

   </select>

1.2.4    mapper.java

      //查询订单关联查询用户信息

   publicList<OrdersCustom> findOrdersUser()throws Exception;

1.3  resultMap

1.3.1    使用resultMap映射的思路

使用resultMap将查询结果中的订单信息映射到Orders对象中,在orders类中添加User属性,将关联查询出来的用户信息映射到orders对象中的user属性中。

 

1.3.2    需要Orders类中添加user属性关联user

publicclassOrders {

   privateIntegerid;

 

   privateIntegeruserId;

 

   privateStringnumber;

 

   privateDatecreatetime;

 

   privateStringnote;

   

   //用户信息

    private Useruser;

1.3.3    mapper.xml

1.3.3.1      定义resultMap一对一关联查询用association  的类型为javatype定义的类型   columnsql语句中的字段,property 为你需要映射的字段

<!-- 订单查询关联用户的resultMap

  将整个查询的结果映射到cn.itcast.mybatis.po.Orders

   -->

  <resultMaptype="cn.itcast.mybatis.po.Orders"id="OrdersUserResultMap">

     <!--配置映射的订单信息 -->

     <!-- id:指定查询列中的唯一标识,订单信息的中的唯一标识,如果有多个列组成唯一标识,配置多个id

        column:订单信息的唯一标识

        property:订单信息的唯一标识列所映射到Orders中哪个属性

       -->

     <idcolumn="id"property="id"/>

     <resultcolumn="user_id"property="userId"/>

     <resultcolumn="number"property="number"/>

     <resultcolumn="createtime"property="createtime"/>

     <resultcolumn="note"property=note/>

    

     <!--配置映射的关联的用户信息 -->

     <!-- association:用于映射关联查询单个对象的信息

     property:要将关联查询的用户信息映射到Orders中哪个属性

      -->

     <associationproperty="user" javaType="cn.itcast.mybatis.po.User">

        <!-- id:关联查询用户的唯一标识

        column:指定唯一标识用户信息的列

        javaType:映射到user的哪个属性

         -->

        <idcolumn="user_id"property="id"/>

        <resultcolumn="username"property="username"/>

        <resultcolumn="sex"property="sex"/>

        <resultcolumn="address"property="address"/>

     </association>

  </resultMap>

1.3.3.2      statement定义还是关联查询此处要注意ResultMap返回类型名称要和定义的ResultMap  id 一致

<!-- 查询订单关联查询用户信息 -->

   <selectid="findOrdersUserResultMap"resultMap="OrdersUserResuletMap">

      SELECTorders.* ,

      user.username,user.sex, user.address FROM orders ,USER

      WHERE

      orders.user_id=user.id

   </select>

1.3.4    mapper.java

//查询订单关联查询用户使用resultMap

public List<Orders> findOrdersUserResultMap()throws Exception;

测试略

摘自传智博客燕青老师的视频
0 0
原创粉丝点击