分布式技术入坑指南(一)

分布式技术入坑指南(一)

知识点:
1.SOA分布式架构
2.Maven-多模块搭建
3.初识dubbo、zookepper
4.多工程之间的整合
5.学习MyBatis逆向工程
6.学习PageHelper
7.了解SEO:搜索引擎优化,以及使用伪静态化尽可能的提高推广度
8.内容管理系统 — 统一表字段抽取
9.mapper中使用“主键返回”

SOA(Service Oriented Architecture)面向服务的架构

  也就是把工程都拆分成服务层工程表现层工程。服务层中包含业务逻辑,只需要对外提供服务即可。表现层只需要处理和页面的交互,业务逻辑都是调用服务层的服务来实现。工程都可以独立部署。
Alt text

Maven-多模块搭建

  Maven的常见打包方式:jar、war、pom。Pom工程一般都是父工程,管理jar包的版本、maven插件的版本、统一的依赖管理。聚合工程。

本项目工程结构:
taotao-parent:父工程,打包方式pom,管理jar包的版本号。项目中所有工程都应该继承父工程。
  |–taotao-common:通用的工具类通用的pojo,util。打包方式jar
  |–taotao-manager:服务层工程。聚合工程。Pom工程
  |–taotao-manager-dao:打包方式jar
  |–taotao-manager-pojo:打包方式jar
  |–taotao-manager-interface:打包方式jar
  |–taotao-manager-service:打包方式:war (为了发布服务的方便)
  |–taotao-manager-web:表现层工程。打包方式war

taotao-parent

pom

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
<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>
<!-- 父工程,打包方式pom,管理jar包的版本号。项目中所有工程都应该继承父工程. -->
<groupId>xyz.taotao</groupId>
<artifactId>taotao-parent</artifactId>
<version>0.0.1-SNAPSHOT</version>
<packaging>pom</packaging>

<!-- 所有子工程 -->
<modules>
<module>taotao-common</module>
<module>taotao-manager</module>
<module>taotao-manager-web</module>
<module>MybatisGenerator</module>
<module>taotao-protal-web</module>
<module>taotao-content</module>
</modules>

<!-- 集中定义依赖版本号 -->
<properties>
<junit.version>4.12</junit.version>
<spring.version>4.2.4.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>
<slf4j.version>1.6.4</slf4j.version>
<jackson.version>2.4.2</jackson.version>
<druid.version>1.0.9</druid.version>
<httpclient.version>4.3.5</httpclient.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>1.3.2</commons-io.version>
<commons-net.version>3.3</commons-net.version>
<!-- 3.4.2-fix是从官方的3.4.2版本添加修改之后形成的自己的工程 -->
<!--<pagehelper.version>3.4.2-fix</pagehelper.version>-->
<!--<pagehelper.version>3.4.2</pagehelper.version>-->
<!--该版本已经修复了使用逆向工程导致pageHelper无效的问题 -->
<pagehelper.version>4.1.0</pagehelper.version>

<jsqlparser.version>0.9.1</jsqlparser.version>
<commons-fileupload.version>1.3.1</commons-fileupload.version>
<jedis.version>2.7.2</jedis.version>
<solrj.version>4.10.3</solrj.version>
<dubbo.version>2.5.4</dubbo.version>
<zookeeper.version>3.4.7</zookeeper.version>
<zkclient.version>0.1</zkclient.version>
<activemq.version>5.13.0</activemq.version>
<freemarker.version>2.3.23</freemarker.version>
<quartz.version>2.2.2</quartz.version>
</properties>

<!-- 父工程统一项目的所有依赖,该依赖对子工程无效,只起到版本控制的效果,子工程根据需要复制部分的依赖 -->
<dependencyManagement>
<dependencies>
<!-- 时间操作组件 -->
<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-net</groupId>
<artifactId>commons-net</artifactId>
<version>${commons-net.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>
<!-- quartz任务调度框架 -->
<dependency>
<groupId>org.quartz-scheduler</groupId>
<artifactId>quartz</artifactId>
<version>${quartz.version}</version>
</dependency>
<!-- 单元测试 -->
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>${junit.version}</version>
<scope>test</scope>
</dependency>
<!-- 日志处理 -->
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-log4j12</artifactId>
<version>${slf4j.version}</version>
</dependency>
<!-- Mybatis -->
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>${mybatis.version}</version>
</dependency>
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis-spring</artifactId>
<version>${mybatis.spring.version}</version>
</dependency>
<!-- 分页相关 -->
<dependency>
<groupId>com.github.miemiedev</groupId>
<artifactId>mybatis-paginator</artifactId>
<version>${mybatis.paginator.version}</version>
</dependency>
<dependency>
<groupId>com.github.pagehelper</groupId>
<artifactId>pagehelper</artifactId>
<version>${pagehelper.version}</version>
</dependency>
<!-- MySql -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>${mysql.version}</version>
</dependency>
<!-- 最牛逼的连接池 -->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid</artifactId>
<version>${druid.version}</version>
</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>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-jms</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context-support</artifactId>
<version>${spring.version}</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>commons-fileupload</groupId>
<artifactId>commons-fileupload</artifactId>
<version>${commons-fileupload.version}</version>
</dependency>
<!-- Redis客户端 -->
<dependency>
<groupId>redis.clients</groupId>
<artifactId>jedis</artifactId>
<version>${jedis.version}</version>
</dependency>
<!-- solr客户端 -->
<dependency>
<groupId>org.apache.solr</groupId>
<artifactId>solr-solrj</artifactId>
<version>${solrj.version}</version>
</dependency>
<!-- dubbo相关 -->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>dubbo</artifactId>
<version>${dubbo.version}</version>
</dependency>
<dependency>
<groupId>org.apache.zookeeper</groupId>
<artifactId>zookeeper</artifactId>
<version>${zookeeper.version}</version>
</dependency>
<dependency>
<groupId>com.github.sgroschupf</groupId>
<artifactId>zkclient</artifactId>
<version>${zkclient.version}</version>
</dependency>
<dependency>
<groupId>org.apache.activemq</groupId>
<artifactId>activemq-all</artifactId>
<version>${activemq.version}</version>
</dependency>
<dependency>
<groupId>org.freemarker</groupId>
<artifactId>freemarker</artifactId>
<version>${freemarker.version}</version>
</dependency>
</dependencies>
</dependencyManagement>

<build>
<finalName>${project.artifactId}</finalName>
<plugins>
<!-- 资源文件拷贝插件 -->
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-resources-plugin</artifactId>
<version>2.7</version>
<configuration>
<encoding>UTF-8</encoding>
</configuration>
</plugin>
<!-- java编译插件 -->
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.2</version>
<configuration>
<source>1.8</source>
<target>1.8</target>
<encoding>UTF-8</encoding>
</configuration>
</plugin>
</plugins>
<!-- 插件版本的管理 -->
<pluginManagement>
<plugins>
<!-- 配置Tomcat插件 -->
<plugin>
<groupId>org.apache.tomcat.maven</groupId>
<artifactId>tomcat7-maven-plugin</artifactId>
<version>2.2</version>
<configuration>
<port>8080</port>
</configuration>
</plugin>

<!-- 配置打包时跳过测试 ,首次配置使用的时候会自动联网进行下载 -->
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-surefire-plugin</artifactId>
<version>2.12.4</version>
<configuration>
<skip>true</skip>
</configuration>
</plugin>
</plugins>
</pluginManagement>

<!-- 子工程需要覆写这个配置,该配置并不会继承到子工程。 -->
<resources>
<!-- 解决安装后java目录下的资源文件不发布的问题(默认maven是在resources下找资源文件) -->
<resource>
<directory>src/main/java</directory>
<includes>
<include>**/*.properties</include>
<include>**/*.xml</include>
</includes>
<filtering>false</filtering>
</resource>
<!-- 如果配置文件resources中也有,还需要配置这个 -->
<resource>
<directory>src/main/resources
</directory>
<includes>
<include>**/*.properties</include>
<include>**/*.xml</include>
</includes>
<filtering>false</filtering>
</resource>
</resources>
</build>
</project>

举例:taotao-manager的pom

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
<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>
<!-- 服务层工程。聚合工程。Pom工程 -->
<artifactId>taotao-manager</artifactId>
<version>0.0.1-SNAPSHOT</version>
<modules>
<module>taotao-manager-dao</module>
<module>taotao-manager-pojo</module>
<module>taotao-manager-interface</module>
<module>taotao-manager-service</module>
</modules>
<packaging>pom</packaging>

<parent>
<groupId>xyz.taotao</groupId>
<artifactId>taotao-parent</artifactId>
<version>0.0.1-SNAPSHOT</version>
</parent>

<dependencies>
<!-- 依赖通用工程 -->
<dependency>
<groupId>xyz.taotao</groupId>
<artifactId>taotao-common</artifactId>
<version>0.0.1-SNAPSHOT</version>
</dependency>
</dependencies>

</project>

taotao-manager-service 的 pom

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
<?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">
<parent>
<artifactId>taotao-manager</artifactId>
<groupId>xyz.taotao</groupId>
<version>0.0.1-SNAPSHOT</version>
</parent>
<modelVersion>4.0.0</modelVersion>

<artifactId>taotao-manager-service</artifactId>
<!-- service是以服务模块单独跑服务器的,需要打成war应用包。 -->
<packaging>war</packaging>

<dependencies>
<!-- 需要依赖dao模块 -->
<dependency>
<groupId>xyz.taotao</groupId>
<artifactId>taotao-manager-dao</artifactId>
<version>0.0.1-SNAPSHOT</version>
</dependency>
<!-- 需要依赖接口模块 -->
<dependency>
<groupId>xyz.taotao</groupId>
<artifactId>taotao-manager-interface</artifactId>
<version>0.0.1-SNAPSHOT</version>
</dependency>
<!-- Spring -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-beans</artifactId>
<!-- 版本已经在parent控制了,这里添加也无效! -->
</dependency>
......
<!-- 添加dubbo依赖 -->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>dubbo</artifactId>
<!-- 排除依赖 -->
<exclusions>
<exclusion>
<groupId>org.springframework</groupId>
<artifactId>spring</artifactId>
</exclusion>
<exclusion>
<groupId>org.jboss.netty</groupId>
<artifactId>netty</artifactId>
</exclusion>
</exclusions>
</dependency>
......
</dependencies>

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

使用tomcat的Maven插件启动

1
2
3
4
5
6
7
8
9
10
11
12
<build>
<plugins>
<plugin>
<groupId>org.apache.tomcat.maven</groupId>
<artifactId>tomcat7-maven-plugin</artifactId>
<version>2.2</version>
<configuration>
<port>8081</port>
</configuration>
</plugin>
</plugins>
</build>

Alt text

  注:启动之前需要编译+安装模块到本地仓库,并且注意根据模块的层级关系确保安装的顺序! 不想安装过程测试、资源文件拷贝不上等配置参考parent pom

dubbo、zookepper

SOA架构,表现层和服务层是不同的工程。某些需求的实现需要两个系统之间进行通信。Dubbo便是这类框架之一

  • DUBBO是一个分布式服务框架,致力于提供高性能和透明化的RPC远程服务调用方案,是阿里巴巴SOA服务化治理方案的核心框架。
  • Dubbo是资源调度和治理中心的管理工具。
  • Dubbo 是类似于webservice的关于系统之间通信的框架,并可以统计和管理服务之间的调用情况(包括服务被谁调用了,调用的次数是如何,以及服务的使用状况)。

dubbo的架构

Alt text

Provider: 暴露服务的服务提供方。
Consumer: 调用远程服务的服务消费方。
Registry: 服务注册与发现的注册中心。
Monitor: 统计服务的调用次调和调用时间的监控中心。
Container: 服务运行容器。

接入spring

提供服务:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
<?xml version="1.0" encoding="UTF-8"?>
<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:dubbo="http://code.alibabatech.com/schema/dubbo" 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.2.xsd
http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.2.xsd
http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-4.2.xsd
http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-4.2.xsd
http://code.alibabatech.com/schema/dubbo http://code.alibabatech.com/schema/dubbo/dubbo.xsd
http://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util-4.2.xsd">

<context:component-scan base-package="xyz.taotao.service"></context:component-scan>

<!-- 使用 dubbo 发布服务 -->
<!-- 提供方应用信息,用于计算依赖关系 -->
<dubbo:application name="taotao-manager"/>
<dubbo:registry protocol="zookeeper" address="192.168.184.130:2181"/>

<!-- 用dubbo协议在20880端口暴露服务 -->
<dubbo:protocol name="dubbo" port="20880"/>

<!-- 声明需要暴露的服务接口 -->
<dubbo:service interface="xyz.taotao.service.TestService" ref="testServiceImpl"></dubbo:service>
<dubbo:service interface="xyz.taotao.service.ItemService" ref="itemServiceImpl"></dubbo:service>
</beans>

引入服务:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
<?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:dubbo="http://code.alibabatech.com/schema/dubbo"
xmlns:mvc="http://www.springframework.org/schema/mvc"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.2.xsd
http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc-4.2.xsd
http://code.alibabatech.com/schema/dubbo http://code.alibabatech.com/schema/dubbo/dubbo.xsd
http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.2.xsd">


<!-- 引用dubbo服务 -->
<dubbo:application name="taotao-manager-web"/>
<dubbo:registry protocol="zookeeper" address="192.168.184.130:2181"/>

<!-- 引用指定的服务接口 -->
<dubbo:reference interface="xyz.taotao.service.TestService" id="testService"></dubbo:reference>
<dubbo:reference interface="xyz.taotao.service.ItemService" id="itemService"></dubbo:reference>
<dubbo:reference interface="xyz.taotao.content.service.ContentService" id="contentService"></dubbo:reference>
<dubbo:reference interface="xyz.taotao.content.service.ContentCategoryService" id="contentCategoryService"></dubbo:reference>
</beans>
注意模块之间的依赖关系!

注册中心 zookepper

  注册中心负责服务地址的注册与查找,相当于目录服务,服务提供者和消费者只在启动时与注册中心交互,注册中心不转发请求,压力较小。使用dubbo-2.3.3以上版本,官方建议使用zookeeper作为注册中心。

在linux中安装zookepper

第一步:安装jdk
第二步:解压缩zookeeper压缩包
第三步:将conf文件夹下zoo_sample.cfg复制一份,改名为zoo.cfg
第四步:修改配置dataDir属性,指定一个真实目录(进入zookeeper解压目录,创建data目录:mkdir data)
第五步:
启动zookeeper:bin/zkServer.sh start
关闭zookeeper:bin/zkServer.sh stop
查看zookeeper状态:bin/zkServer.sh status
注意开放防火墙的端口:
    查看防火墙:service iptables status
    添加规则:vim /etc/sysconfig/iptables
    添加之后刷新配置:scource /etc/sysconfig/iptables

监控中心安装

  参考上一篇:https://www.yuzh.xyz/2018/07/06/dubbo%E7%9B%91%E6%8E%A7%E4%B8%AD%E5%BF%83-dubbo-admin-war%E7%9A%84%E6%89%93%E5%8C%85%E5%92%8C%E9%83%A8%E7%BD%B2/

多工程之间的整合

  • dao模块管理dao层,放映射文件。
  • interface(分为dao-interface、service-interface)模块管理接口,放接口。
  • service模块管理service层,放SqlMapConfig.xml、连接池、sessionFactory、事务、dobbo服务等等…
  • web模块管理controller层,放web.xml、spring、mvc、dubbo相关…

MyBatis逆向工程

就是导入一个工程,配置一下,生成数据库中对应的pojo和mapper

pom

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
<?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">
<parent>
<artifactId>taotao-parent</artifactId>
<groupId>xyz.taotao</groupId>
<version>0.0.1-SNAPSHOT</version>
</parent>
<modelVersion>4.0.0</modelVersion>

<artifactId>MybatisGenerator</artifactId>

<dependencies>
<dependency>
<groupId>org.mybatis.generator</groupId>
<artifactId>mybatis-generator-core</artifactId>
<version>1.3.6</version>
</dependency>
</dependencies>

<build>
<plugins>
<!-- 生成插件 -->
<plugin>
<groupId>org.mybatis.generator</groupId>
<artifactId>mybatis-generator-maven-plugin</artifactId>
<version>1.3.2</version>
<configuration>
<!--配置文件的位置-->
<configurationFile>src/main/resources/generatorConfig.xml</configurationFile>
<verbose>true</verbose>
<overwrite>true</overwrite>
</configuration>
<executions>
<execution>
<id>Generate MyBatis Artifacts</id>
<goals>
<goal>generate</goal>
</goals>
</execution>
</executions>
<dependencies>
<dependency>
<groupId>org.mybatis.generator</groupId>
<artifactId>mybatis-generator-core</artifactId>
<version>1.3.2</version>
</dependency>
</dependencies>
</plugin>
</plugins>
</build>
</project>

配置生成规则:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE generatorConfiguration
PUBLIC "-//mybatis.org//DTD MyBatis Generator Configuration 1.0//EN"
"http://mybatis.org/dtd/mybatis-generator-config_1_0.dtd">

<generatorConfiguration>
<!--mysql 连接数据库jar 这里选择自己本地位置-->
<classPathEntry location="H:/[ 包 ] Lib/Other/mysql-connector-java-5.1.7-bin.jar"/>
<context id="testTables" targetRuntime="MyBatis3">
<commentGenerator>
<!-- 是否去除自动生成的注释 true:是 : false:否 -->
<property name="suppressAllComments" value="true"/>
</commentGenerator>
<!--数据库连接的信息:驱动类、连接地址、用户名、密码 -->
<jdbcConnection driverClass="com.mysql.jdbc.Driver"
connectionURL="jdbc:mysql://localhost:3306/taotao" userId="root"
password="admin">
</jdbcConnection>
<!-- 默认false,把JDBC DECIMAL 和 NUMERIC 类型解析为 Integer,为 true时把JDBC DECIMAL 和
NUMERIC 类型解析为java.math.BigDecimal -->
<javaTypeResolver>
<property name="forceBigDecimals" value="false"/>
</javaTypeResolver>

<!-- targetProject:生成PO类的位置 -->
<javaModelGenerator targetPackage="xyz.yuzh.pojo"
targetProject="src/main/java">
<!-- enableSubPackages:是否让schema作为包的后缀 -->
<property name="enableSubPackages" value="false"/>
<!-- 从数据库返回的值被清理前后的空格 -->
<property name="trimStrings" value="true"/>
</javaModelGenerator>
<!-- targetProject:mapper映射文件生成的位置
如果maven工程只是单独的一个工程,targetProject="src/main/java"
若果maven工程是分模块的工程,targetProject="所属模块的名称",例如:
targetProject="ecps-manager-mapper",下同-->
<sqlMapGenerator targetPackage="xyz.yuzh.mapper"
targetProject="src/main/java">
<!-- enableSubPackages:是否让schema作为包的后缀 -->
<property name="enableSubPackages" value="false"/>
</sqlMapGenerator>
<!-- targetPackage:mapper接口生成的位置 -->
<javaClientGenerator type="XMLMAPPER"
targetPackage="xyz.yuzh.mapper"
targetProject="src/main/java">
<!-- enableSubPackages:是否让schema作为包的后缀 -->
<property name="enableSubPackages" value="false"/>
</javaClientGenerator>
<!-- 指定数据库表 -->
<table schema="" tableName="tb_content"></table>
<table schema="" tableName="tb_content_category"></table>
<table schema="" tableName="tb_item"></table>
<table schema="" tableName="tb_item_cat"></table>
<table schema="" tableName="tb_item_desc"></table>
<table schema="" tableName="tb_item_param"></table>
<table schema="" tableName="tb_item_param_item"></table>
<table schema="" tableName="tb_order"></table>
<table schema="" tableName="tb_order_item"></table>
<table schema="" tableName="tb_order_shipping"></table>
<table schema="" tableName="tb_user"></table>
</context>
</generatorConfiguration>

点击插件运行->自动生成pojo和mapper在指定位置。
Alt text
然后复制到自己需要的工程里面,注意:没有自动实现序列化。
参考地址:https://blog.csdn.net/liudongdong0909/article/details/51534735

PageHelper

导包之后在Mybatis的全局文件中配置SqlMapConfig.xml中配置拦截器插件
1
2
3
4
5
6
<plugins>
<plugin interceptor="com.github.pagehelper.PageHelper">
<!-- 设置数据库类型 Oracle,Mysql,MariaDB,SQLite,Hsqldb,PostgreSQL六种数据库-->
<property name="dialect" value="mysql"/>
</plugin>
</plugins>

测试代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
package xyz.taotao.pagehelper;

import com.github.pagehelper.PageHelper;
import com.github.pagehelper.PageInfo;
import org.junit.Test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import xyz.taotao.mapper.TbItemMapper;
import xyz.taotao.pojo.TbItem;
import xyz.taotao.pojo.TbItemExample;

import java.util.List;

/**
* Created with IntelliJ IDEA.
*
* @Author: yu_zh
* @DateTime: 2018/07/05 14:36
*/
public class TestPageHelper {

@Test
public void testPageHelper() {
//初始化spring容器
ApplicationContext ac = new ClassPathXmlApplicationContext("spring-dao.xml");
//获取mapper代理对象
TbItemMapper tbItemMapper = ac.getBean(TbItemMapper.class);
//设置分页信息
PageHelper.startPage(3, 100);
//调用mapper方法查询数据
//查询条件对象
TbItemExample tbItemExample = new TbItemExample();
TbItemExample.Criteria criteria = tbItemExample.createCriteria();
//创建时间不为空才查询,免去了mapper中编辑sql
criteria.andCreatedIsNotNull();
//第一个查询列表被分页
List<TbItem> tbItemList = tbItemMapper.selectByExample(tbItemExample);
//第二个不会被分页
List<TbItem> tbItemList2 = tbItemMapper.selectByExample(tbItemExample);
//获取分页信息
PageInfo<TbItem> tbItemPageInfo = new PageInfo<>(tbItemList);
//遍历信息列表
tbItemPageInfo.getList();
System.out.println("被分页后条数:"+tbItemPageInfo.getEndRow());
System.out.println("总记录数"+tbItemPageInfo.getTotal());
System.out.println("页数"+tbItemPageInfo.getPages());
System.out.println("当前页"+tbItemPageInfo.getPageNum());
System.out.println("页大小"+tbItemPageInfo.getPageSize());

int i = 1;
for (TbItem item : tbItemList2) {
i++;
}
System.out.println("全部条数:"+i);
}
}

了解SEO

  百度这样的搜索引擎对于.html后缀的网页的搜索排名优先级是高于jsp的,我们可以在不改变网页是jsp格式的前提下,通过控制springmvc拦截.html请求达到浏览器始终都是.html后缀显示的效果。
比如:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
<?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" xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
id="WebApp_ID" version="2.5">
<welcome-file-list>
<welcome-file>/index.html</welcome-file>
</welcome-file-list>

<!-- spring-mvc -->
<servlet>
......
</servlet>
<servlet-mapping>
<servlet-name>....</servlet-name>
<!-- 伪静态化:SEO 搜索引擎优化-->
<url-pattern>*.html</url-pattern>
</servlet-mapping>
</web-app>
1
2
3
4
5
页面控制器:
@RequestMapping(value = "/index",method = RequestMethod.GET)
public String index(){
return "index";
}

访问一个站点的主页,用户一般都是 http://www.yuzh.xyz/ 或者有经验一点的会这样 http://www.yuzh.xyz/index.html

通常情况下,mvc的拦截形式是 / ,表示拦截所有非 jsp\html的资源访问请求,这时//index.html两者的效果可能不一样。

如果主页在/WEB-INF/下,/index.html是会报404的,只有以/形式通过控制器跳转到主页。

回到伪静态化的话题,既然要实现伪静态化,就必须把拦截形式设为*.html,那么当用户输入两种不同的url是怎么跳转到主页的呢?

1)当输入地址/,mvc没有拦截到,转而找欢迎页<welcome-file>/index.html</welcome-file>,于是找/index.html,如果webapps下有页面就直接返回,如果没有就进入到mvc(此时已经被mvc拦截到了),前面mvc配置了@RequestMapping(value ="/index"),于是进入了控制器方法,最终在控制器中跳转页面。

2)当输入地址/index.html,直接被mvc所拦截,不需要进欢迎页,直接到了控制器跳转页面。

3)注意:配置伪静态化后,url地址必须以.html才能访问资源。访问控制器的方法需要”映射路径+.html“,比如:@RequestMapping(value = “/getList”),访问这个方法需要”getList.html“的形式,很奇怪哦~ 不然无法被拦截到啊!

内容管理系统 — 抽取抽象表

违反了数据库范式,但以便于开发 

1) 随着硬件水平的迅猛发展,硬件成本的降低,数据库范式和开发效率上大多数情况下选择后者,现代企业开发中,通常会为了简单有效的管理数据和应用系统的效率,违反三大范式的要求,以空间换时间。
2) 内容管理系统(content management system,CMS)是一种位于WEB 前端(Web 服务器)和后端办公系统或流程(内容创作、编辑)之间的软件系统。内容的创作人员、编辑人员、发布人员使用内容管理系统来提交、修改、审批、发布内容。这里指的“内容”可能包括文件、表格、图片、数据库中的数据甚至视频等一切你想要发布到Internet网站的信息。
3) 就是后台管理维护前台的页面和页面中的内容可以动态展示。

栗子:本商城的门户系统首页中存在多个小板块,比如大广告位、淘淘快报、商品展示位…如果对于每一个小板块都创建一张表进行维护将会十分的麻烦,前台一个页面调整(增加删除修改),后台对应将会是pojo、mapper、dao、service、controller都要改动,于是试着把这些所有板块抽取一张统一的分类表。

把首页的每个展示功能(大广告位,淘淘快报等),看作是一个分类,每个展示功能里面展示的多条信息,看作是分类下的内容。

例如:首页大广告,对应的是大广告分类,而大广告位展示的多张图片,就是大广告分类下的内容,前台需要获取大广告的图片,只需要根据大广告的id查询对应的内容即可。

内容分类表:tb_content_category,需要存储树形结构的数据。(大分类下有小分类)
Alt text

内容表:tb_content,将所有信息统一到一张表。
Alt text

比如有些板块不需要`price`这个字段,当字段不足时,就用该字段存点其他的。

mapper中使用“主键返回”

在自动生成的sql中添加 <selectKey/> 节点:

1
2
3
4
5
6
7
8
9
10
11
<insert id="insert" parameterType="xyz.taotao.pojo.TbContentCategory" >
<selectKey keyProperty="id" resultType="long" order="AFTER">
select last_insert_id();
</selectKey>
insert into tb_content_category (id, parent_id, name,
status, sort_order, is_parent,
created, updated)
values (#{id,jdbcType=BIGINT}, #{parentId,jdbcType=BIGINT}, #{name,jdbcType=VARCHAR},
#{status,jdbcType=INTEGER}, #{sortOrder,jdbcType=INTEGER}, #{isParent,jdbcType=BIT},
#{created,jdbcType=TIMESTAMP}, #{updated,jdbcType=TIMESTAMP})
</insert>

Comments

Your browser is out-of-date!

Update your browser to view this website correctly. Update my browser now

×