DAO方法汇总
增加
每张表都有增加操作
删除
物理删除:购物车,收货地址
逻辑删除:类别表,商品表,用户表,订单表
订单明细表不能删,不能改
修改
类别表,商品表,用户表,订单表,购物车,收货地址,利用动态sql根据条件修改
查询
- 根据id查询单个实体:除了订单明细、购物车都需要
- 根据条件查列表:商品表、订单表、用户表、评论表
- 查询所有数据:类别表
- 根据用户ID查询:收货地址、购物车
- 特殊查询:根据价格区间查商品,根据订单id查订单项
业务方法
为了代码的后期维护,service层应当用service接口+serviceImpl实现类的方式
地址
- 添加地址
- 修改默认地址
- 删除地址
- 修改地址
- 用户查看所有地址
购物车
- 增加购物车
- 删除购物车
- 修改购物车(商品数量,商品价格)
- 查看购物车所有商品(同时查出商品名称,图片,商品价格)
类别
- 展示所有分类
- 增加新的分类
- 修改类别名
- 类别下架(同时该类别所有商品下架)
- 类别上架
商品
- 查看某一类别所有商品(分页)
- 添加新商品
- 商品上架
- 修改商品信息(价格,图片,描述,评分,是否最新,是否热卖)
- 商品下架
- 根据价格区间查商品(分页)
- 最新商品推荐(分页)
- 热卖商品推荐(分页)
- 查看单个商品详细信息
订单与订单明细
- 下订单同时添加订单明细(下单同时将相应商品库存减少,添加用户默认地址,若无则为空)
- 取消订单(将相应商品的库存恢复)
- 支付订单
- 查看订单与订单项(带出地址信息:收货人,地址,收货电话;商品信息:商品名称,商品价格)
- 修改订单信息(地址,支付方式)
- 发货
- 订单异常(无法联系收货人)
- 确认收货
- 订单结束(收货后超出期限)
- 退货
- 确认退货(退款,商品数量恢复,若由账户余额支付余额恢复)
用户
- 注册
- 登录
- 注销账户
- 冻结账户
- 修改邮箱
- 修改密码
- 修改邮箱
- 充值
自定义异常
业务异常
自定义一个异常父类(ServiceException),继承自运行时异常(RuntimeException)【运行时异常在语法上可以省略try-catch,但在业务逻辑上无法对异常做出不同反馈】。
每一个异常类都包含四个构造器:无参,参数为异常信息,参数为异常原因(Throwable类型),参数为异常信息和原因
可以通过有参构造器将异常的信息抛出给用户
业务异常列表
- 账号存在异常
- 邮箱存在异常
- 库存不足异常
- 商品下架异常
- 余额不足异常
- 账户注销异常
- 账户冻结异常
- 登录异常
- 类别下架异常
- 商品下架异常
- 商品存在异常
- 账户不存在异常
异常捕获的两种方式
- 子类业务异常先捕获,最后捕获父类异常
- 直接捕获父类异常,在处理中做判断,对不同的子类异常进行不同的反馈
MyBatis异常
MyBatis在底层数据处理中抛出的异常为PersistenceException,在业务层当处理底层数据异常,讲业务层异常向上抛
cglib动态代理
通过代理工厂的形式,在service层添加代理工厂,为上层调用时提供代理
web层(展示层)
servlet的设计
- 为了防止类爆炸,每个service对应一个servlet,而不是每个操作对应一个servlet,每个请求添加一个opr参数,参数值为请求的类型,然后在servlet中获取该参数的值来找到对应的doXXX方法,实现每一个doXXX方法即可。如:注册表单添加一个隐藏的表单项,name为opr,value为regist,在servlet中实现doRegist方法,判断opr参数的值为regist时调用doRegist方法。这样,一个方法对应一个操作,所有属于同一个service的操作写在一个servlet中,减少了大量的类的书写
- 对于主页这样数据基本没有大的改变的页面,使用Thymeleaf生成静态页面,每隔一段时间刷新一次静态页面的数据,减少服务器的压力,对于静态资源的访问可以在前端直接进行
- 前端js整合jquery,对数据的访问使用js提交请求,再交由后台处理,后台封装一个统一响应各式的实体类,包含一个响应码、一个响应信息、一个对象的引用
开发过程中遇到的问题
1. logback不打印mybatis日志
在dao层面开发时出现logback+slf4j配置完成后,mybatis的日志却没有打印,是由于logback和slf4j的jar包版本不匹配的原因,之后使用thymeleaf的时候导入的依赖中含有slf4j发现之前未打印出来的mybatis日志打印了
2. cglib代理问题
cglib中拦截器方法含有object、method、args、proxy四个参数,其中第一个参数为被代理的实例对象,第二个为拦截的方法,第三个为方法参数,第四个为生成的代理对象;cglib代理的原理是生成一个子类的增强对象proxy然后用这个对象调用父类的方法并进行完善
3. mybatis报错连接已关闭问题
对mybatis的sqlsession使用了threadlocal保证每一次操作使用的是同一个sqlsession,而之后释放时却仅仅对session进行了close并未将threadlocal中的sqlsession移除,这就造成了多个线程的sqlsession是同一个,所以当某一个线程将session关闭之后其他线程无法使用该session
4. 验证码刷新问题
直接将图片src属性指向servlet即可,同时需要传入一个随机数以免从本地缓存中直接读取
5. Thymeleaf静态化th:fragment问题
使用thymeleaf静态化时,th:fragment与th:replace是捆绑使用的,就相当于代码的拷贝,开发中发现非静态化页面无法获取静态话页面的th:fragment是由于静态化时存放数据的req是同一个所以所有静态化页面可以获取到数据,而非静态化页面并没有共享到staticServlet中的req所以未做静态化的页面没有数据
6. html文件编码问题
tomcat默认不是utf-8编码的,所以utf8编码的文件在经过服务器的访问后会乱码,当我在tomcat配置中配置为utf-8编码却发现thymeleaf的静态页面乱码了,是由于thymeleaf为配置utf-8编码导致的,所以我将所有文件都改为了gbk编码并将tomcat中的utf8编码配置去掉
7. 二进制文件上传问题
前端通过ajax上传二进制文件时,需要使用到formdata对象,通过$()[0].files[0]获取到文件然后append到formdata中,进行上传,在servlet通过part接收,注意@multipartconfig注解