商品mysql数据库

mysql数据库  时间:2021-01-29  阅读:()

第三章Qzmall电子商城系统设计1.
了解Qzmall电子商城系统基本设计思想.
2.
掌握数据库设计,掌握主键、外键的含义以及触发器的作用.
3.
理解过滤器的作用.
4.
学会数据库设计和表设计,学会设置主键、外键,学会触发器的设置.
5.
学会配置数据库连接.
6.
学会配置过滤器.
建设网上商城之前,首先要了解用户的需求,确定商城的基本功能,需要通过数据库来实现和用户进行交互的复杂的商品显示、查找、登录、购物等功能.

问题:建立一个网站商城需要有哪些表表与表之间的关系是什么第一节Qzmall电子商城系统概述一、前台购物系统(一)商品展示/搜索(1)商品查询.
根据查询条件查询所有符合条件的商品信息.
查询商品流程:用户输入查询条件并提交查询;系统根据用户提交的查询条件从数据库中查询商品并输出.

(2)商品展示.
首页显示本网站的最新商品.
(3)商品浏览.
输入需要查看信息的种类,查看该类型的所有产品.
(4)商品详情.
可以看到商品的详细信息,如商品名称、图片、价格、基本参数.

(二)购物车/订单(1)加入购物车.
注册用户可以在浏览商品的过程中,把需要购买的商品放置在一起付款,单击商品下方的"加入购物车"按钮即可把商品加入购物车.

(2)购物车查询.
用户在购物过程中可以随时查看购物车中的商品,以了解所选购的商品信息.

(3)注册用户选购商品后,在确认购买之前,可以对购物车的商品进行二次选择,既可以删除购物车中不要的商品,也可以修改购物车中的商品购买数量.

(4)在用户确认购买后,系统会为注册用户生成购物订单,注册用户可以查看自己的订单信息以了解付款信息和商品配送情况.

(5)查询、修改订单状态.
用户登录成功后,可以修改订单状态,如付款、收货等.

(6)取消订单.
用户在未付款之前,可以取消订单.
(7)订单查询.
用户登录后,可以浏览或查询本人订单.
(三)会员(1)注册.
系统考虑到用户购买信息的真实性,规定访客只能在系统中查看商品信息,不能进行商品的订购.
但是访客可以进行注册,登记相关基本信息,成为系统的注册用户.

(2)登录.
用户输入用户名及用户密码可以进行登录.
(3)信息修改.
用户登录之后修改自己的账号、密码及其他个人信息.
二、后台功能需求(一)商品分类维护管理员进入后台系统后可以对商品分类信息进行增、删、改、查.
(二)商品维护管理员进入系统后可以添加商品信息、修改已有商品信息、查询商品信息和查询某类及某件商品信息.

(三)订单订单是用户在前台购物过程中生成的,后台管理员可以对已付款订单进行订单状态修改,同时根据订单情况通知物流配送人员进行商品配送.

(四)商品库存维护商品库存会随着订单的完成而减少,管理员可以为缺货商品添加库存,并能查看单个商品的库存周转记录.

课堂技能训练:【实训操作内容】登录淘宝、京东、苏宁等购物网站,分析这些网站主要有哪些功能,并比较它们功能的异同.

【实训操作要求】必须写出每个网站相比于其他电子商务网站有哪些特色.

第二节设计并创建电子商城系统数据库本系统采用数据库管理系统MySQL管理商品、分类、会员、订单、购物车等数据.
数据库表的结构设计是应用软件中的关键部分,数据库表设计采用规范化关系模式的方法.
在关系数据库中,规范化关系模式就是要解决关系模式中存在的插入异常、删除异常、修改复杂、数据冗余等问题.
规范化的基本思想是消除数据依赖中不合适的部分,使模式中的各关系模式达到某种程度的"分离",让一个关系描述一个概念、一个实体或者实体间的一种联系,若多于一个概念就把它分离出去.

一、MySQL外键设置方式(一)cascade方式在父表上update/delete(更新或删除)记录时,同步update/delete子表的匹配记录.

(二)setnull方式在父表上update/delete记录时,将子表上匹配记录的列设为null.
要注意子表的外键列不能为notnull.
(三)noaction方式如果子表中有匹配的记录,则不允许对父表对应候选键进行update/delete操作.

(四)restrict方式同noaction,都是立即检查外键约束.
(五)setdefault方式父表有变更时,子表将外键列设置成一个默认的值,但InnoDB不支持此方式.

二、Qzmall数据库表根据系统功能描述和实际业务分析,进行Qzmall电子商城系统的设计,其主要数据及其内容如表3-1~表3-10所示.

表3-1商品大类表(category)表序号1表名category含义存储商品大类信息关联表subcatE.
shop字段名字段类型字段长度键别描述cidint(自动增长)11主键大类编号cnamevarchar30大类名称表3-2商品子类表(subcate)表序号2表名subcate含义存储商品子类信息关联表shop字段名字段类型字段长度键别描述sidint(自动增长)11主键大类编号cidint11外键(category)大类编号snamevarchar30小类名称表3-3商品信息表(shop)表序号3表名shop含义存储商品信息关联表Categorysubcate字段名类型长度键别说明pidint(自动增长)11主键商品编号cidint11外键(category)大类编号sidint11外键(subcate)小类编号shopnamevarchar40商品名称shopinfovarchar100基本信息pricefloat8,1价格stockint11库存shopdatevarchar20上架时间image1varchar100图片1image2varchar100图片2image3varchar100图片3descriptionvarchar2000说明表3-4订单主表(orders)表序号4表名orders含义存储订单主要信息关联表user字段名类型长度键别说明orderIdvarchar20主键订单编号usernamevarchar30外键(user)会员名truenamevarchar40真实姓名postcodevarchar6邮编addtimevarchar20时间phonevarchar11手机addressvarchar100数量sumfloat8,1总价stateint1订单状态表3-5订单明细表(ordersitem)表序号5表名ordersitem含义存储订单明细信息关联表Ordersshop字段名类型长度键别说明oidint(自动增长)11主键编号orderIdvarchar20外键(orders)订单编号续表字段名类型长度键别说明pidint11外键(shop)商品编号shopnamevarchar40商品名称pricefloat100售价shopnumint11数量表3-6用户信息表(user)表序号6表名user含义存储用户明细信息关联表字段名类型长度键别说明usernamevarchar30主键编号passwordvarchar50支付方式truenamevarchar20真实姓名postcodevarchar6邮编adddatevarchar20时间phonevarchar11手机addressvarchar100数量pointint11积分questionvarchar10密保问题birthdayvarchar10生日answervarchar30答案表3-7广告表(ad)表序号7表名ad含义存储广告关联表subcate字段名字段类型字段长度键别描述aidint(自动增长)11主键广告编号sidint11外键大类编号aimagevarchar30广告图片atimebigint20上架时间表3-8会员积分表(point)表序号8表名point含义存储会员积分记录关联表user字段名字段类型字段长度键别描述pointidint(自动增长)11主键编号usernamevarchar30外键会员名orderIdvarchar20外键订单编号pointtimebigint20积分时间descriptionvarchar100积分说明表3-9商品库存记录表(stockitem)表序号9表名stockitem含义存储商品库存记录关联表shop字段名字段类型字段长度键别描述stockidint(自动增长)11主键库存编号pidint11外键商品编号numint11数量pricefloat8,1价格stocktimebigint20时间表3-10管理员(admin)表序号10表名admin含义存储商品大类信息关联表字段名字段类型字段长度键别描述anamevarchar20主键管理员信息apassvarchar30密码三、设置触发器表:point类型:插入描述本表插入记录的同时,更新user表的point字段值begindeclarecint;setc=(selectpointfromuserwhereusername=new.
username);updateusersetpoint=c+new.
mypointwhereusername=new.
username;end类型:删除描述本表删除记录的同时,更新user表的point字段值begindeclarecint;setc=(selectpointfromuserwhereusername=old.
username);updateusersetpoint=c-old.
mypointwhereusername=old.
username;end表:stockitem触发器名称:adstockItem类型:插入描述插入记录的同时,商品表对应商品的库存应增加同样的数量begindeclarecint;setc=(selectstockfromshopwherepid=new.
pid);updateshopsetstock=c+new.
shopnumwherepid=new.
pid;end触发器名称:destockItem类型:删除描述删除记录的同时,商品表对应商品的库存应减少同样的数量begindeclarecint;setc=(selectstockfromshopwherepid=old.
pid);updateshopsetstock=c-old.
shopnumwherepid=old.
pid;End小提示:利用navcatformysql添加触发器打开Qzmall数据库后,右击表point,单击"触发器"标签,再单击"添加触发器"按钮,输入触发器名称,选择触发方式,然后在"定义"文本框中输入触发器内容即可,如图3-1所示.

图3-1添加触发器课堂技能训练:【实训操作内容】利用navcatformysql数据库操作可视化工具,建立Qzmall数据库.
【实训操作要求】(1)设置每个表的主键、字段类型及其长度.
(2)建立表与表之间的关系(主键、外键约束).
(3)建立触发器(为stockitem表建立触发器,即在增加商品库存记录时,shop表中库存数量能够一并更新).

第三节电子商城详细设计一、实体类设计编写Qzmall商城实体类时应注意以下问题.
(1)实体类的名字尽量和数据库表的名字对应相同.
(2)实体类应实现java.
io.
Serializable接口.
(3)实体类一般有无参和在参的构造方法.
(4)实体类有属性和方法,属性对应数据库中表的字段,主要有getter和setter方法.

(5)属性一般是private类型,方法一般是public类型,对于数据库自动生成的ID字段对应的属性的set方法应为private.

实体类放在com.
qzmall.
entity包下,各个实体类的代码如下://大类表(category)对应的实体类publicclassCategory{privateintcid;//大类编号privateStringcname;//大类名称privateArrayListsubCates=newArrayList(0);//和子类表建立对应关系privateArrayListshopArrayList=newArrayList(0);//和商品表建立对应关系//set、get方法略}//子类表(subcate)对应的实体类publicclassSubCate{privateintsid;//子类编号privateCategorycategory;//商品大类privateStringsname;//小类名称privateSetshops=newHashSet(0);//和商品表建立对应关系//set、get方法略}//商品表(shop)对应的实体类publicclassShop{publicShop(privateintpid;//商品IprivateCategorycategory;//商品大类privateSubCatesubCate;//商品子类privateStringshopname;//商品名称privateStringshopinfo;//商品信息privateFloatprice;//价格privateintstock;//库存privateStringshopdate;//上架日期privateStringimage1;//图片1privateStringimage2;//图片2privateStringimage3;//图片3privateStringdescription;//详细信息//set、get方法略}//用户表(user)对应的实体类publicclassUser{publicUser(privateStringusername;//登录账号privateStringpassword;//登录密码(MD5加密)privateStringtruename;//真实姓名privateStringbirthday;//出生日期privateStringadddate;//注册时间privateintquestion;//请输入密码问题privateStringanswer;//密码问题答案privateStringphone;//手机privateStringpostcode;//邮编privateStringaddress;//地址privateintpoint;//积分//set、get方法略}//订单主表(orders)对应的实体类publicclassOrders{privateStringorderId;//订单编号privateStringusername;//订单用户名privateStringtruename;//真实姓名privateStringaddress;//地址privateStringphone;//手机号码privateStringpostcode;//邮编privateStringaddtime;//订单时间privatefloatsum;//金额privateintstate;//订单状态//set、get方法略}//订单明细表(ordersitem)对应的实体类publicclassOrdersItem{privateintoid;//订单明细编号privateStringorderId;//订单编号privateintpid;//商品编号privateStringshopname;//商品名称privatefloatprice;//商品价格privateintshopnum;//商品数量//set、get方法略}小提示:利用IntelliJIDEA在实体类中插入set、get方法非常方便右击类的空白处,选择Generate选项,然后出现Generate面板,选择Getter和Setter选项,如图3-2所示,选择想要生成get、set方法的属性,单击OK按钮,即可自动生成get和set方法.

图3-2为实体类属性添加set和get方法二、定义数据库的连接类、查询方法下面介绍如何定义数据库的连接类、查询方法.
代码如下://数据库连接管理类ConnectionManager.
javapackagecom.
qzmall.
db;importjava.
sql.
Connection;importjava.
sql.
SQLException;importcom.
mchange.
v2.
c3p0.
ComboPooledDataSource;importcom.
mchange.
v2.
c3p0.
DataSources;publicclassConnectionManager{privatestaticConnectionManagerinstance;//C3P0的连接池对象privateComboPooledDataSourceds;privateConnectionManager()throwsException{ds=newComboPooledDataSource("mysql");}//单例模式获取数据库连接对象publicstaticfinalConnectionManagergetInstance(){if(instance==null){try{instance=newConnectionManager();}catch(Exceptione){e.
printStackTrace();}}returninstance;}//为了线程安全,同步publicsynchronizedfinalConnectiongetConnection(){try{returnds.
getConnection();}catch(SQLExceptione){e.
printStackTrace();}returnnull;}@Overrideprotectedvoidfinalize()throwsThrowable{DataSources.
destroy(ds);//关闭datasourcesuper.
finalize();}}//数据库操作类DBUtil.
javapackagecom.
qzmall.
db;importjava.
sql.
Connection;importjava.
sql.
PreparedStatement;importjava.
sql.
ResultSet;importjava.
sql.
SQLException;publicclassDBUtil{/*从C3P0数据库连接池中获取数据库连接对象*/publicstaticConnectiongetConnection(){Connectionconn=null;try{//从数据连接池中获取数据库连接对象conn=ConnectionManager.
getInstance().
getConnection();}catch(Exceptione){e.
printStackTrace();}returnconn;}//释放资源publicstaticvoidclose(Connectionconnection,PreparedStatementpsmtStatement,ResultSetresultSet){try{if(resultSet!
=null){resultSet.
close();}if(psmtStatement!
=null){psmtStatement.
close();}if(connection!
=null){connection.
close();}}catch(Exceptione){e.
printStackTrace();}}//增、删、改的通用方法publicstaticintexecuteUpdate(Stringsql,Object.
.
.
objects){intresult=0;Connectionconn=null;PreparedStatementpsmt=null;try{conn=getConnection();psmt=conn.
prepareStatement(sql);if(objects!
=null){for(inti=0;ilogin_page/login.
jspvalidateLogncom.
qzmall.
filter.
ValidateFiltervalidateLogn/cart.
jsp【代码说明】在上述代码中,方法doFilter设置和请求的session对象user不能为空,同时设置cart.
jsp页面需要经过上述过滤器来处理.
如果user为空,要转向login.
jsp页面,要求用户登录.

小提示:在使用Servlet3.
0以上版本时,配置过滤器和servlet都可以采用注解的方式,比如上述的CharsetEncodingFilter,可以在过滤方法前加上下面一段注解:@WebFilter(filterName="CharsetEncodingFilter",urlPatterns="/*")这样,就没有必要再在web.
xml中进行此过滤器配置了.
同时,配置servlet时,也可以采用注解的方式,但必须保证是Servlet3.
0以上版本.
但对于用户过滤器validateLogn,需要控制的页面是有选择的,所以我们还把它统一配置在web.
xml中.

【知识拓展】过滤器在系统应用中很常见.
比如在银行系统中,客户不小心把银行卡丢了,需要挂失银行卡.
只要挂失银行卡,在银行系统中就不能访问这张银行卡了,这样有效地保护了客户账户的安全.
这个时候就可以用过滤器来做这个应用.

课后训练一、选择题1.
客户端发送请求后,Java过滤器对请求的工作流程包括以下四项:(1)进行请求预处理;(2)对响应后的请求做后处理;(3)调用servlet.
service()对请求进行处理;(4)将响应结果返回给客户端.
其中为正确执行顺序的是().
A.
(1)(2)(3)(4)B.
(3)(2)(1)(4)C.
(3)(1)(2)(4)D.
(1)(3)(2)(4)2.
使用Servlet过滤器,需要在web.
xml中配置()元素.
A.
B.
C.
D.
3.
servlet过滤器参数初始化,需要在web.
xml的filter元素下配置()元素.
A.
B.
C.
D.
4.
相关代码如下:UrlSecurityFiltercom.
qzmall.
filter.
UrlSecurityFilterCoursewarePrivFilter/courseware/*REQUESTINCLUDE过滤器配置中,有request和include两种方式的配置,如果此时courseware目录下的目标页面可以forward方式被调用,请问UrlSecurityFilter过滤器会不会被调用()A.
再增加一个项,配置为error,就会被调用B.
再增加一个项,配置为forward,就会被调用C.
不确定D.
不会5.
通过过滤器实现编码的统一,可以通过过滤器类在doFilter方法下,设置()代码.
A.
response.
setCharacterEncoding("UTF-8")B.
request.
setCharacterEncoding("UTF-8")C.
response.
setCharacterEncoding("UTF-8")D.
request.
getCharacterEncoding("UTF-8")6.
以下是关于Filter生命周期的描述,横线处分别调用了哪个方法()(1)Web应用加载后会立即创建出当前Web应用中的Filter对象;(2)创建后,立即调用________方法进行初始化操作;(3)当关闭Web容器,关机,或者reload整个应用时,会调用_______方法来关闭Filter.
也就是说,当Web容器启动时,Filter就被加载到内存,并在销毁之前都常驻内存.

A.
destroy(),init(B.
doFilter(),destroy()C.
init(),doFilter()D.
init(),destroy()7.
以下哪个操作不是Java过滤器完成的()A.
完成用户请求B.
字符编码处理C.
权限访问控制D.
压缩响应信息8.
编写Servlet过滤器时,()方法用于调用过滤器链中的下一个过滤器.
A.
ServletB.
FilterConfigC.
FilterD.
FilterChain9.
publicclassSecurityFilter_如果想要让该类成为一个过滤器,横线处应为().
A.
implementsHttpFilterB.
extendsFilterC.
implementsFilterD.
extendsHttpFilter10.
下面哪个方法当服务器关闭时被调用,用来释放Servlet所占的资源()A.
service()B.
init()C.
doPost()D.
destroy()11.
在Java中开发JDBC应用程序时使用()类的getConnection()方法可以获取Connection连接对象.
A.
DBManagerB.
DriverManagerC.
DBHelperD.
PreparedStatement12.
在进行Web开发时经常会遇到中文乱码的问题,可以在JSP页面中解决乱码的方式是().
A.
B.
C.
D.
13.
在Web项目的目录结构中,web.
xml文件位于()中.
A.
src目录B.
文档根目录C.
META-INF目录D.
WEB-INF目录二、实际操作题1.
利用navcatformysql数据库操作可视化工具,建立Qzmall数据库,按照第二节的实例,把所有表都添加进去,并设置好各个表之间的主键、外键约束,按照要求建立触发器.

乌云数据(10/月),香港cera 1核1G 10M带宽/美国cera 8核8G10M

乌云数据主营高性价比国内外云服务器,物理机,本着机器为主服务为辅的运营理念,将客户的体验放在第一位,提供性价比最高的云服务器,帮助各位站长上云,同时我们深知新人站长的不易,特此提供永久免费虚拟主机,已提供两年之久,帮助了上万名站长从零上云官网:https://wuvps.cn迎国庆豪礼一多款机型史上最低价,续费不加价 尽在wuvps.cn香港cera机房,香港沙田机房,超低延迟CN2线路地区CPU...

RAKsmart秒杀服务器$30/月,洛杉矶/圣何塞/香港/日本站群特价

RAKsmart发布了9月份优惠促销活动,从9月1日~9月30日期间,爆款美国服务器每日限量抢购最低$30.62-$46/月起,洛杉矶/圣何塞/香港/日本站群大量补货特价销售,美国1-10Gbps大带宽不限流量服务器低价热卖等。RAKsmart是一家华人运营的国外主机商,提供的产品包括独立服务器租用和VPS等,可选数据中心包括美国加州圣何塞、洛杉矶、中国香港、韩国、日本、荷兰等国家和地区数据中心(...

SugarHosts糖果主机六折 云服务器五折

也有在上个月介绍到糖果主机商12周年的促销活动,我有看到不少的朋友还是选择他们家的香港虚拟主机和美国虚拟主机比较多,同时有一个网友有联系到推荐入门的个人网站主机,最后建议他选择糖果主机的迷你主机方案,适合单个站点的。这次商家又推出所谓的秋季活动促销,这里一并整理看看这个服务商在秋季活动中有哪些值得选择的主机方案,比如虚拟主机最低可以享受六折,云服务器可以享受五折优惠。 官网地址:糖果主机秋季活动促...

mysql数据库为你推荐
桌面背景图片风景有没有高清唯美天然风景电脑桌面壁纸莫代尔和纯棉哪个好内裤是莫代尔的好还是棉质的好?理由是什么音乐播放器哪个好最好的音乐播放器是什么二手车网站哪个好二手车交易网哪个好?炒股软件哪个好网上买卖股票软件哪个好用willyunlee求几近完美演员表,几近完美女主角几近完美男主角是谁?dns服务器故障DNS服务异常是什么意思360云盘360云盘有多大?360云盘怎么用360云盘怎么用360云盘36t请问360云盘容量为什么最低有36T,其他IT行业的云盘都最多就2T?
美国域名注册 域名注册godaddy vps侦探 域名服务器上存放着internet主机的 工信部域名备案系统 独享100m gateone 美国php空间 新站长网 上海域名 韩国名字大全 台湾谷歌 彩虹云 防cc攻击 杭州电信宽带优惠 服务器防御 hdchina japanese50m咸熟 此网页包含的内容将不使用安全的https 火山互联 更多