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.2JT商城简介

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

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


1.2 项目介绍

1.2.1 JT架构图


1.2.2 网络架构图

1.2.3 各系统核心业务说明

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

 
整个系统采用大型项目开发方式,使用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项目管理结构



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

1.4.2创建新的工作空间

1)创建目录D:\javaws-1605
2)配置字体大小

3)配置jdk

4)配置maven

安装installations

具体配置参照 http://blog.csdn.net/frank_hsu_/article/details/79102290

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

子模块的POM继承这些配置:子模块继承这些配置的时候,仍然要声明groupId和artifactId,表示当前配置是继承于父POM的,从而直接使用父POM的版本对应的资源。
选择组建立maven java工程,如下图所示:

项目创建完成,但项目报错,更新下工程就可以。

pom.xml文件代码如下:
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
	<modelVersion>4.0.0</modelVersion>

	<groupId>com.jt</groupId>
	<artifactId>jt-parent</artifactId>
	<version>0.0.1-SNAPSHOT</version>
	<packaging>pom</packaging>

	<name>jt-parent</name>
	<url>http://maven.apache.org</url>

	<!-- 集中定义依赖版本号 -->
	<properties>
		<junit.version>4.10</junit.version>
		<spring.version>4.1.3.RELEASE</spring.version>

		<mybatis.version>3.2.8</mybatis.version>
		<mybatis.spring.version>1.2.2</mybatis.spring.version>
		<mybatis.paginator.version>1.2.15</mybatis.paginator.version>
		<mysql.version>5.1.32</mysql.version>
		<bonecp-spring.version>0.8.0.RELEASE</bonecp-spring.version>
		<druid.version>1.0.9</druid.version>

		<mapper.version>2.3.2</mapper.version>
		<pagehelper.version>3.4.2</pagehelper.version>
		<jsqlparser.version>0.9.1</jsqlparser.version>

		<slf4j.version>1.6.4</slf4j.version>
		<jstl.version>1.2</jstl.version>
		<servlet-api.version>2.5</servlet-api.version>
		<jsp-api.version>2.0</jsp-api.version>
		<joda-time.version>2.5</joda-time.version>

		<commons-lang3.version>3.3.2</commons-lang3.version>
		<commons-io.version>2.4</commons-io.version>
		<commons-fileupload.version>1.3.1</commons-fileupload.version>

		<jackson.version>2.4.2</jackson.version>
		<httpclient.version>4.3.5</httpclient.version>
		<jedis.version>2.6.0</jedis.version>
	</properties>

	<dependencies>
	
				<!-- 单元测试 -->
		<dependency>
			<groupId>junit</groupId>
			<artifactId>junit</artifactId>
			<version>${junit.version}</version>
			<scope>test</scope>
		</dependency>
		
				<!-- Spring -->
		<dependency>
			<groupId>org.springframework</groupId>
			<artifactId>spring-context</artifactId>
			<version>${spring.version}</version>
		</dependency>
		<dependency>
			<groupId>org.springframework</groupId>
			<artifactId>spring-beans</artifactId>
			<version>${spring.version}</version>
		</dependency>
		<dependency>
			<groupId>org.springframework</groupId>
			<artifactId>spring-webmvc</artifactId>
			<version>${spring.version}</version>
		</dependency>
		<dependency>
			<groupId>org.springframework</groupId>
			<artifactId>spring-jdbc</artifactId>
			<version>${spring.version}</version>
		</dependency>
		<dependency>
			<groupId>org.springframework</groupId>
			<artifactId>spring-aspects</artifactId>
			<version>${spring.version}</version>
		</dependency>
		
				<!-- Mybatis -->
		<dependency>
			<groupId>org.mybatis</groupId>
			<artifactId>mybatis</artifactId>
			<version>${mybatis.version}</version>
		</dependency>
			<!-- Mybatis spring依赖-->
		<dependency>
			<groupId>org.mybatis</groupId>
			<artifactId>mybatis-spring</artifactId>
			<version>${mybatis.spring.version}</version>
		</dependency>
			<!-- Mybatis 分页-->
		<dependency>
			<groupId>com.github.miemiedev</groupId>
			<artifactId>mybatis-paginator</artifactId>
			<version>${mybatis.paginator.version}</version>
		</dependency>
		
			<!-- MySql -->
		<dependency>
			<groupId>mysql</groupId>
			<artifactId>mysql-connector-java</artifactId>
			<version>${mysql.version}</version>
		</dependency>

		<!-- 通用Mapper -->
		<dependency>
			<groupId>com.github.abel533</groupId>
			<artifactId>mapper</artifactId>
			<version>${mapper.version}</version>
		</dependency>

		<!-- 分页插件 -->
		<dependency>
			<groupId>com.github.pagehelper</groupId>
			<artifactId>pagehelper</artifactId>
			<version>${pagehelper.version}</version>
		</dependency>
		<dependency>
			<groupId>com.github.jsqlparser</groupId>
			<artifactId>jsqlparser</artifactId>
			<version>${jsqlparser.version}</version>
		</dependency>

		<!-- 连接池 -->
		<dependency>
			<groupId>com.jolbox</groupId>
			<artifactId>bonecp-spring</artifactId>
			<version>${bonecp-spring.version}</version>
		</dependency>

		<dependency>
			<groupId>org.slf4j</groupId>
			<artifactId>slf4j-log4j12</artifactId>
			<version>${slf4j.version}</version>
		</dependency>
		
				<!-- Jackson Json处理工具包 -->
		<dependency>
			<groupId>com.fasterxml.jackson.core</groupId>
			<artifactId>jackson-databind</artifactId>
			<version>${jackson.version}</version>
		</dependency>

		<!-- httpclient -->
		<dependency>
			<groupId>org.apache.httpcomponents</groupId>
			<artifactId>httpclient</artifactId>
			<version>${httpclient.version}</version>
		</dependency>
		<dependency>
			<groupId>org.apache.httpcomponents</groupId>
			<artifactId>httpmime</artifactId>
			<version>4.3.1</version>
		</dependency>

		<!-- JSP相关 -->
		<dependency>
			<groupId>jstl</groupId>
			<artifactId>jstl</artifactId>
			<version>${jstl.version}</version>
		</dependency>
		<dependency>
			<groupId>javax.servlet</groupId>
			<artifactId>servlet-api</artifactId>
			<version>${servlet-api.version}</version>
			<scope>provided</scope>
		</dependency>
		<dependency>
			<groupId>javax.servlet</groupId>
			<artifactId>jsp-api</artifactId>
			<version>${jsp-api.version}</version>
			<scope>provided</scope>
		</dependency>

		<!-- 时间操作组件 -->
		<dependency>
			<groupId>joda-time</groupId>
			<artifactId>joda-time</artifactId>
			<version>${joda-time.version}</version>
		</dependency>

		<!-- Apache工具组件 -->
		<dependency>
			<groupId>org.apache.commons</groupId>
			<artifactId>commons-lang3</artifactId>
			<version>${commons-lang3.version}</version>
		</dependency>
		<dependency>
			<groupId>org.apache.commons</groupId>
			<artifactId>commons-io</artifactId>
			<version>${commons-io.version}</version>
		</dependency>

		<!-- 文件上传组件 -->
		<dependency>
			<groupId>commons-fileupload</groupId>
			<artifactId>commons-fileupload</artifactId>
			<version>${commons-fileupload.version}</version>
		</dependency>

		<!-- jedis -->
		<dependency>
			<groupId>redis.clients</groupId>
			<artifactId>jedis</artifactId>
			<version>${jedis.version}</version>
		</dependency>


		<!-- 字符加密、解密 -->
		<dependency>
			<groupId>commons-codec</groupId>
			<artifactId>commons-codec</artifactId>
			<version>1.9</version>
		</dependency>

		<!-- 数据校验 -->
		<dependency>
			<groupId>org.hibernate</groupId>
			<artifactId>hibernate-validator</artifactId>
			<version>5.1.3.Final</version>
		</dependency>

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

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

pom.xml配置文件
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
  <modelVersion>4.0.0</modelVersion>

  <groupId>com.jt.common</groupId>
  <artifactId>jt-common</artifactId>
  <packaging>jar</packaging>

  <name>jt-common</name>
  <url>http://maven.apache.org</url>

  <properties>
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
  </properties>
  <parent>
  	<groupId>com.jt.parent</groupId>
  	<artifactId>jt-parent</artifactId>
  	<version>0.0.1-SNAPSHOT</version>
  </parent>
</project>
工具类工程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配置文件:
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
  <modelVersion>4.0.0</modelVersion>

  <groupId>com.jt.manage</groupId>
  <artifactId>jt-manage</artifactId>
  <packaging>pom</packaging>

  <name>jt-manage</name>
  <url>http://maven.apache.org</url>

  <properties>
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
  </properties>

  <parent>
  	<groupId>com.jt.parent</groupId>
  	<artifactId>jt-parent</artifactId>
  	<version>0.0.1-SNAPSHOT</version>
  </parent>
  <modules>
  	<module>jt-manage-pojo</module>
  	<module>jt-manage-mapper</module>
    <module>jt-manage-service</module>
    <module>jt-manage-web</module>
  </modules>
</project>

1.4.6多模块的拆分


1.4.7jt-manage-pojo

Maven水平切分管理。


pom.xml配置文件:
<?xml version="1.0"?>
<project xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd" xmlns="http://maven.apache.org/POM/4.0.0"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
  <modelVersion>4.0.0</modelVersion>
  <parent>
    <groupId>com.jt.manage</groupId>
    <artifactId>jt-manage</artifactId>
    <version>0.0.1-SNAPSHOT</version>
  </parent>
  <groupId>com.jt.manage</groupId>
  <artifactId>jt-manage-pojo</artifactId>
  <version>0.0.1-SNAPSHOT</version>
  <name>jt-manage-pojo</name>
  <url>http://maven.apache.org</url>
  <properties>
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
  </properties>
  <dependencies>
  	<dependency>
  		<groupId>com.jt.common</groupId>
  		<artifactId>jt-common</artifactId>
  		<version>0.0.1-SNAPSHOT</version>
  	</dependency>
  </dependencies>
</project>

1.4.8jt-manage-mapper

<?xml version="1.0"?>
<project xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd" xmlns="http://maven.apache.org/POM/4.0.0"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
  <modelVersion>4.0.0</modelVersion>
  <parent>
    <groupId>com.jt.manage</groupId>
    <artifactId>jt-manage</artifactId>
    <version>0.0.1-SNAPSHOT</version>
  </parent>
  <groupId>com.jt.manage</groupId>
  <artifactId>jt-manage-mapper</artifactId>
  <version>0.0.1-SNAPSHOT</version>
  <name>jt-manage-mapper</name>
  <url>http://maven.apache.org</url>
  <properties>
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
  </properties>
  <dependencies>
  	<dependency>
  		<groupId>com.jt.manage</groupId>
  		<artifactId>jt-manage-pojo</artifactId>
  		<version>0.0.1-SNAPSHOT</version>
  	</dependency>
  </dependencies>
</project>

1.4.9 jt-manage-service

<?xml version="1.0"?>
<project xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd" xmlns="http://maven.apache.org/POM/4.0.0"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
  <modelVersion>4.0.0</modelVersion>
  <parent>
    <groupId>com.jt.manage</groupId>
    <artifactId>jt-manage</artifactId>
    <version>0.0.1-SNAPSHOT</version>
  </parent>
  <groupId>com.jt.manage</groupId>
  <artifactId>jt-manage-service</artifactId>
  <version>0.0.1-SNAPSHOT</version>
  <name>jt-manage-service</name>
  <url>http://maven.apache.org</url>
  <properties>
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
  </properties>
  <dependencies>
  	<dependency>
  		<groupId>com.jt.manage</groupId>
  		<artifactId>jt-manage-mapper</artifactId>
  		<version>0.0.1-SNAPSHOT</version>
  	</dependency>
  </dependencies>
</project>

1.4.10jt-manage-web

1)和上面工程不同的是,选择web工程。
创建maven 到底使用Maven那个框架? 选择quickstart 还是webapp?
依据:如果这个项目有jsp或者controller就是webapp,其他都是quickstart。

<?xml version="1.0"?>
<project xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd" xmlns="http://maven.apache.org/POM/4.0.0"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
  <modelVersion>4.0.0</modelVersion>
  <parent>
    <groupId>com.jt.manage</groupId>
    <artifactId>jt-manage</artifactId>
    <version>0.0.1-SNAPSHOT</version>
  </parent>
  <groupId>com.jt.manage</groupId>
  <artifactId>jt-manage-web</artifactId>
  <version>0.0.1-SNAPSHOT</version>
  <packaging>war</packaging>
  <name>jt-manage-web Maven Webapp</name>
  <url>http://maven.apache.org</url>


  <dependencies>
  	<dependency>
  		<groupId>com.jt.manage</groupId>
  		<artifactId>jt-manage-service</artifactId>
  		<version>0.0.1-SNAPSHOT</version>
  	</dependency>
  </dependencies>
  
	<build>
		<plugins>
			<plugin>
				<groupId>org.apache.tomcat.maven</groupId>
				<artifactId>tomcat7-maven-plugin</artifactId>
				<version>2.2</version>
				<configuration>
					<port>8081</port>
					<path>/</path>
				</configuration>
			</plugin>
		</plugins>
	</build>  
</project>
最终父工程jt-manage中的modules增加了
 <modules>
	<module>jt-manage-pojo</module>
    <module>jt-manage-mapper</module>
    <module>jt-manage-service</module>
    <module>jt-manage-web</module>
  </modules>

1.4.11添加tomcat插件支持

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

 <build>
  	<plugins>
  		<plugin>
  			<groupId>org.apache.tomcat.maven</groupId>
  			<artifactId>tomcat7-maven-plugin</artifactId>
  			<configuration>
  				<port>8081</port>
  				<path>/</path>
  			</configuration>
  		</plugin>
  	</plugins>
  </build>

1.4.12子工程的依赖关系

pojo依赖common:
<dependency>
  	<groupId>com.jt.common</groupId>
  	<artifactId>jt-common</artifactId>
  	<version>0.0.1-SNAPSHOT</version>
</dependency>
mapper依赖pojo:
<dependency>
	<groupId>com.jt.manage</groupId>
	<artifactId>jt-manage-pojo</artifactId>
	<version>1.0.0-SNAPSHOT</version>
</dependency>
serivce依赖mapper:
<dependency>
	<groupId>com.jt.manage</groupId>
	<artifactId>jt-manage-mapper</artifactId>
	<version>1.0.0-SNAPSHOT</version>
</dependency>
web依赖service:
<dependency>
	 <groupId>com.jt.manage</groupId>
	 <artifactId>jt-manage-service</artifactId>
	 <version>1.0.0-SNAPSHOT</version>
</dependency>
注意,每个工程都需要发布到Maven本地仓库中,否则依赖将出错,安装如下图:

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

Maven命令时访问源码方式和webProject部署到tomcat Server形式不同,必须手动配置,在配置mvn命令时指定:



1.5SSM框架技术

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.2applicationContext.xml

Spring配置文件代码如下:
<beans xmlns="http://www.springframework.org/schema/beans"
	xmlns:context="http://www.springframework.org/schema/context" xmlns:p="http://www.springframework.org/schema/p"
	xmlns:aop="http://www.springframework.org/schema/aop" xmlns:tx="http://www.springframework.org/schema/tx"
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.0.xsd
	http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.0.xsd
	http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-4.0.xsd http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-4.0.xsd
	http://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util-4.0.xsd">

	<!-- 使用spring自带的占位符替换功能,可以实现注解方式获取属性文件中的配置值 -->
	<bean
		class="com.jt.common.spring.exetend.ExtendedPropertyPlaceholderConfigurer">
		<!-- 允许JVM参数覆盖 -->
		<property name="systemPropertiesModeName" value="SYSTEM_PROPERTIES_MODE_OVERRIDE" />
		<!-- 忽略没有找到的资源文件 -->
		<property name="ignoreResourceNotFound" value="true" />
		<!-- 配置资源文件 -->
		<property name="locations">
			<list>
				<value>classpath:jdbc.properties</value>
				<value>classpath:env.properties</value>
				<value>classpath:redis.properties</value>
				<value>classpath:httpclient.properties</value>
				<value>classpath:rabbitmq.properties</value>
			</list>
		</property>
	</bean>

	<!-- 扫描包 -->
	<context:component-scan base-package="com.jt" />

	<!-- 配置连接池 -->
	<bean id="dataSource" class="com.jolbox.bonecp.BoneCPDataSource" destroy-method="close">
		<!-- 数据库驱动 -->
		<property name="driverClass" value="${jdbc.driver}" />
		<!-- 相应驱动的jdbcUrl -->
		<property name="jdbcUrl" value="${jdbc.url}" />
		<!-- 数据库的用户名 -->
		<property name="username" value="${jdbc.username}" />
		<!-- 数据库的密码 -->
		<property name="password" value="${jdbc.password}" />
		<!-- 检查数据库连接池中空闲连接的间隔时间,单位是分,默认值:240,如果要取消则设置为0 -->
		<property name="idleConnectionTestPeriod" value="60" />
		<!-- 连接池中未使用的链接最大存活时间,单位是分,默认值:60,如果要永远存活设置为0 -->
		<property name="idleMaxAge" value="30" />
		<!-- 每个分区最大的连接数 -->
		<property name="maxConnectionsPerPartition" value="150" />
		<!-- 每个分区最小的连接数 -->
		<property name="minConnectionsPerPartition" value="5" />
	</bean>

</beans>

1.5.3applicationContext-mybatis.xml

Spring和MyBatis整合配置文件,代码如下:
<beans xmlns="http://www.springframework.org/schema/beans"
	xmlns:context="http://www.springframework.org/schema/context" xmlns:p="http://www.springframework.org/schema/p"
	xmlns:aop="http://www.springframework.org/schema/aop" xmlns:tx="http://www.springframework.org/schema/tx"
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.0.xsd
	http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.0.xsd
	http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-4.0.xsd http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-4.0.xsd
	http://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util-4.0.xsd">

	<!-- 构造SqlSessionFactory -->
	<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
		<!-- 定义数据源 -->
		<property name="dataSource" ref="dataSource"/>
		<!-- mybatis-config.xml -->
		<property name="configLocation" value="classpath:mybatis/mybatis-config.xml"/>
		<!-- 别名包 -->
		<property name="typeAliasesPackage" value="com.jt.manage.pojo"/>
		<!-- mapper.xml -->
		<property name="mapperLocations" value="classpath:mybatis/mappers/*.xml"/>
	</bean>
	
	<!-- 定义Mapper接口扫描器 -->
	<bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
		<!-- 扫描mapper包 -->
		<property name="basePackage" value="com.jt.manage.mapper"/>
	</bean>

</beans>

1.5.4applicationContext-transaction.xml

Spring的事务配置文件,代码如下:
<beans xmlns="http://www.springframework.org/schema/beans"
	xmlns:context="http://www.springframework.org/schema/context" xmlns:p="http://www.springframework.org/schema/p"
	xmlns:aop="http://www.springframework.org/schema/aop" xmlns:tx="http://www.springframework.org/schema/tx"
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.0.xsd
	http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.0.xsd
	http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-4.0.xsd http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-4.0.xsd
	http://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util-4.0.xsd">
	
	<!-- 定义事务管理器 -->
	<bean id="transactionManager"
		class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
		<property name="dataSource" ref="dataSource" />
	</bean>

	<!-- 定义事务策略 -->
	<tx:advice id="txAdvice" transaction-manager="transactionManager">
		<tx:attributes>
			<!--定义查询方法都是只读的 -->
			<tx:method name="query*" read-only="true" />
			<tx:method name="find*" read-only="true" />
			<tx:method name="get*" read-only="true" />

			<!-- 主库执行操作,事务传播行为定义为默认行为 -->
			<tx:method name="save*" propagation="REQUIRED" />
			<tx:method name="update*" propagation="REQUIRED" />
			<tx:method name="delete*" propagation="REQUIRED" />

			<!--其他方法使用默认事务策略 -->
			<tx:method name="*" />
		</tx:attributes>
	</tx:advice>

	<aop:config>
		<!-- 定义切面,所有的service的所有方法 -->
		<aop:pointcut id="txPointcut" expression="execution(* com.jt.manage.service.*.*(..))" />
		<!-- 应用事务策略到Service切面 -->
		<aop:advisor advice-ref="txAdvice" pointcut-ref="txPointcut"/>
	</aop:config>
	
	
</beans>

1.5.5mybatis-config.xml

Mybatis配置文件,代码如下:
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configuration
  PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
  "http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>

	<settings>
		<!-- 开启驼峰自动映射 -->
		<setting name="mapUnderscoreToCamelCase" value="true" />
		<!-- 二级缓存的总开关 -->
		<setting name="cacheEnabled" value="false" />
	</settings>

	<plugins>
		<!-- 分页插件:com.github.pagehelper为PageHelper类所在包名 -->
		<plugin interceptor="com.github.pagehelper.PageHelper">
			<!-- 方言 -->
			<property name="dialect" value="mysql" />
			<!-- 该参数默认为false -->
			<!-- 设置为true时,使用RowBounds分页会进行count查询,查询数据总条数 -->
			<property name="rowBoundsWithCount" value="true" />
		</plugin>
		
		<!-- 通用Mapper插件 -->
		<plugin interceptor="com.github.abel533.mapperhelper.MapperInterceptor">
			<!--主键自增回写方法,默认值MYSQL,详细说明请看文档 -->
			<property name="IDENTITY" value="MYSQL" />
			<!--通用Mapper接口,多个通用接口用逗号隔开 -->
			<property name="mappers" value="com.jt.manage.mapper.base.mapper.SysMapper" />
		</plugin>
	</plugins>

</configuration>

1.5.6jdbc.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.7log4j.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.8springmvc-config.xml

web的配置文件,代码如下:
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:p="http://www.springframework.org/schema/p"
	xmlns:context="http://www.springframework.org/schema/context"
	xmlns:mvc="http://www.springframework.org/schema/mvc"
	xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
        http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc-4.0.xsd
        http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd">
	
	<!-- MVC注解驱动 -->
	<mvc:annotation-driven>
		<!-- 采用自定义方案 -->
		<mvc:message-converters>
			<!-- 定义文本转化器 -->
			<bean class="org.springframework.http.converter.StringHttpMessageConverter">
				<constructor-arg index="0" value="UTF-8"/>
			</bean>  
			<!-- 定义json转化器,支持json跨域 -->
			<bean class="com.jt.common.spring.exetend.jackson.CallbackMappingJackson2HttpMessageConverter">
				<!-- 跨域请求中的请求参数名 -->
				<property name="callbackName" value="callback"></property>
			</bean>
		</mvc:message-converters>
	</mvc:annotation-driven>

	<!-- 配置扫描器,使得@Controller注解生效 -->
	<context:component-scan base-package="com.jt.manage.controller" />

	<!-- 定义视图解析器 -->
	<!-- prefix="/WEB-INF/jsp/", suffix=".jsp", viewname="test" -> "/WEB-INF/jsp/test.jsp" -->
	<bean
		class="org.springframework.web.servlet.view.InternalResourceViewResolver">
		<!-- 前缀 -->
		<property name="prefix" value="/WEB-INF/views/" />
		<!-- 后缀 -->
		<property name="suffix" value=".jsp" />
	</bean>

	<!-- 处理静态资源被“/”所拦截的问题 -->
	<mvc:default-servlet-handler />

	<!-- 定义文件上传解析器 -->
	<bean id="multipartResolver"
		class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
		<!-- 设定默认编码 -->
		<property name="defaultEncoding" value="UTF-8"></property>
		<!-- 设定文件上传的最大值10MB,10*1024*1024 -->
		<property name="maxUploadSize" value="10485760"></property>
	</bean>

</beans>

1.5.9web.xml

web的配置文件,代码如下:
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xmlns="http://java.sun.com/xml/ns/javaee"
	xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
	id="jt-manage" version="2.5">
	<display-name>jt-manage</display-name>

	<context-param>
		<param-name>contextConfigLocation</param-name>
		<param-value>classpath:spring/applicationContext*.xml</param-value>
	</context-param>
	<!--Spring的ApplicationContext 载入 -->
	<listener>
		<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
	</listener>

	<!-- 编码过滤器,以UTF8编码 -->
	<filter>
		<filter-name>encodingFilter</filter-name>
		<filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
		<init-param>
			<param-name>encoding</param-name>
			<param-value>UTF8</param-value>
		</init-param>
	</filter>
	<filter-mapping>
		<filter-name>encodingFilter</filter-name>
		<url-pattern>/*</url-pattern>
	</filter-mapping>

	<!-- 配置SpringMVC -->
	<servlet>
		<servlet-name>springmvc</servlet-name>
		<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
		<!-- 指定SpringMVC配置文件 -->
		<init-param>
			<param-name>contextConfigLocation</param-name>
			<param-value>classpath:spring/springmvc-config.xml</param-value>
		</init-param>
		<load-on-startup>1</load-on-startup>
	</servlet>

	<servlet-mapping>
		<servlet-name>springmvc</servlet-name>
		<url-pattern>/</url-pattern>
	</servlet-mapping>
	
	<welcome-file-list>
		<welcome-file>index.jsp</welcome-file>
	</welcome-file-list>

</web-app>

1.6数据库表设计

先创建下面三张表,后续根据业务再创建其所需要的数据库表。

 

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商品分类的显示

要求:点击“选择分类”,弹出窗口esayUI.window,esayUI.tree树形展现分类表tb_item_cat中的数据。只能选最后的分类(叶子节点)。

1.7通用Mapper的插件介绍


注: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
<dependency>
    <groupId>tk.mybatis</groupId>
    <artifactId>mapper</artifactId>
    <version>3.2.2</version>
</dependency>	

1.7.2JPA注解

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中配置
<setting name="mapUnderscoreToCamelCase" value="true"/>。
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表示序列的名字。











版权声明:本文为Frank_Hsu_原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。