数据库设计
--创建订单表
create table sale_order(
odr_id int primary key auto_increment,--订单编号,唯一
odr_customer_id int not null,
odr_customer_name varchar(100) not null,
odr_deliver_addr varchar(500) not null,
odr_order_date date not null,
odr_deliver_date date not null,
odr_status varchar(50)
);
--创建订单条目表
create table sale_order_line
(
odl_id int primary key auto_increment,--订单条目编号,唯一
odl_order_id int not null, --sale_order表的外键,对应的订单编号
odl_product_name varchar(50),
odl_product_price double not null,
odl_product_count int not null
);
--订单表与订单详细表的主外键关系
alter table sale_order_line
add constraint FK_sale_order_line_id
foreign key(odl_order_id) references sale_order(odr_id);
订单实体类
public class SaleOrder implements java.io.Serializable {
private static final long serialVersionUID = 1056218493209950488L;
private Long odrId;//订单id
private Long odrCustomerId = 0L;//订单客户id
private String odrCustomerName;//订单客户名字
private String odrDeliverAddr;//订单配送地址
private Date odrOrderDate = new Date(new java.util.Date().getTime());
private Date odrDeliverDate = new Date(new java.util.Date().getTime());
private String odrStatus;//订单状态
//关联... 外联接订单详细表查询
private List<SaleOrderLine> saleOrderLines=new ArrayList<SaleOrderLine>();
private String odrOrderDateString;
private String odrDeliverDateString;
private SaleOrderLine saleOrderLine; //订单项添加功能时用的.
}
订单条目实体类
public class SaleOrderLine implements java.io.Serializable {
private static final long serialVersionUID = 5234127736211637617L;
private Long odlId;//订单条目id
//数据库中的odl_order_id是订单编号,对应这个对象
private SaleOrder saleOrder; // odl_order_id,对应sale_order中的一行数据
private String odlProductName; //产品名
private Double odlProductPrice; //产品价格
private Integer odlProductCount; //产品数量
}
给订单添加一个订单条目的代码
public class SaleOrderBizImpl implements SaleOrderBiz {
//调用这个方法之前只需要封装一个SaleOrderLine对象o,在new一个SaleOrder对象temp并
//temp.setOdrId(XXX),然后o.setSaleOrder(temp),之后这个o对象就可以传入改方法调用了
//给订单增加一个条目
public void addDetail(SaleOrderLine o) {
boolean flag = false;
//1. 根据订单编号查订单,以获得这个订单的所有订单条目.
SaleOrder so = getWithLines(o.getSaleOrder().getOdrId());//这个方法的sql语句在博文下节Biz,DAO,以及Mapper配置文件
//有订单条目,则看订单条目中是否存在当前的订单条目,如果有,则只需要更新数量
if (so != null && so.getSaleOrderLines() != null && so.getSaleOrderLines().size() > 0) {
List<SaleOrderLine> list = so.getSaleOrderLines();
for (SaleOrderLine sol : list) {
if (sol.getOdlProductName().equals(o.getOdlProductName())) {
//如果产品(订单条目)已经存在,则取出已经存在的订单条目编号并填入(这是因为要
//更新这条订单条目,所以需要一个id来定位到这个订单条目),及更改数量
o.setOdlId(sol.getOdlId());
//当前数量加之前数量
o.setOdlProductCount(o.getOdlProductCount() + sol.getOdlProductCount());
flag = true;
break;
}
}
}
if (flag) {
//进入跟新,需要id
this.saleOrderDao.updateDetail(o);
} else {
//进入添加,id由mysql创建
this.saleOrderDao.addDetail(o);
}
}
public SaleOrder getWithLines(Long id) {
return this.saleOrderDao.getWithLines(id);
}
}
Biz,DAO,以及Mapper配置文件
public SaleOrder getWithLines(Long id) {
return this.sqlSession.selectOne("com.yc.dao.SaleDaoMapper.getWithLines",id);
/**SQL语句
<select id="getWithLines" resultMap="SaleOrderMapper">
select odr_id,odr_customer_id,odr_customer_name,odr_deliver_addr,odr_order_date,odr_deliver_date,odr_status,
odl_id, odl_order_id,odl_product_name,odl_product_price,odl_product_count
from sale_order
left join sale_order_line
on sale_order.odr_id=sale_order_line.odl_order_id
where sale_order.odr_id=#{id}
</select>
<!-- 映射文件 -->
<resultMap id="SaleOrder" type="SaleOrderMapper">
<result property="odrCustomerId" column="odr_customer_id" />
<result property="odrCustomerName" column="odr_customer_name" />
<result property="odrDeliverAddr" column="odr_deliver_addr" />
<result property="odrOrderDate" column="odr_order_date" />
<result property="odrDeliverDate" column="odr_deliver_date" />
<result property="odrStatus" column="odr_status" />
<collection property="saleOrderLines" ofType="SaleOrderLine">
<id property="odlId" column="odl_id"/>
<result property="odlProductName" column="odl_product_name"/>
<result property="odlProductPrice" column="odl_product_price"/>
<result property="odlProductCount" column="odl_product_count"/>
</collection>
</resultMap>
*/
}
//该博文下面的代码其实可以不看》》》》》》》》》》》》》》》》》》》》》》》
@Override
public void addDetail(SaleOrderLine o) {
this.sqlSession.insert("com.yc.dao.SaleOrderDaoMapper.addDetail",o);
/**
<insert id="addDetail" parameterType="SaleOrderLine"
useGeneratedKeys="true" keyColumn="odl_id" keyProperty="odlId">
insert into
sale_order_line(odl_order_id,odl_product_name,odl_product_price,odl_product_count)
values(
#{saleOrder.odrId},#{odlProductName},#{odlProductPrice},#{odlProductCount})
</insert>
*/
}
@Override
public void updateDetail(SaleOrderLine o) {
this.sqlSession.update("com.yc.dao.SaleOrderDaoMapper.updateDetail",o);
/**
<update id="updateDetail" parameterType="SaleOrderLine">
update sale_order_line set odl_product_count=#{odlProductCount} where odl_id=#{odlId}
</update>
*/
}
总结:
数据库设计:
1.两个表都需要有主键,因为就算是订单条目表
<collection property=”saleOrderLines” ofType=”SaleOrderLine”>
<id property=”odlId” column=”odl_id”>这里也需要
2.订单条目表有订单的主键,如odl_order_id对应odr_id
bean设计:
1.订单表中的引用订单条目条的体现为:集合,如这里的List<SaleOrderLine>
saleOrderLines
2.订单条目表中引用订单的体现为对象,如这里的SaleOrder saleOrder