Bootstrap

mybatis中xml怎么写(表与表之间的关系分析)

一、背景

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!!!

;