商品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数据库,按照第二节的实例,把所有表都添加进去,并设置好各个表之间的主键、外键约束,按照要求建立触发器.

Fiberia.io:$2.9/月KVM-4GB/50GB/2TB/荷兰机房

Fiberia.io是个新站,跟ViridWeb.com同一家公司的,主要提供基于KVM架构的VPS主机,数据中心在荷兰Dronten。商家的主机价格不算贵,比如4GB内存套餐每月2.9美元起,采用SSD硬盘,1Gbps网络端口,提供IPv4+IPv6,支持PayPal付款,有7天退款承诺,感兴趣的可以试一试,年付有优惠但建议月付为宜。下面列出几款主机配置信息。CPU:1core内存:4GB硬盘:...

totyun:香港cn2 vps,5折优惠,$6/月,10Mbps带宽,不限流量,2G内存/2核/20g+50g

totyun,新公司,主要运作香港vps、日本vps业务,接入cn2网络,不限制流量!VPS基于KVM虚拟,采用系统盘和数据盘分离,从4G内存开始支持Windows系统...大家注意下,网络分“Premium China”、“Global”,由于站长尚未测试,所以也还不清楚情况,有喜欢吃螃蟹的尝试过不妨告诉下站长。官方网站:https://totyun.com一次性5折优惠码:X4QTYVNB3P...

DMIT(季度$28.88)调整洛杉矶CN2 GIA优化端口

对于DMIT商家已经关注有一些时候,看到不少的隔壁朋友们都有分享到,但是这篇还是我第一次分享这个服务商。根据看介绍,DMIT是一家成立于2017年的美国商家,据说是由几位留美学生创立的,数据中心位于香港、伯力G-Core和洛杉矶,主打香港CN2直连云服务器、美国CN2直连云服务器产品。最近看到DMIT商家有对洛杉矶CN2 GIA VPS端口进行了升级,不过价格没有变化,依然是季付28.88美元起。...

mysql数据库为你推荐
桌面背景图片淡雅为什么好看的图片用来做桌面背景图就会很模糊?美国10次啦导航GPS的四大导航骁龙750g和765g哪个好骁龙765G,这里的g是什么意思?苹果x和xr哪个好苹果x,苹果xs,苹果xr,苹果xs max哪个更值得买?小说软件哪个好用免费现在看小说用什么软件好,不用钱的,二手车网站哪个好想买台二手车,哪个二手车网站靠谱手机管家哪个好手机管家和腾讯手机管家哪个好用p图软件哪个好有什么P图工具比较好用飞信空间登录怎样在网上登陆飞信qq空间登录网站QQ空间打开需要输入用户名和密码,下面是正在连接一个网址和领域网址
美国主机租用 vps服务器租用 万网域名解析 精品网 10t等于多少g 68.168.16.150 网站监控 浙江独立 服务器维护方案 softbank邮箱 135邮箱 国外代理服务器地址 可外链网盘 国外代理服务器软件 可外链相册 网络空间租赁 爱奇艺vip免费领取 vip域名 防cc攻击 114dns 更多