目录

一对一映射:

1.简单的可以基于主表model扩展一个新的model添加缺少的字段,作为ResultType使用。

2.自定义ResultMap,一个model里面包含另一个model配置映射

 一对多映射

自定义ResultMap,一的model里放以多的model为元素的集合(List)

多对多映射:


一对一映射:

一张user表,一张order表,现在要查询某个order记录和所属user的name和address。

1.简单的可以基于主表model扩展一个新的model添加缺少的字段,作为ResultType使用。

基于Orders扩展一个OrderExt的model,添加user表中对应的name和address属性。

以OrderExt作为ResultType。

public class OrdersExt extends Orders{
    private String username;
    private String address;
     //get set 省略
}
<select id="findOrderById" parameterType="int" resultType="ordersExt">
       SELECT o.*,u.username,u.address FROM orders o,user u WHERE
        o.user_id = u.id AND o.id = #{id}
    </select>

2.自定义ResultMap,一个model里面包含另一个model配置映射

    1.在Orders类中添加User类。

    2.自定义一个ResultMap,映射Orders表中字段。

    3.使用<association property="类属性名" javaType="模型类名">标签映射User类和字段

     4.以自定义的ResultMap作为返回值。

public class Orders {
    private Integer id;
    private Integer user_id;
    private String note;//备注
    private Date createtime;//写意的创建时间

    private User user;//一对一映射添加User模型

  //get set 省略
}
<resultMap id="orderRslMap" type="orders">
        <!-- 往orders的模型匹配数据-->
        <id column="id" property="id"></id>
        <id column="note" property="note"></id>
        <id column="createtime" property="createtime"></id>

        <!-- 往orders的user匹配数据
         模型里有模型,使用association来配置-->
        <association property="user" javaType="user">
            <id column="user_id" property="id"></id>
            <id column="username" property="username"></id>
            <id column="address" property="address"></id>
        </association>
    </resultMap>
<select id="findOrderById2" parameterType="int" resultMap="orderRslMap">
        SELECT o.*,u.username,u.address FROM orders o,user u WHERE
        o.user_id = u.id AND o.id = #{id}
    </select>

 一对多映射

仍然是user表和orders表,现在查询一个用户的所有订单记录。

自定义ResultMap,一的model里放以多的model为元素的集合(List<Orders>)

1.在user类中添加Orders为元素的集合。

2.自定义ResultMap,映射User表的字段。

3.使用 <collection property="属性名" ofType="类名"></collection>标签映射Orders类的集合。

4.以自定义的ResultMap作为返回值。

public class User implements Serializable {
	private int id;
	private String username;// 用户姓名
	private String sex;// 性别
	private Date birthday;// 生日
	private String address;// 地址

	private List<Orders> orderList;//一个用户有多张定单(一对多)

     //get set方法省略

}
<resultMap id="userRslMap" type="user">
        <!-- 1.匹配user属性 -->
        <id column="id" property="id"></id>
        <result column="username" property="username"/>
        <result column="password" property="password"/>

        <!--2.匹配user的orderList-->
        <collection property="orderList" ofType="orders">
            <id column="order_id" property="id"></id>
            <result column="number" property="number"/>
            <result column="createtime" property="createtime"/>
            <result column="note" property="note"/>

        </collection>
    </resultMap>

多对多映射:

当前有四张表,user,order,orderDetail,items。要求实现:查询用户信息及用户购买的商品信息。

1.在类中根据关系添加model,user中加order的集合,order中加orderDetail的集合,orderDetail中加iteams

2,定义以user为主表的ResultMap,映射user的字段信息。

3.使用<collection property="orderList" ofType="orders">映射orders模型集合

4.使用<collection property="orderDetails" ofType="orderDetail">在orders模型的集合内映射orderDetail模型的集合。

5.使用<association property="items" javaType="items">在orderDetail集合中映射items模型

6.把自定义的ResultMap作为返回值。

public class User implements Serializable {
	private int id;
	private String username;// 用户姓名
	private String sex;// 性别
	private Date birthday;// 生日
	private String address;// 地址

	private List<Orders> orderList;//一个用户有多张定单

    //get set方法省略

	}
public class Orders {
    private Integer id;
    private Integer user_id;
    private String note;//备注
    private String number;
    private Date createtime;//写意的创建时间

    private List<OrderDetail> orderDetails;
}
public class OrderDetail {
    private Integer id;//定单详情ID
    private Integer itemsId;//商品ID
    private Integer itemsNum;//商品购买数量

    private Items items;//商品模型
}
public class Items {
    private Integer id;
    private String name;
    private String price;
    private String detail;
}

 

<resultMap id="userRslMap" type="user">
        <!-- 1.匹配user属性 -->
        <id column="id" property="id"></id>
        <result column="username" property="username"/>
        <result column="password" property="password"/>

        <!--2.匹配user的orderList-->
        <collection property="orderList" ofType="orders">
            <id column="order_id" property="id"></id>
            <result column="number" property="number"/>
            <result column="createtime" property="createtime"/>
            <result column="note" property="note"/>

            <!-- 3.匹配Orders里有orderDetails-->
            <collection property="orderDetails" ofType="orderDetail">
                <id column="detail_id" property="id"></id>
                <result column="items_id" property="itemsId"/>
                <result column="items_num" property="itemsNum"/>

                <!-- 4.配置定单详情的商品信息-->
                <association property="items" javaType="items">
                    <id column="items_id" property="id"/>
                    <result column="name" property="name"/>
                    <result column="price" property="price"/>
                    <result column="detail" property="detail"/>
                </association>
            </collection>
        </collection>
    </resultMap>
<select id="findUserAndOrderInfo" resultMap="userRslMap">
        SELECT u.id,u.username,u.address,o.id order_id,o.number,o.createtime,o.note,
        od.id detail_id,od.items_id,od.items_num,it.name,it.price,it.detail
        FROM user u,orders o,orderdetail od,items it
        WHERE o.user_id = u.id AND o.id = od.orders_id AND od.items_id = it.id
    </select>