mybatis 实现一对一关联表查询

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

public classOrdersCustom extends Orders{

   //添加用户属性

      /*USER.username,

        USER.sex,

        USER.address */

  

   private String username;

   private String sex;

   private String address;

  

1.2.3    mapper.xml

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

   <select id="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

public classOrders {

   privateInteger id;

 

   privateInteger userId;

 

   privateString number;

 

   privateDate createtime;

 

   privateString note;

   

   //用户信息

    private User user;

1.3.3    mapper.xml

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

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

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

   -->

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

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

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

        column:订单信息的唯一标识

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

       -->

     <id column="id"property="id"/>

     <result column="user_id"property="userId"/>

     <result column="number"property="number"/>

     <result column="createtime"property="createtime"/>

     <result column="note"property=note/>

    

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

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

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

      -->

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

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

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

        javaType:映射到user的哪个属性

         -->

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

        <result column="username"property="username"/>

        <result column="sex"property="sex"/>

        <result column="address"property="address"/>

     </association>

  </resultMap>

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

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

   <select id="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;

测试略

摘自传智博客燕青老师的视频

你可能感兴趣的:(java,Web,mybatis)