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.6Power 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配置文件:com.jt.manage.mapper
com.jt.manage.service
com.jt.manage.web
<?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。
依据:如果这个项目有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\java1.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) 这样映射文件中只需写表和实体的映射关系
提示,3.1.0及以后版本的groupId修改为tk.mybatis,artifactId为mapper
问题:
传统的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") | 当属性和字段不一致,设置映射关系 |
未指定的驼峰规则,在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版权协议,转载请附上原文出处链接和本声明。