Mybatis的关联查询(一)

一对一的关联查询

一、使用resultType进行输出映射

  1. 创建一个新的PO类,由于要将查询出来的属性映射到新的PO类。所有该PO类中应该有查询出来的所有列对应的属性。

//定义新的PO类,该类继承Orders类。有了Orders的全部属性,然后再添加User的属性
public class OrdersCustom extends Orders {

	private String username;// 用户名称
	private String address;// 用户地址
	public String getUsername() {
		return username;
	}
	public void setUsername(String username) {
		this.username = username;
	}
	public String getAddress() {
		return address;
	}
	public void setAddress(String address) {
		this.address = address;
	}
}

  2. 编写mapper.xml文件

 <select id="findOrderAndUserByType" resultType="OrdersCustom" >
        SELECT
                orders.id,
                orders.user_id userId,
                orders.number,
                orders.createtime,
                orders.note,
                USER .username,
                USER .address
            FROM
                orders,
                USER
            WHERE
        orders.user_id = USER .id;
    </select>

  3. 编写mapper接口文件

    public List<OrdersCustom> findOrderAndUserByType() throws Exception;

  4. 测试代码

 public void testFindOrderAndUserByType() throws Exception{
        SqlSession session = sessionFactory.openSession();
        Mapper mapper = session.getMapper(Mapper.class);
        List<OrdersCustom> ordersCustomList = mapper.findOrderAndUserByType();
        for (OrdersCustom ordersCustom : ordersCustomList){
            System.out.println(ordersCustom);
        }
    }

二、使用resultMap进行输出结果的映射

  1. 使用resultMap进行输出结果映射时,不在需要创建新的PO类,只需要在主查询表的PO类中新增管理查询PO类的属性即可。

public class Orders {
    private Integer id;

    private Integer userId;

    private String number;

    private Date createtime;

    private String note;
	//管理查询Po的类
    private User user;
    public User getUser() {
        return user;
    }

    public void setUser(User user) {
        this.user = user;
    }
......
}

  2. 创建映射的resultMap

<resultMap id="OrderAndUserResultMap" type="Orders" >
        <!--
            查询结果中唯一标识列的映射
            column:查询出来的列名
            property:po中的属性名称
        -->
        <id column="id" property="id"/>
        <!--
            查询结果中普通列的映射
            column:查询出来的列名
            property:po中的属性名称
        -->
        <result column="user_id" property="userId" />
        <result column="number" property="number" />
        <result column="createtime" property="createtime" />
        <result column="note" property="note" />
        <!--
            association:该标签用来配置一对一的关系映射
            配置映射的关联的用户信息
            property:要映射到的po类中的属性(orders中的属性)
            javaType:要映射到的那个po类(User类)
        -->
        <association property="user" javaType="User" >
            <!--
           查询结果中唯一标识列的映射
           column:查询出来的列名
           property:po中的属性名称
             -->
            <id column="user_id" property="id" />
            <!--
           查询结果中普通列的映射
           column:查询出来的列名
           property:po中的属性名称
             -->
            <result column="username" property="username" />
            <result column="sex" property="sex" />
            <result column="address" property="address" />
         </association>
    </resultMap>

  3. 编写mapper.xml文件

 <select id="findOrderAndUserByMap" resultMap="OrderAndUserResultMap" >
            SELECT
                orders.*,
                USER .username,
                USER .sex,
                USER .address
            FROM
                orders,
                USER
            WHERE
        orders.user_id = USER .id;
    </select>

  4. 编写mapper接口文件

 public List<Orders> findOrderAndUserByMap() throws Exception;

  5. 测试代码

 public void testFindOrderAndUserByMap() throws Exception{
        SqlSession session = sessionFactory.openSession();
        Mapper mapper = session.getMapper(Mapper.class);
        List<Orders> ordersCustomList = mapper.findOrderAndUserByMap();
        for (Orders orders : ordersCustomList){
            System.out.println(orders);
        }
    }

三 、两种查询方式的特点

  1. resultType:使用resultType实现较为简单,如果pojo中没有包括查询出来的列名,需要增加列名对应的属性,即可完成映射。
  2. 如果没有查询结果的特殊要求建议使用resultType。
  3. resultMap:需要单独定义resultMap,实现有点麻烦,如果对查询结果有特殊的要求,使用resultMap可以完成将关联查询映射pojo的属性中。
  4. resultMap可以实现延迟加载,resultType无法实现延迟加载
posted @ 2017-07-30 22:08  一条路上的咸鱼  阅读(298)  评论(0编辑  收藏  举报