目录
一对一映射:
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>