订单与订单条目的一个实现

数据库设计

--创建订单表
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

猜你喜欢

转载自blog.csdn.net/qq_22771739/article/details/81391987
今日推荐