文章目录
简介
上一篇完成了有点复杂的图书管理,现在开始最后一部分(也是关系相对复杂的一部分……)
销售记录关系分析
先明确两个表的作用(见第一篇:关系型数据表的设计)
- t_sale_record表(简称SR表):存放销售记录日期
- t_book_sale_record表(简称BSR表):存放某本书的销售记录,包括对应书本(外键),对应日期(外键),销售量
- 其中,某本书的销售记录包括两个外键,同样要为他们设置引用类型成员变量(参考上一篇:图书管理)
- 销售记录日期与某本书的销售记录是一对多的关系(即一次交易多本不同的书),所以还需要根据销售记录日期查询某一时期的交易记录。
- 除此之外,由于很多数据需要实时根据查询来计算得出,所以还应该为SaleRecord设置其他的成员变量(如交易总数,总额,所有书名等)
理清思路就用了大半天,准备大概就绪,接下来开始行动
数据访问层接口SaleRecordDao
代码如下
package dao;
import database.*;
import java.util.Collection;
public interface SaleRecordDao {
//得到所有销售记录日期
Collection<SaleRecord> findAll() throws Exception;
//模糊日期(实质还是字符串)查询
Collection<SaleRecord> findByDate(String date) throws Exception;
//id查询
SaleRecord findById(String id) throws Exception;
//添加交易日期
SaleRecord addOrUpdate(SaleRecord saleRecord) throws Exception;
}
- findByDate:相当于名称模糊查询
- 剩下方法与以前图书管理基本相同,可以参考上一篇
数据访问层实现类SaleRecordDaoImpl
package dao;
import database.SaleRecord;
import java.util.ArrayList;
import java.util.Collection;
public class SaleRecordDaoImpl extends CommonDaoImpl implements SaleRecordDao {
@Override
public Collection<SaleRecord> findAll() throws Exception {
String sql = "select * from t_sale_record";
return getDatas(sql,new ArrayList(),SaleRecord.class);
}
@Override
public Collection<SaleRecord> findByDate(String date) throws Exception {
String sql = "select * from t_sale_record sr where sr.record_date like '" +
date + "%'";
return getDatas(sql,new ArrayList(),SaleRecord.class);
}
@Override
public SaleRecord findById(String id) throws Exception {
String sql = "select * from t_sale_record sr where sr.id = '" + id + "'";
return getSingle(sql);
}
@Override
public SaleRecord addOrUpdate(SaleRecord sr) throws Exception {
boolean flag = false;
String sql = null;
String id = null;
Collection<SaleRecord> saleRecords = findAll();
for (SaleRecord saleRecord : saleRecords){
if(saleRecord.getRecord_date().equals(sr.getRecord_date())){
flag = true;
id = saleRecord.getId();
}
}
if (flag){
sql = "update t_sale_record sr set sr.record_date = '" + sr.getRecord_date() +
"' where sr.record_date = '" + sr.getRecord_date() + "'";
getJDBCExector().executeUpdate(sql);
}else {
sql = "insert into t_sale_record values(null,'" + sr.getRecord_date() + "')";
id = String.valueOf(getJDBCExector().executeUpdate(sql));
}
return findById(id);
}
private SaleRecord getSingle(String sql) throws Exception{
SaleRecord result = null;
for (Object s : getDatas(sql, new ArrayList(),SaleRecord.class)){
result = (SaleRecord)s;
}
return result;
}
}
可以看到相当于原木原样照搬图书管理部分,根据逻辑自己编写
获得SR表数据之后,就要开始获取相对的多个BSR表数据了
数据访问接口BookSaleRecordDao
代码如下
package dao;
import database.Book;
import database.BookSaleRecord;
import java.util.Collection;
public interface BookSaleRecordDao {
//根据外键id = 销售记录id,在从表中查询记录(一个销售日期对应多个销售记录)
Collection<BookSaleRecord> findBySaleRecordId(String saleRecordId)
throws Exception;
//id查询
BookSaleRecord findById(String id) throws Exception;
//添加(修改)单个书的交易记录
BookSaleRecord addOrUpdate(BookSaleRecord bookSaleRecord) throws Exception;
}
- 其中比较重要的是findBySaleRecordId方法,根据SR表id查询出BSR表数据,实现一对多查询
- 剩下两个方法作用之前也介绍过,不再赘述
接下来看实现
数据访问层实现类BookSaleRecordDaoImpl
先来看BookSaleRecord类的构造器
public BookSaleRecord(Book book,SaleRecord saleRecord,String trade_sum){
this.book = book;
this.saleRecord = saleRecord;
this.trade_sum = trade_sum;
}
直接传入引用类型变量 ,接下来是实现类代码
package dao;
import database.*;
import java.util.*;
public class BookSaleRecordDaoImpl extends CommonDaoImpl implements BookSaleRecordDao{
@Override
public Collection<BookSaleRecord> findBySaleRecordId(String saleRecordId)
throws Exception
{
String sql = "select * from t_book_sale_record r where r.t_sale_record_id_fk = '" +
saleRecordId + "'";
return getDatas(sql,new ArrayList(),BookSaleRecord.class);
}
@Override
public BookSaleRecord findById(String id) throws Exception {
String sql = "select * from t_book_sale_record r where r.id = '" + id + "'";
return getSigle(sql);
}
@Override
public BookSaleRecord addOrUpdate(BookSaleRecord bsr) throws Exception {
Book b = bsr.getBook();
bsr.setBook_id_fk(new BookDaoImpl().addOrUpdate(b).getId());
SaleRecord sr = bsr.getSaleRecord();
//得到SR表的id
String srId = new SaleRecordDaoImpl().addOrUpdate(sr).getId();
bsr.setT_sale_record_id_fk(srId);
boolean flag = false;
String sql = null;
String id = null;
//根据SR表id查询
Collection<BookSaleRecord> bookSaleRecords = findBySaleRecordId(srId);
for (BookSaleRecord bookSaleRecord : bookSaleRecords){
//根据书判断相等
if (bookSaleRecord.getBook_id_fk().equals(bsr.getBook_id_fk())){
flag = true;
id = bookSaleRecord.getId();
}
}
if(flag){
sql = "update t_book_sale_record r set r.book_id_fk = '" + bsr.getBook_id_fk() +
"', r.t_sale_record_id_fk = '" + bsr.getT_sale_record_id_fk() + "'," +
" r.trade_sum = '" + bsr.getTrade_sum() + "'where r.id = '" + id + "'";
getJDBCExector().executeUpdate(sql);
}
else {
sql = "insert into t_book_sale_record values(null,'" + bsr.getBook_id_fk() +
"','" + bsr.getT_sale_record_id_fk() + "','" + bsr.getTrade_sum() + "')";
id = String.valueOf(getJDBCExector().executeUpdate(sql));
}
return findById(id);
}
private BookSaleRecord getSigle(String sql) throws Exception{
BookSaleRecord result = null;
for (Object b : getDatas(sql,new ArrayList(),BookSaleRecord.class)){
result = (BookSaleRecord)b;
}
return result;
}
}
-addOrUpdate: 这里对于这两个引用类型变量直接插入,然后根据书外键判断是否存在该书的交易记录,然后执行相应的操作
也是根据图书管理的模板来写
表现层测试
测试代码如下
BookSaleRecord bsr = m.saleRecordService.addOrUpdate(new BookSaleRecord(
new Book("新增书100","新增的书本","20",
"新增种类100","新增出版社100",
".\\out\\网易云看板娘.jpg","cs"),
new SaleRecord("2019-04-02 21:00:57"),
"24"));
System.out.println(bsr.getBook_id_fk());
在这里可以看到传入的三个具体参数
小结
还有入库管理一部分,与该部分相差不多,这个小项目也算是搞定了,没有界面所以对参数要求很苛刻,难在设计,与需求