订单商品数据模型-分析思路
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了订单商品数据模型-分析思路相关的知识,希望对你有一定的参考价值。
我们接下来要对即将用来实验的订单商品数据模型进行分析。
首先在mysql中创建数据库,在其中创建以下表:
CREATE TABLE `items` ( `id` int(11) NOT NULL AUTO_INCREMENT, `name` varchar(32) NOT NULL COMMENT ‘商品名称‘, `price` float(10,1) NOT NULL COMMENT ‘商品定价‘, `detail` text COMMENT ‘商品描述‘, `pic` varchar(64) DEFAULT NULL COMMENT ‘商品图片‘, `createtime` datetime NOT NULL COMMENT ‘生产日期‘, PRIMARY KEY (`id`) ) ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=utf8; CREATE TABLE `orderdetail` ( `id` int(11) NOT NULL AUTO_INCREMENT, `orders_id` int(11) NOT NULL COMMENT ‘订单id‘, `items_id` int(11) NOT NULL COMMENT ‘商品id‘, `items_num` int(11) DEFAULT NULL COMMENT ‘商品购买数量‘, PRIMARY KEY (`id`), KEY `FK_orderdetail_1` (`orders_id`), KEY `FK_orderdetail_2` (`items_id`), CONSTRAINT `FK_orderdetail_1` FOREIGN KEY (`orders_id`) REFERENCES `orders` (`id`) ON DELETE NO ACTION ON UPDATE NO ACTION, CONSTRAINT `FK_orderdetail_2` FOREIGN KEY (`items_id`) REFERENCES `items` (`id`) ON DELETE NO ACTION ON UPDATE NO ACTION ) ENGINE=InnoDB AUTO_INCREMENT=5 DEFAULT CHARSET=utf8; CREATE TABLE `orders` ( `id` int(11) NOT NULL AUTO_INCREMENT, `user_id` int(11) NOT NULL COMMENT ‘下单用户id‘, `number` varchar(32) NOT NULL COMMENT ‘订单号‘, `createtime` datetime NOT NULL COMMENT ‘创建订单时间‘, `note` varchar(100) DEFAULT NULL COMMENT ‘备注‘, PRIMARY KEY (`id`), KEY `FK_orders_1` (`user_id`), CONSTRAINT `FK_orders_id` FOREIGN KEY (`user_id`) REFERENCES `user` (`id`) ON DELETE NO ACTION ON UPDATE NO ACTION ) ENGINE=InnoDB AUTO_INCREMENT=6 DEFAULT CHARSET=utf8; CREATE TABLE `user` ( `id` int(11) NOT NULL AUTO_INCREMENT, `username` varchar(32) NOT NULL COMMENT ‘用户名称‘, `birthday` date DEFAULT NULL COMMENT ‘生日‘, `sex` char(1) DEFAULT NULL COMMENT ‘性别‘, `address` varchar(256) DEFAULT NULL COMMENT ‘地址‘, PRIMARY KEY (`id`) ) ENGINE=InnoDB AUTO_INCREMENT=27 DEFAULT CHARSET=utf8;
(1).每张表记录的数据内容:分模块对每张表记录的内容进行熟悉,相当于你学习系统需求(功能)的过程;
(2).每张表重要的字段设置:非空字段、外键字段;
(3).数据库级别表与表之间的关系:外键关系;
(4).表与表之间的业务关系:在分析表与表之间的业务关系时一定要建立在某个业务意义基础上去分析。
3.针对订单商品模型的数据库思路分析:
用户表:t_user-->记录了购买商品的用户信息
订单表:orders-->记录了用户所创建的订单(购买商品的订单)
订单明细表:orderdetail-->记录了订单的详细信息即购买商品的信息
商品表:items-->记录了商品信息
表与表之间的业务关系:
在分析表与表之间的业务关系时需要建立在某个业务意义基础上去分析。
先分析数据级别之间有关系的表之间的业务关系:
t_user和orders:
t_user---->orders:一个用户可以创建多个订单,一对多
orders--->t_user:一个订单只由一个用户创建,一对一
orders和orderdetail:
orders--->orderdetail:一个订单可以包括多个订单明细,因为一个订单可以购买多个商品,每个商品的购买信息在orderdetail记录,一对多关系
orderdetail-->orders:一个订单明细只能包括在一个订单中,一对一
orderdetail和itesm:
orderdetail--->itesms:一个订单明细只对应一个商品信息,一对一
items-->orderdetail:一个商品可以包括在多个订单明细,一对多
再分析数据库级别没有关系的表之间是否有业务关系:
orders和items:
orders和items之间可以通过orderdetail表建立关系。
4.分析之后画出对应的图,方便直观的了解业务关系
二、一对一查询
2.1.需求:查询订单信息,关联查询用户信息;
2.2.resultType实现
2.2.1.sql语句
确定查询的主表:订单表,确定查询的关联表:用户表。
1 SELECT t1.*,
2 t2.username,
3 t2.sex,
4 t2.address
5 FROM
6 orders t1,
7 t_user t2
8 WHERE t1.user_id=t2.id
2.2.2.创建entity实体
用户实体:User.java
package com.mybatis.entity;
import java.util.Date;
import java.util.List;
/**
* @ClassName: User
* @Description: TODO(用户实体)
* @author 阿赫瓦里
*/
public class User {
private Integer id;
// 姓名
private String username;
// 性别
private String sex;
// 地址
private String address;
// 生日
private Date birthday;
// 用户创建的订单列表
private List<Orders> ordersList;
// getter and setter ......
}
订单实体:orders.java
package com.mybatis.entity;
import java.util.Date;
import java.util.List;
/**
* @ClassName: Orders
* @Description: TODO(订单实体)
* @author 阿赫瓦里
*/
public class Orders {
/** 主键订单Id */
private Integer id;
/** 下单用户id */
private Integer userid;
/** 订单号 */
private String number;
/** 创建订单时间 */
private Date createTime;
/** 备注 */
private String note;
// 用户信息
private User user;
// 订单明细
private List<OrderDetail> orderdetails;
// getter and setter ......
}
商品实体:Items.java
package com.mybatis.entity;
import java.util.Date;
/**
* @ClassName: Items
* @Description: TODO(商品实体类)
* @author 阿赫瓦里
*/
public class Items {
/** 商品表主键Id */
private Integer id;
/** 商品名称 */
private String itemsName;
/** 商品定价 */
private float price;
/** 商品描述 */
private String detail;
/** 商品图片 */
private String picture;
/** 生产日期 */
private Date createTime;
// getter and setter ......
}
订单明细实体:OrderDetail.java
package com.mybatis.entity;
/**
* @ClassName: OrderDetail
* @Description: TODO(订单明细实体)
* @author 阿赫瓦里
*/
public class OrderDetail {
/** 主鍵,訂單明细表Id */
private Integer id;
/** 訂單Id */
private Integer ordersId;
/** 商品id */
private Integer itemsId;
/** 商品购买数量 */
private Integer itemsNum;
// 明细对应的商品信息
private Items items;
// getter and setter ......
}
创建一个包装类,将查询到的信息可以全部映射到此类:OrdersCustom.java
/**
* @ClassName: OrdersCustom
* @Description: TODO(订单的扩展类,通过此类映射订单和用户的查询结果,让此类继承字段较多的实体类)
* @author: 阿赫瓦里
*/
public class OrdersCustom extends Orders {
// 添加用户的属性
private String username;
private String sex;
private String address;
// getter and setter......
}
2.2.3.创建OrdersCustomMapper.java
package com.mybatis.Mapper;
import java.util.List;
import com.mybatis.entity.OrdersCustom;
/**
* @ClassName: OrdersMapperCustom
* @Description: TODO(OrdersMapperCustom的mapper)
* @author 阿赫瓦里
*/
public interface OrdersCustomMapper {
/** 查询订单,关联查询用户信息 */
public List<OrdersCustom> findOrdersUser();
}
2.2.4.创建OrdersCustomMapper.xml和上面对应的接口名称一致,以便通过mapper接口加载配置文件
<?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">
<!-- namespace命名空间,作用就是对sql进行分类化的管理,理解为sql隔离
注意:使用mapper代理开发时,namespace有特殊作用,namespace等于mapper接口地址
-->
<mapper namespace="com.mybatis.mapper.OrdersCustomMapper">
<!-- 查询订单,关联查询用户信息 -->
<select id="findOrdersUser" resultType="com.mybatis.entity.OrdersCustom">
SELECT t1.*,
t2.username,
t2.sex,
t2.address
FROM
orders t1,
t_user t2
WHERE t1.user_id=t2.id
</select>
</mapper>
2.3.resultMap实现
2.3.1. sql语句同上
2.3.2.resultMap映射思路:
使用resultMap将查询结果中的订单信息映射到Orders对象中,在orders类中添加User属性,将关联查询出来的用户信息映射到orders对象中的user属性中(上面orders实体中已经添加)。
2.3.3 ordersCustomMapper.xml
1. 定义resultMap
1 <!-- 定义查询订单关联用户的 resultMap,将整个的查询结果映射到com.mybatis.entity.Orders中 -->
2 <resultMap type="com.mybatis.entity.Orders" id="OrdersUserResultMap">
3 <!-- 配置映射的订单信息 -->
4
5 <!-- id:查询列中的唯一标识,订单信息中的唯一标识,如果多列组成唯一标识(如:一般数据库设计中的字典表 使用联合主键),就需要配置多个id
6 column:订单信息的唯一标识 列
7 property:订单信息的唯一标识列所映射到orders中的那个属性(假如:数据库中orders表中的主键为orders_id,而实体属性名称为ordersId,
8 则这个配置应为<id column="orders_id" property="ordersId"/>,类似hibernate实体映射文件配置)。
9 -->
10 <id column="id" property="id"/>
11 <result column="user_id" property="userid"/>
12 <result column="number" property="number"/>
13 <result column="createtime" property="createTime"/>
14 <result column="note" property="note"/>
15
16 <!-- 配置映射的关联用户信息 -->
17
18 <!--association:用于映射关联查询单个对象的信息
19 property:要将关联查询的用户信息映射到Orders中那个属性
20 -->
21 <association property="user" javaType="com.mybatis.entity.User">
22 <!-- id:关联查询用户的唯一标识
23 column:指定唯一标识用户信息的列
24 property:映射到user的那个属性
25 -->
26 <id column="user_id" property="id"/>
27 <result column="username" property="username"/>
28 <result column="sex" property="sex"/>
29 <result column="address" property="address"/>
30 </association>
31
32 </resultMap>
2. statement定义
1 <!-- 查询订单,关联查询用户信息,使用resultMap实现 -->
2 <select id="findOrdersUserResultMap" resultMap="OrdersUserResultMap">
3 SELECT t1.*,
4 t2.username,
5 t2.sex,
6 t2.address
7 FROM
8 orders t1,
9 t_user t2
10 WHERE t1.user_id=t2.id
11 </select>
以上是关于订单商品数据模型-分析思路的主要内容,如果未能解决你的问题,请参考以下文章
java-mybaits-00501-案例-映射分析-订单商品数据模型