JT_01 项目背景+搭建框架+分类查询

1.1 电商行业现状

1.1.1 特点

与传统企业应用系统相比,大型互联网应用系统有以下特点:
·  分布式
数十台服务器,甚至百台、千台、万台,包括:Nigix负载均衡集群、TomcatWeb中间件集群、Redis缓存集群、RabbitMQ消息队列集群、MySQL主从、Solr全文检索集群等。
·  高并发、大流量
要面对高并发用户,大流量访问。Google日均PV数35亿,日均IP访问数3亿。腾讯QQ最大在线人数1.4亿。淘宝2012年“双十一”活动一天交易额超过191亿,活动开始第一分钟独立访问用户达1000万。2015年,活动当前交易额975亿。
·高可用
系统7X24小时不间断运行。大型互联网网站宕机事件通常会成为新闻焦点。如2010年百度域名被黑客劫持导致不能访问,带来不可估量的经济损失。
·  海量数据
需要存储、管理海量数据,需要使用大量服务器。facebook每周上传的照片数量近10亿,百度收录的网页数量数百亿,Google有近百万台服务器为全球用户提供服务。
·  业务特殊
网站访问特点和生活中一样遵循二八定律:80%的业务访问集中在20%的数据上。淘宝买家浏览的商品集中在少部分成交数多、评价良好的商品上。百度搜索关键字集中在少数部分热门词汇上。只有经常登录的用户才会发微博、看微博,而这部分用户只占总用户数的一小部分。

1.1.2 JT商城简介

1)JT网上商城是一个综合性的B2C平台,类似京东商城、天猫商城。
2)会员可以在商城浏览商品、下订单,以及参加各种活动。
3)商家可以入驻京淘商城,在该平台上开店出售自己的商品,并且得到京淘商城提供的可靠服务。
4)管理员、运营人员可以在后台管理系统中管理商品、订单、会员等。

5)客服人员可以在后台管理系统中处理用户的询问和投诉。


1.2 项目介绍

1.2.1 JT架构图

JT_01 项目背景+搭建框架+分类查询_第1张图片

1.2.2 网络架构图

JT_01 项目背景+搭建框架+分类查询_第2张图片

1.2.3 各系统核心业务说明

整个工程分为8个工程,细分为26个子工程。
1 jt-web 前台商城系统:用户可以访问商城首界面,查看不同分类下的商品,浏览商品的详细信息,并可以查询商品,将商品加入购物车,最终提交订单,还包括用户注册和登录。
2 jt-manage 后台管理系统:商品分类管理、商品信息管理、商品规格属性、注册用户管理以及CMS内容发布管理等功能。
包括:jt-manage-mapper/pojo/service/web四个子项目
3 jt-cart 购物车系统:未登录商品选择,登录商品选择,修改商品数量,计算支付金额,下单提交到订单系统。
4 jt-order 订单系统:提供下单、查询订单、修改订单状态、定时处理订单。
5 jt-search 搜索系统:提供商品的搜索功能。
支撑子系统
6 jt-parent jar包依赖管理
7 jt-common 公用工具类
8 jt-sso 单点登录系统:为多个系统之间提供用户登录凭证以及查询登录用户的信息。


1.3 系统设计

1.3.1开发工具和环境

Windows7/CentOS 5.6
Power Designer 15.6
Eclipse Mars Release 4.5.0
JDK 1.7 必须。一些高级应用需要高版本支持
Maven 3.3.1
Tomcat 7.0.59
Nginx 1.9.0
Redis 2.8.9
MySQL 5.6 + Amoeba

1.3.2系统架构图

 JT_01 项目背景+搭建框架+分类查询_第3张图片
整个系统采用大型项目开发方式,使用maven继承和聚合,形成多个子项目,方便团队开发、调试和一键部署。使用主流大型项目框架SpringMVC+Spring+Mybatis,采用MySQL数据库集群。基于通用Mapper技术,使用SysMapper实现单表CRUD操作完全封装,用户无需写单表的“任何”SQL语句。各层采用包扫描机制,自动发现新的类。利用注解方式,实现各层之间类的调用。页面通过ajax get/post方式提交数据,通过springMVC从页面直接获得参数。采用jackson技术,将对象转换为json字符串,实现各子系统之间的数据的无缝传递。返回对象为获取更丰富的信息,采用SysResult对象封装页面所需要的数据和提示信息,页面通过JSTL进行解析。后台系统采用easyUI,除了SysResult还采用EasyUIResult对象。


1.4 搭建Maven环境

1.4.1Maven项目管理结构

JT_01 项目背景+搭建框架+分类查询_第4张图片

整个项目采用Maven水平切分和纵向切分管理。
jt-parent  -- pom父工程,管理依赖的版本号
jt-common  -- 通用的组件、工具类
jt-manage  -- 后台管理系统,管理商品、分类等功能

1.4.2创建新的工作空间

1)创建目录D:\javaws-1605
JT_01 项目背景+搭建框架+分类查询_第5张图片
2)配置字体大小
JT_01 项目背景+搭建框架+分类查询_第6张图片
3)配置jdk
JT_01 项目背景+搭建框架+分类查询_第7张图片
4)配置maven
JT_01 项目背景+搭建框架+分类查询_第8张图片
安装installations
JT_01 项目背景+搭建框架+分类查询_第9张图片
具体配置参照 http://blog.csdn.net/frank_hsu_/article/details/79102290

1.4.3创建maven java父工程:jt-parent

子模块的POM继承这些配置:子模块继承这些配置的时候,仍然要声明groupId和artifactId,表示当前配置是继承于父POM的,从而直接使用父POM的版本对应的资源。
选择组建立maven java工程,如下图所示:
JT_01 项目背景+搭建框架+分类查询_第10张图片
项目创建完成,但项目报错,更新下工程就可以。
JT_01 项目背景+搭建框架+分类查询_第11张图片
pom.xml文件代码如下:

	4.0.0

	com.jt
	jt-parent
	0.0.1-SNAPSHOT
	pom

	jt-parent
	http://maven.apache.org

	
	
		4.10
		4.1.3.RELEASE

		3.2.8
		1.2.2
		1.2.15
		5.1.32
		0.8.0.RELEASE
		1.0.9

		2.3.2
		3.4.2
		0.9.1

		1.6.4
		1.2
		2.5
		2.0
		2.5

		3.3.2
		2.4
		1.3.1

		2.4.2
		4.3.5
		2.6.0
	

	
	
				
		
			junit
			junit
			${junit.version}
			test
		
		
				
		
			org.springframework
			spring-context
			${spring.version}
		
		
			org.springframework
			spring-beans
			${spring.version}
		
		
			org.springframework
			spring-webmvc
			${spring.version}
		
		
			org.springframework
			spring-jdbc
			${spring.version}
		
		
			org.springframework
			spring-aspects
			${spring.version}
		
		
				
		
			org.mybatis
			mybatis
			${mybatis.version}
		
			
		
			org.mybatis
			mybatis-spring
			${mybatis.spring.version}
		
			
		
			com.github.miemiedev
			mybatis-paginator
			${mybatis.paginator.version}
		
		
			
		
			mysql
			mysql-connector-java
			${mysql.version}
		

		
		
			com.github.abel533
			mapper
			${mapper.version}
		

		
		
			com.github.pagehelper
			pagehelper
			${pagehelper.version}
		
		
			com.github.jsqlparser
			jsqlparser
			${jsqlparser.version}
		

		
		
			com.jolbox
			bonecp-spring
			${bonecp-spring.version}
		

		
			org.slf4j
			slf4j-log4j12
			${slf4j.version}
		
		
				
		
			com.fasterxml.jackson.core
			jackson-databind
			${jackson.version}
		

		
		
			org.apache.httpcomponents
			httpclient
			${httpclient.version}
		
		
			org.apache.httpcomponents
			httpmime
			4.3.1
		

		
		
			jstl
			jstl
			${jstl.version}
		
		
			javax.servlet
			servlet-api
			${servlet-api.version}
			provided
		
		
			javax.servlet
			jsp-api
			${jsp-api.version}
			provided
		

		
		
			joda-time
			joda-time
			${joda-time.version}
		

		
		
			org.apache.commons
			commons-lang3
			${commons-lang3.version}
		
		
			org.apache.commons
			commons-io
			${commons-io.version}
		

		
		
			commons-fileupload
			commons-fileupload
			${commons-fileupload.version}
		

		
		
			redis.clients
			jedis
			${jedis.version}
		


		
		
			commons-codec
			commons-codec
			1.9
		

		
		
			org.hibernate
			hibernate-validator
			5.1.3.Final
		

	

父工程packaging类型为pom。
安装到本地仓库。注意:这步必须做,否则后期子工程需要调用父工程中类时,将无法调用。

1.4.4 创建maven java工具包工程:jt-common

pom.xml配置文件

  4.0.0

  com.jt.common
  jt-common
  jar

  jt-common
  http://maven.apache.org

  
    UTF-8
  
  
  	com.jt.parent
  	jt-parent
  	0.0.1-SNAPSHOT
  

工具类工程packaging类型为jar。继承父工程jt-parent。

1.4.5 创建maven java后台聚合工程:jt-manage

com.jt.manage.pojo
com.jt.manage.mapper
com.jt.manage.service
com.jt.manage.web
pom.xml配置文件:


  4.0.0

  com.jt.manage
  jt-manage
  pom

  jt-manage
  http://maven.apache.org

  
    UTF-8
  

  
  	com.jt.parent
  	jt-parent
  	0.0.1-SNAPSHOT
  
  
  	jt-manage-pojo
  	jt-manage-mapper
    jt-manage-service
    jt-manage-web
  

1.4.6 多模块的拆分

JT_01 项目背景+搭建框架+分类查询_第12张图片

1.4.7 jt-manage-pojo

Maven水平切分管理。
JT_01 项目背景+搭建框架+分类查询_第13张图片
JT_01 项目背景+搭建框架+分类查询_第14张图片
pom.xml配置文件:


  4.0.0
  
    com.jt.manage
    jt-manage
    0.0.1-SNAPSHOT
  
  com.jt.manage
  jt-manage-pojo
  0.0.1-SNAPSHOT
  jt-manage-pojo
  http://maven.apache.org
  
    UTF-8
  
  
  	
  		com.jt.common
  		jt-common
  		0.0.1-SNAPSHOT
  	
  

1.4.8 jt-manage-mapper



  4.0.0
  
    com.jt.manage
    jt-manage
    0.0.1-SNAPSHOT
  
  com.jt.manage
  jt-manage-mapper
  0.0.1-SNAPSHOT
  jt-manage-mapper
  http://maven.apache.org
  
    UTF-8
  
  
  	
  		com.jt.manage
  		jt-manage-pojo
  		0.0.1-SNAPSHOT
  	
  


1.4.9 jt-manage-service



  4.0.0
  
    com.jt.manage
    jt-manage
    0.0.1-SNAPSHOT
  
  com.jt.manage
  jt-manage-service
  0.0.1-SNAPSHOT
  jt-manage-service
  http://maven.apache.org
  
    UTF-8
  
  
  	
  		com.jt.manage
  		jt-manage-mapper
  		0.0.1-SNAPSHOT
  	
  

1.4.10 jt-manage-web

1)和上面工程不同的是,选择web工程。
创建maven 到底使用Maven那个框架? 选择quickstart 还是webapp?
依据:如果这个项目有jsp或者controller就是webapp,其他都是quickstart。
JT_01 项目背景+搭建框架+分类查询_第15张图片


  4.0.0
  
    com.jt.manage
    jt-manage
    0.0.1-SNAPSHOT
  
  com.jt.manage
  jt-manage-web
  0.0.1-SNAPSHOT
  war
  jt-manage-web Maven Webapp
  http://maven.apache.org


  
  	
  		com.jt.manage
  		jt-manage-service
  		0.0.1-SNAPSHOT
  	
  
  
	
		
			
				org.apache.tomcat.maven
				tomcat7-maven-plugin
				2.2
				
					8081
					/
				
			
		
	  

最终父工程jt-manage中的modules增加了
 
	jt-manage-pojo
    jt-manage-mapper
    jt-manage-service
    jt-manage-web
  

1.4.11 添加tomcat插件支持

tomcat插件方式比原有eclipse配置tomcat server方式,部署启动要迅速很多,推荐使用。

 
  	
  		
  			org.apache.tomcat.maven
  			tomcat7-maven-plugin
  			
  				8081
  				/
  			
  		
  	
  

1.4.12 子工程的依赖关系

pojo依赖common:

  	com.jt.common
  	jt-common
  	0.0.1-SNAPSHOT

mapper依赖pojo:

	com.jt.manage
	jt-manage-pojo
	1.0.0-SNAPSHOT

serivce依赖mapper:

	com.jt.manage
	jt-manage-mapper
	1.0.0-SNAPSHOT

web依赖service:

	 com.jt.manage
	 jt-manage-service
	 1.0.0-SNAPSHOT

注意,每个工程都需要发布到Maven本地仓库中,否则依赖将出错,安装如下图:
JT_01 项目背景+搭建框架+分类查询_第16张图片

1.4.13 问题:源码跟踪时无法找到源文件

Maven命令时访问源码方式和webProject部署到tomcat Server形式不同,必须手动配置,在配置mvn命令时指定:
JT_01 项目背景+搭建框架+分类查询_第17张图片
JT_01 项目背景+搭建框架+分类查询_第18张图片

1.5 SSM框架技术

Spring+SpringMVC+Mybatis
创建项目的步骤:
1)创建配置文件,Spring配置、Mybatis配置、SpringMVC配置、数据库连接、日志配置。
2)创建web.xml,在web.xml中完成Spring容器的初始化和SpringMVC入口的配置。
3)添加所需的依赖,是添加到jt-manage工程还是jt-manage-xxx工程,选择原则:在哪些工程中需要。
问题:将依赖放在哪个工程呢?
例如:junit单元测试,是放在jt-manage中还是jt-manage-web呢?它们有什么区别?放在jt-manage,它的子工程就都加入了这个jar包。junit所有工程都需要,所有就放进去。
4)拷贝jsp、js、css、工具类

1.5.1 拷贝jt-common项目代码

在:00-基础框架\01-工具类\jt-common\src\main\java

1.5.2 applicationContext.xml

Spring配置文件代码如下:


	
	
		
		
		
		
		
		
			
				classpath:jdbc.properties
				classpath:env.properties
				classpath:redis.properties
				classpath:httpclient.properties
				classpath:rabbitmq.properties
			
		
	

	
	

	
	
		
		
		
		
		
		
		
		
		
		
		
		
		
		
		
		
	


1.5.3 applicationContext-mybatis.xml

Spring和MyBatis整合配置文件,代码如下:


	
	
		
		
		
		
		
		
		
		
	
	
	
	
		
		
	


1.5.4 applicationContext-transaction.xml

Spring的事务配置文件,代码如下:

	
	
	
		
	

	
	
		
			
			
			
			

			
			
			
			

			
			
		
	

	
		
		
		
		
	
	
	


1.5.5 mybatis-config.xml

Mybatis配置文件,代码如下:




	
		
		
		
		
	

	
		
		
			
			
			
			
			
		
		
		
		
			
			
			
			
		
	


1.5.6 jdbc.properties

数据库连接属性文件,代码如下:
jdbc.driver=com.mysql.jdbc.Driver
jdbc.url=jdbc:mysql://127.0.0.1:3306/jtdb?useUnicode=true&characterEncoding=utf8&autoReconnect=true&allowMultiQueries=true
jdbc.username=root
jdbc.password=root
autoReconnect 闲置8小时,mysql会自动断掉链接,配置后会自动重新链接
allowMultiQueries 一次可以执行多个SQL语句

1.5.7 log4j.properties

日志配置文件,代码如下:
log4j.rootLogger=INFO,A1
log4j.logger.org.mybatis = DEBUG
log4j.appender.A1=org.apache.log4j.ConsoleAppender
log4j.appender.A1.layout=org.apache.log4j.PatternLayout
log4j.appender.A1.layout.ConversionPattern=%-d{yyyy-MM-dd HH:mm:ss,SSS} [%t] [%c]-[%p] %m%n


1.5.8 springmvc-config.xml

web的配置文件,代码如下:


	
	
	
		
		
			
			
				
			  
			
			
				
				
			
		
	

	
	

	
	
	
		
		
		
		
	

	
	

	
	
		
		
		
		
	


1.5.9 web.xml

web的配置文件,代码如下:


	jt-manage

	
		contextConfigLocation
		classpath:spring/applicationContext*.xml
	
	
	
		org.springframework.web.context.ContextLoaderListener
	

	
	
		encodingFilter
		org.springframework.web.filter.CharacterEncodingFilter
		
			encoding
			UTF8
		
	
	
		encodingFilter
		/*
	

	
	
		springmvc
		org.springframework.web.servlet.DispatcherServlet
		
		
			contextConfigLocation
			classpath:spring/springmvc-config.xml
		
		1
	

	
		springmvc
		/
	
	
	
		index.jsp
	


1.6 数据库表设计

先创建下面三张表,后续根据业务再创建其所需要的数据库表。
JT_01 项目背景+搭建框架+分类查询_第19张图片
 

1.6.1 商品分类表

create table tb_item_cat
(
   id                   bigint not null auto_increment,
   parent_id            bigint comment '父分类ID=0时,代表一级分类',
   name                 varchar(150),
   status               int(1) default 1 comment '默认值为1,可选值:1正常,2删除',
   sort_order           int(4) not null,
   is_parent            tinyint(1),
   created              datetime,
   updated              datetime,
   primary key (id)
);

create index parent_id on tb_item_cat
(
   parent_id,
   status
);

create index sort_order on tb_item_cat
(
   sort_order
);
典型树形结构,创建索引。
注意表设计的不同:
1) 表的主键采用长整形
2) 对parent_id和sort_order常用查询条件字段设置索引

1.6.2 商品分类的显示

JT_01 项目背景+搭建框架+分类查询_第20张图片
要求:点击“选择分类”,弹出窗口esayUI.window,esayUI.tree树形展现分类表tb_item_cat中的数据。只能选最后的分类(叶子节点)。

1.7 通用Mapper的插件介绍

JT_01 项目背景+搭建框架+分类查询_第21张图片
注:Selective代表不是所有字段拼入SQL。例如:insert是所有字段都拼入SQL语句,而insertSelective代表非空字段才拼入SQL语句。这样insertSelective比insert语句执行效率高。
问题:
传统的mybatis需要在映射文件中写sql,由于业务的不同造成sql语句不同,而无法造成通用,开发人员工作量巨大,也不易维护。
解决:
1) 把表名作为参数传入,不能解决字段不同的问题。
2) 动态生成SQL,如何实现?可以使用插件(拦截器实现)。
3) 这样映射文件中只需写表和实体的映射关系

1.7.1 依赖

官网地址:http://git.oschina.net/free/Mapper
提示,3.1.0及以后版本的groupId修改为tk.mybatis,artifactId为mapper

    tk.mybatis
    mapper
    3.2.2
	

1.7.2 JPA注解

JPA全称Java Persistence API.JPA通过JDK 5.0注解或XML描述对象-关系表的映射关系,并将运行期的实体对象持久化到数据库中。Sun引入新的JPA ORM规范出于两个原因:其一,简化现有Java EE和Java SE应用开发工作;其二,Sun希望整合ORM技术,实现天下归一。 JPA由EJB 3.0软件专家组开发。

序号 javax.persistence注解 说明
1.     @Table(name="tb_item_cat") 标识类对应的表
2.     @Id 主键
3.     @GeneratedValue 自增
(strategy=GenerationType.IDENTITY)
4.     @Column(name="parent_id") 当属性和字段不一致,设置映射关系
在POJO实体对象上加JPA(Java Persistence API)注解,实现类和数据库表之间的映射。
未指定的驼峰规则,在mybatis-config.xml中配置
1)表名默认使用类名,按驼峰规则,下划线后字母自动大写,如UserInfo对应表名user_info。
2)当表名和类名不对应时,使用@Table(name="tableName")进行指定。
3)属性和字段名不对应时,使用@Column(name="fieldName")进行指定。
4)当非表的属性时,使用@Transient可以忽略此属性。
5)必须设置主键@Id,可以有多个属性设置@Id,作为联合主键。默认情况下,如果没有设置主键,所有字段作为一个联合主键,这种效率极低。
6)实体类可以继承使用,注解也将继承。
7)基于基本类型,如int作为实体字段时会有默认值0,而且无法消除,所以实体类中建议不要使用基本类型。
8)主键策略,支持序列、UUID、主键自增三种方式,其中序列和UUID可以配置多个,主键自增只能配置一个。
@GeneratedValue(strategy = GenerationType.IDENTITY) //主键自增长策略
@GeneratedValue(strategy=GenerationType.AUTO) 也是默认策略, 即写成@GeneratedValue也可。类似于hibernate的native策略,生成方式取决于底层的数据库。
@GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "seq_u")指定“序列”策略,使用于Oracle。其中generator表示序列的名字。










你可能感兴趣的:(JT)