Mybatis中的映射结果resutType和resultMap

需求:查询订单信息, 关联查询用户信息

分析:共有订单表和用户表两张表,其中订单表是主表,用户表是从表

关系:一个订单对应着一个用户,从订单到用户是一对一, 从订单到用户是一对一的关联关系

sql:

1
2
3
4
5
6
7
8
SELECT
    orders.*
    USER.username,
    USER.sex,
    USER.address
FROM
    orders,
    USER

POJO类:

  Orders.java:

1
2
3
4
private Integer id;
private String orderName;
private Date crateTime;
加上 getter/setter 方法

  User.java:

1
2
3
4
5
6
private Integer id;
private String username;
private String password;
private String sex;
private String address;
加上 getter/setter 方法

(一) 使用resultType实现

  为了系统的可扩展性, 需要另外创建一个POJO类的扩展类(扩展类是继承订单POJO还是用户POJO,具体看SQL语句的查询列中查询出来的字段在哪个POJO中占得多, 哪个映射的字段多扩展类就继承哪个POJO类),这里就继承Orders类了,当然继承User类也是可以的:

  OrdersUser.java: (这个类将是resultType的映射结果类型)

1
2
3
4
5
6
7
public class OrdersUser extends Orders {       // 继承这个类,Orders类中的属性全都有了
    // 把User的查询列字段加上
    private String username;
    private String sex;
    private String address;
    加上 getter/setter 方法
}

    Mapper接口(这里使用的是动态代理接口),OrdersUserMapper.java:

1
2
3
public interface OrdersUserMapper {
    List<OrdersUser> findOrdersUser() throws Exception();
}

  Mapper接口对应的映射文件, OrdersUserMapper.xml:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd" >
 
<mapper namespace="包.OrdersUserMapper">
    <select id="findOrdersUser" resultType="包.OrdersUser">
        SELECT
        orders.*
        USER.username,
        USER.sex,
        USER.address
        FROM
        orders,
        USER
    </select>
</mapper>

(二) 使用resultMap实现

POJO类:直接在Orders.java类中添加User对象属性,比如:

Orders.java:

1
2
3
4
5
6
private Integer id;
private String orderName;
private Date createTime;
 
private User user;        // 这里直接引入User对象属性
加上 getter/setter 方法

Mapper接口, OrdersUserMapper.xml:

1
2
3
public interface OrdersUserMapper {
    List<Orders> findOrdersUser() throws Exception();
}

Mapper映射文件(要和Mapper接口同名且在同一个目录下),OrdersUserMapper.xml:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd" >
 
<mapper namespace="包.OrdersUserMapper">
    <resultMap id="findOrdersUserResultMap" type="包.Orders">
        <!-- 映射的Orders类的属性 -->
        <id column="id" property="id"/><!-- USER表字段列的唯一标识 -->
        <result column="order_name" property="orderName"/>
        <result column="create_time" property="createTime"/>
 
        <!-- 关联映射的User类的属性 -->
        <association property="user" javaType="包.User">
            <id column="id" /><!-- orders表字段列的唯一标识 -->
            <result column="username" property="username"/>
            <result column="sex" property="sex"/>
            <result column="address" property="address"/>
        </association>
    </resultMap>
 
    <select id="findOrdersUser" resultMap="findOrdersUserResultMap">
        SELECT
        orders.*
        USER.username,
        USER.sex,
        USER.address
        FROM
        orders,
        USER
    </select>
</mapper>

------------<完>---------------------------------------------------------------------------------

以上是一对一, 下面是一对多的关联关系的映射

需求:查询订单关联查询订单明细的信息

分析:有两张表,订单表orders表和订单明细表ordersdetail

关系:一个订单对应多个订单明细, 从订单到订单明细是一对多的关联关系

  用户表和订单表有关系, 订单表和订单明细表有关系, 订单表是中间表

做法:在以上一对一的基础上添加订单明细的映射即可

sql:

1
2
3
4
5
6
7
8
9
10
11
12
13
SELECT
    orders.*
    USER.username,
    USER.sex,
    USER.address,
    orderdetail.items_id,
    orderdetail.items_num
FROM
    orders,
    USER
    ordersdetail
WHERE
    orders.user_id=user.id AND orderdetail.orders_id=orders.id

在Orders.java中添加List<OrderDetail> orderDetails

 接下的做法请参考:http://www.cnblogs.com/josephcnblog/articles/6442030.html

原文地址:https://www.cnblogs.com/brithToSpring/p/13489052.html