一、背景
1.在实际开发中,经常会向数据库中创建多个表,问且多个表示有关系的,首先我们先讲讲我们的表设计与分析,然后我们再讲讲
在mybatis中xml怎么去使用这个东西。下面我们先讲讲多表的分析与设计。
二、多表的分析与设计
1.一对多的关系
例如:一个部门可以有多个员工,一个员工只能属于某一个部门。
一个分类下有多个商品,一个商品只能属于某个分类。
一个用户能够产生多个订单,一个订单只能属于某一个用户。
建表原则:在“多的一方”创建一个字段,作为外键,指向“一的一方”的主键。
添加数据:与表单添加一致,注意当向从表中添加外键数据时,必须保证在主表上这条数据是存在的。
删除数据:与表单添加一致,注意删除主表数据时,必须保证在从表上这条数据不被引用。
2.多对多的关系
例如:一个学生可以选择多门课程,一门课程可以被多个学生选择。
一个订单可以包含多个商品,一个商品也可以在多个订单中。
建表原则:创建一个中间表,在中间表中至少需要2个字段,分别作为外间指向多对多双方的主键。
3、一对一关系
例如:一个公司只能对应一个注册地址,一个注册地址只能对应一个公司
建表原则:
1)、唯一外键对应
2)、主键对应
三、在mybatis中的使用
上面我们讲了一下多表的分析与设计,在这里我主要讲下一对多和多对多在mybatis的xml中如何使用,下面就开始进入正题,讲一讲这两个在xml中的使用方式。
四、一对多在xml中的使用
1.与前面学习的有所区别,这里不是用的resultType, 而是resultMap,通过resultMap把数据取出来放在对应的对象属性里 。那我们怎么放在对象属性中呢。我们可以这么做(在主表中定义从表),比如我们有两个表,主表是订单表,从表是订单明细表,他们的关系是一对多的关系,下面是具体的实例。
2.pojo
public class Orders {
private int id;
private String orderNumber;
private Date createtime;
private String describer;
private int userId;
//一对一 实体类user
private User user;
//一对多 一个订单对映多个详情 订单详情
private List<OrderDetail> details;
//getter setter方法
...
}
3.xml中的配置一对多的关系(使用collection标签)
<!-- 定义OrderAndUserMap -->
<resultMap type="com.test.po.Orders" id="OrderAndUserMap">
<!--1.订单映射 -->
<id column="id" property="id"/>
<result column="order_number" property="orderNumber"/>
<result column="createtime" property="createtime"/>
<result column="describer" property="describer"/>
<result column="user_id" property="userId"/>
<!--2.用户映射 订单到用户是 一对一
property: com.test.po.Orders 中哪个属性需映射
javaType: user需映射出的java类型
-->
<association property="user" javaType="com.luban.po.User">
<id column="user_id" property="tid"/>
<result column="uname" property="uname"/>
<result column="address" property="address"/>
</association>
</resultMap>
<!--1.需求 查询订单信息,关联查询创建订单的用户信息 输出映射使用resultMap -->
<select id="findOrderAndUserMap" resultMap="OrderAndUserMap">
SELECT o.id,
o.order_number,
o.createtime,
o.describer,
o.user_id,
u.uname,
u.address
FROM orders o, t_user u
where o.user_id = u.tid
</select>
<!--定义查询订单信息及订单明细信息ResultMap -->
<resultMap type="com.test.po.Orders" id="OrderAndDetailMap" extends="OrderAndUserMap">
<!--1.订单映射 -->
<!--2.用户映射 订单到用户是 一对一-->
<!--3.订单详情,一对多 collection
property: com.test.po.Orders 中哪个属性需映射
ofType: 一对多使用 一对一使用javaType
-->
<collection property="details" ofType="com.test.po.OrderDetail">
<id column="detailid" property="id"/>
<result column="order_id" property="orderId"/>
<result column="product_num" property="productNum"/>
</collection>
</resultMap>
<!--2 查询订单信息及订单明细信息 一对多查询 返回resultMap -->
<select id="findOrderAndDetailMap" resultMap="OrderAndDetailMap">
SELECT o.id,
o.order_number,
o.createtime,
o.describer,
o.user_id,
u.uname,
u.address,
d.id detailid,
d.order_id,
d.product_num
FROM orders o, t_user u,orderdetail d
where o.user_id = u.tid and o.id=d.order_id
</select>
五、多对多在xml中的使用
1.pojo
public class Orders {
private int id;
private String orderNumber;
private Date createtime;
private String describer;
private int userId;
//一对一 实体类user
private User user;
//一对多 一个订单对映多个详情 订单详情
private List<OrderDetail> details;
//getter setter方法
...
}
2.User
public class User implements Serializable{
private int tid;
private String uname;
private Date birthday;
private char sex;
private String address;
//用户到订单一对多
private List<Orders> orders;
//getter setter
...
}
3.OrderDetail
public class OrderDetail {
private int id;
private int orderId;
private int productId;
private int productNum;
//详情到产品一对一
private Product product;
//getter setter
...
}
4.Product
public class Product {
private int id;
private String pName;
private String description;
private int price;
private String pPic;
//getter setter
...
}
5.多对多的xml写法
<!-- 定义查询用户信息及用户购买的商品信息ResultMap -->
<resultMap type="com.test.po.User" id="UserAndOrderMap">
<!--1.用户信息映射 -->
<id column="user_id" property="tid"/>
<result column="uname" property="uname"/>
<result column="address" property="address"/>
<!--2.订单信息映射 用户到订单,一对多 -->
<collection property="orders" ofType="com.test.po.Orders">
<id column="id" property="id"/>
<result column="order_number" property="orderNumber"/>
<result column="createtime" property="createtime"/>
<result column="describer" property="describer"/>
<result column="user_id" property="userId"/>
<!--3.订单详情信息映射 订单到订单详情一对多 -->
<collection property="details" ofType="com.test.po.OrderDetail">
<id column="detailid" property="id"/>
<result column="order_id" property="orderId"/>
<result column="product_num" property="productNum"/>
<!--4.商品映射 订单详情到商品一对一 -->
<association property="product" javaType="com.test.po.Product">
<id column="productid" property="id"/>
<result column="p_name" property="pName"/>
<result column="p_pic" property="pPic"/>
</association>
</collection>
</collection>
</resultMap>
<!--查询用户信息及用户购买的商品信息 多对多映射 -->
<select id="findUserAndOrderMap" resultMap="UserAndOrderMap">
SELECT o.id,
o.order_number,
o.createtime,
o.describer,
o.user_id,
u.uname,
u.address,
d.id detailid,
d.order_id,
d.product_num,
p.id productid,
p.p_name,
p.p_pic
FROM orders o, t_user u,orderdetail d,t_product p
where o.user_id = u.tid and o.id=d.order_id and p.id=d.product_id
</select>
六、结束
Always keep the faith!!!