基于SSM模仿Tmall平台

前言:首先这个项目是基于网站http://www.how2j.com

参考而完成的一个学习项目,仅供学习参考。



项目源码地址:

首先该项目技术框架是由Spring + Spring MVC + Mybatis构成的,学习几个框架的集合是对Spring基础有更好的掌握。

首先该项目专注于后端,前端页面已经提供了JSP编写好的页面,只需要专注于后端的数据和业务逻辑实现。


项目的数据库架构:

数据库表与表之间的关系:

数据库中表的含义:


而表与表之间是存在需要一对多和多对多的关系,这里展示的是

一对于与多对一的关系:


接下来便是编写关于设计好的数据库关系的SQL语句

···

CREATE DATABASE tmall_ssm DEFAULT CHARACTER SET utf8;

···

默认编码方式为UTF8,更好的实现中文显示的问题;

在目录下有tmll_ssm.sql的数据库SQL文件,右键-编辑便可查看到详细设计数据库SQL语句。(请勿使用数据库客户端演示工具导入该表,因表里的对象过多可能会造成卡死,建议使用cmd的方式导入)



项目架构:

仅限于个人理解


第一步首先关注Dao数据持久层,第二步编写Service层接口,再编写ServiceImpl调用接口,第三步再关注Controller层。

不难想象,无非就是一个用户访问网站时第一步是Spring MVC框架进行封装的控制层进行拦截并控制处理,然后再调用相应的Service层实现业务逻辑,而Service层采用注解@Autowired进行注入,数据存储方面则由Mybatis框架封装成的数据库层,对于数据库的操作更加便捷!因为这个项目是Maven项目,对应的包我已经在源码里面的pomxml文件里已经添加好了依赖和插件可以自行查看。

首先是完成实体类的开发,以下以Category类为例:

Pojo:

Category类

这些字段都是数据库内存在的字段



订单实体类


这些是定义来用支持前台展示商品和后台展示分类管理所需要的字段,是用来帮助项目实现业务逻辑的,但这样设计实体类实际上是存在一个缺点的,那就是实体类之间的耦合度太高,一旦某一类表发生改变时,与之相关联的表也要发生改动,所以后续的改进应该是把实体类之间的 耦合度降低。

实体类开发好后我们需要关注的Mybatis框架的相关配置了。

Mybatis配置:

相应的注释在源码里面已经写得很清楚了

Mybatis相应的配置


resource目录下的jdbc.properties文件


事务管理的配置


log4j日志管理

此外项目还用了log4j日志管理,对应跟踪。

接下来便是Spring MVC的配置了

Spring MVC配置


Spring MVC配置图

相应的注释已经在上面写好了

Mybatis Mapper:

接下来就是我们开发Mybatis的时候了,其实一开始我 用Mybatis的时候也是很酸爽的,需要自己配置好Mapper.xml,手写SQL语句,里面还有很多动态的SQL语句,就令人很蛋疼,再去开发Mapper.java的时候就特别的繁琐,不过好处还是很多的,让我更加熟悉了SQL操作语句,但是对于繁琐的项目开发时,这时候就应该使用一些“小工具”了。很多人觉得pojo目录里面多了很多“Example”是什么意思,其实这是Mybatis里面的逆向工程。


resource目录下的文件

我们看到generatorConfig.xml这个文件,里面涉及了很多连接数据库之类的配置,这玩意就是逆向工程的配置,只要存在数据库对应的表和字段,它就会自动生成pojo实体类,Mapper.xml文件的配置,Mapper.java的接口,听起来就很强大,它已经帮我们在Mapper.xml里面编写好了对应的SQL操作语句

帮我们做了很多繁琐而重复的工作,但这玩意还是牺牲了一些性能的,配置了很多我们可以实际中用不上的东西,但作为轻量级应用,使用逆向工程帮我们干一些事还是很酸爽的!


在util包的MybatisGenerator.java便是完成逆向工程的实现,而这款工具似乎现在也停止更新了,但拿来重构一下Dao层还是很酸爽的。

Service层开发:

完成了Dao层的开发之后,我们开始设计我们的Service层,以Category为例:


首先设计Service层的接口,把我们需要的方法先写成接口。

然后创建CategoryServiceImpl.java

实现我们的Service接口


需要在类上面写上@Service表明这是一个Service,然后使用Autowired注入我们已经使用逆向工程生成的Mapper类,拿到这个Mapper类,基本上我们想要什么数据,就是手到擒来的事。


因为我们从数据库中并不是直接一顿操作Select就完事了,所以这时候的CategoryExample就是逆向工程生成出来帮助我们完成Where XXXX的工作了,这里我们要实现的方法是list返回分类的List,所以我们new一个Example的类然后SetOrderByclause就完成了 Where order by id desc,然后再返回categoryMapper里面的SelectByExample的方法。剩下的也是一样的操作。

然后我们关注到API的实现,即是Controller层。

Controller层开发:

我们以CategoryController为例


CategoryController

实现在类的上方@Controller这是一个Controller,然后我们@Autowired装配CategoryService,而这个CatgoryService已经在impl内已经实现好了方法了,所以当我们拿到这个categoryservice的时候已经帮我们把里面的东西实现好了,所以Controller这里并不用关心Service层干嘛,只需要把用户请求的@requestMapping转进来我们写的方法就行了,Controller就使用了一个PageHelper的工具完成了Page的分页,我们在util包里面编写了一个Page的分页,默认条数为5,从0开始,分页配置好我们再从categoryservice里面拿到关于category的数据,并设立了一个total的变量拿到了category的总数量,将total放进page的参数里,page就已经配置好了它应该要怎么分页的工作,然后将我们传进来的page方法搞定好了,还有一个model便是客户应用,我们用model.addAttritube方法将前端所需要的参数cs和page添加到Attritube去,然后return到这个前端页面去,前端页面是由JSP编写好的,拿到这个Attritube后它会按照构建好的页面放数据库,然后通过传输层的TCP协议将IP数据报发送到了用户的手里,浏览器一解析,这一个查询的页面便展示在客户的眼睛里。

这便完成了一个简单的操作,其实接下来的操作都是和这个类似的,Controller作为老大,从Service那里命令服务层你去帮我拿一些我需要的数据库,而Service则命令Dao层中的Mapper去数据库那里取数据库,返回到Controller,当Controller拿到数据之后,就开始进行一些处理类似分页的功能,然后将数据给到Attritube并返回编写好的JS页面。其实现在一般都是前后端分离的趋势,利用JSON通过RESTful接口进行数据交互,把数据处理的工作交给前端去搞定,后端就负责编写数据交互的接口并将数据以JSON的格式传输。接下里我还会继续分析其他功能模块是如何进行工作的,但原理跟Category并没有什么不同。

另外Spring框架最核心的便是AOP(切面编程),IOC(控制反转)和依赖注入的思想,AOP可以用来完成网站的一些“辅助功能”,IOC便将对象的控制权给了Spring,需要时便向Spring拿,并不是自己一个劲的new对象。

你可能感兴趣的:(基于SSM模仿Tmall平台)