SSM(Spring+SpringMVC+Mybatis),目前較爲主流的企業級架構方案。標準的MVC設計模式,將整個系統劃分爲顯示層、Controller層、Service層、Dao層四層,使用SpringMVC負責請求的轉發和視圖管理,Spring實現業務對象管理, MyBatis作爲數據對象持久化引擎。
一. 框架詳情
Spring是一個輕量級的Java開發框架,它是爲了解決企業應用開發的複雜性而創建的。Spring的用途不僅限於服務器端的開發。從簡單性、可測試性和鬆耦合的角度而言,任何Java應用都可以從Spring中受益。 簡單來說,Spring是一個輕量級的控制反轉(IoC)和麪向切面(AOP)的容器框架
SpringMVC屬於SpringFrameWork的後續產品,分離了控制器、模型對象、分派器以及處理程序對象的角色,這種分離讓它們更容易進行定製
MyBatis是一個基於Java的持久層框架。MyBatis提供的持久層框架包括SQL Maps和Data Access Objects(DAO)它消除了幾乎所有的JDBC代碼和參數的手工設置以及結果集的檢索。MyBatis 使用簡單的 XML或註解用於配置和原始映射,將接口和 Java映射成數據庫中的記錄
二. 創建Maven項目
1、Eclipse中用Maven創建項目
2、按默認Next
3、找到maven-archetype-webapp後,點擊next
4、填寫相應的信息,GroupID是項目組織唯一的標識符,實際對應JAVA的包的結構。ArtifactID就是項目的唯一的標識符,實際對應項目的名稱,就是項目根目錄的名稱。Package填了默認給你建一個包,不寫也可以。
5、剛建好的目錄如下
6、Maven規定必須添加以下Source Folder:
src/main/resources
src/main/java
src/test/resources
src/test/java
在這步之前最好先項目上右鍵選擇properties,然後點擊java build path,在Librarys下,編輯JRE System Library,選擇workspace default jre。
7、分別修改輸出路徑爲,對應關係如下:
8、將項目轉換成Dynamic Web Project,在項目上右鍵Properties,在左側選擇 Project Facets。
9、設置部署時的文件發佈路徑,刪除test的兩項,因爲test是測試使用,並不需要部署。
設置將Maven的jar包發佈到lib下。Add -> Java Build Path Entries -> Maven Dependencies -> Finish
三. Maven引入需要的JAR包
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
|
<
project
xmlns
=
"http://maven.apache.org/POM/4.0.0"
xmlns:xsi
=
"http://www.w3.org/2001/XMLSchema-instance"
<
modelVersion
>4.0.0</
modelVersion
>
<
groupId
>com.yingjun.test</
groupId
>
<
artifactId
>TradingState</
artifactId
>
<
packaging
>war</
packaging
>
<
version
>2.0.1</
version
>
<
properties
>
<
project.build.sourceEncoding
>UTF-8</
project.build.sourceEncoding
>
<
maven.build.timestamp.format
>yyyyMMddHHmmss</
maven.build.timestamp.format
>
<
spring.version
>3.2.9.RELEASE</
spring.version
>
<
mybatis.version
>3.1.1</
mybatis.version
>
<
mybatisspring.version
>1.1.1</
mybatisspring.version
>
</
properties
>
<
dependencies
>
<
dependency
>
<
groupId
>org.springframework</
groupId
>
<
artifactId
>spring-core</
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-test</
artifactId
>
<
version
>${spring.version}</
version
>
</
dependency
>
<
dependency
>
<
groupId
>org.mybatis</
groupId
>
<
artifactId
>mybatis</
artifactId
>
<
version
>${mybatis.version}</
version
>
</
dependency
>
<
dependency
>
<
groupId
>org.mybatis</
groupId
>
<
artifactId
>mybatis-spring</
artifactId
>
<
version
>${mybatisspring.version}</
version
>
</
dependency
>
<
dependency
>
<
groupId
>mysql</
groupId
>
<
artifactId
>mysql-connector-java</
artifactId
>
<
version
>5.1.34</
version
>
</
dependency
>
<
dependency
>
<
groupId
>junit</
groupId
>
<
artifactId
>junit</
artifactId
>
<
version
>4.11</
version
>
<
scope
>test</
scope
>
</
dependency
>
<
dependency
>
<
groupId
>c3p0</
groupId
>
<
artifactId
>c3p0</
artifactId
>
<
version
>0.9.1.2</
version
>
</
dependency
>
<
dependency
>
<
groupId
>org.aspectj</
groupId
>
<
artifactId
>aspectjweaver</
artifactId
>
<
version
>1.8.1</
version
>
</
dependency
>
<
dependency
>
<
groupId
>javax.servlet</
groupId
>
<
artifactId
>jstl</
artifactId
>
<
version
>1.2</
version
>
</
dependency
>
<
dependency
>
<
groupId
>javax.servlet</
groupId
>
<
artifactId
>servlet-api</
artifactId
>
<
version
>3.0</
version
>
<
scope
>provided</
scope
>
</
dependency
>
<
dependency
>
<
groupId
>javax.servlet.jsp</
groupId
>
<
artifactId
>jsp-api</
artifactId
>
<
version
>2.2</
version
>
<
scope
>provided</
scope
>
</
dependency
>
<
dependency
>
<
groupId
>commons-fileupload</
groupId
>
<
artifactId
>commons-fileupload</
artifactId
>
<
version
>1.3.1</
version
>
</
dependency
>
<
dependency
>
<
groupId
>commons-lang</
groupId
>
<
artifactId
>commons-lang</
artifactId
>
<
version
>2.6</
version
>
</
dependency
>
<
dependency
>
<
groupId
>commons-codec</
groupId
>
<
artifactId
>commons-codec</
artifactId
>
<
version
>1.9</
version
>
</
dependency
>
<
dependency
>
<
groupId
>org.apache.httpcomponents</
groupId
>
<
artifactId
>httpclient</
artifactId
>
<
version
>4.5</
version
>
</
dependency
>
<
dependency
>
<
groupId
>org.slf4j</
groupId
>
<
artifactId
>slf4j-api</
artifactId
>
<
version
>1.7.10</
version
>
</
dependency
>
<
dependency
>
<
groupId
>org.slf4j</
groupId
>
<
artifactId
>slf4j-log4j12</
artifactId
>
<
version
>1.7.10</
version
>
</
dependency
>
<
dependency
>
<
groupId
>log4j</
groupId
>
<
artifactId
>log4j</
artifactId
>
<
version
>1.2.17</
version
>
</
dependency
>
<
dependency
>
<
groupId
>com.alibaba</
groupId
>
<
artifactId
>fastjson</
artifactId
>
<
version
>1.1.41</
version
>
</
dependency
>
<
dependency
>
<
groupId
>org.codehaus.jackson</
groupId
>
<
artifactId
>jackson-mapper-asl</
artifactId
>
<
version
>1.9.13</
version
>
</
dependency
>
</
dependencies
>
<
build
>
<
plugins
>
<
plugin
>
<
artifactId
>maven-compiler-plugin</
artifactId
>
<
version
>2.3.2</
version
>
<
configuration
>
<
source
>1.7</
source
>
<
target
>1.7</
target
>
</
configuration
>
</
plugin
>
<
plugin
>
<
artifactId
>maven-war-plugin</
artifactId
>
<
version
>2.2</
version
>
<
configuration
>
<
version
>3.0</
version
>
<
failOnMissingWebXml
>false</
failOnMissingWebXml
>
</
configuration
>
</
plugin
>
</
plugins
>
<
finalName
>${project.artifactId}_${project.version}_${maven.build.timestamp}</
finalName
>
</
build
>
</
project
>
|
四. 相關配置文件配置,整合SSM框架
web.xml
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"
?>
xsi:schemaLocation
=
"http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd"
version
=
"2.4"
>
<!-- 配置 Spring -->
<
context-param
>
<
param-name
>contextConfigLocation</
param-name
>
<
param-value
>classpath:spring.xml</
param-value
>
</
context-param
>
<
listener
>
<
listener-class
>org.springframework.web.context.ContextLoaderListener</
listener-class
>
</
listener
>
<!-- 防止Spring內存溢出監聽器 -->
<
listener
>
<
listener-class
>org.springframework.web.util.IntrospectorCleanupListener</
listener-class
>
</
listener
>
<!-- 配置springmvc -->
<
servlet
>
<
servlet-name
>springMVC</
servlet-name
>
<
servlet-class
>org.springframework.web.servlet.DispatcherServlet</
servlet-class
>
<
init-param
>
<
param-name
>contextConfigLocation</
param-name
>
<
param-value
>classpath:spring-mvc.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
>
<!-- 字符集過濾器 -->
<
filter
>
<
filter-name
>encodingFilter</
filter-name
>
<
filter-class
>org.springframework.web.filter.CharacterEncodingFilter</
filter-class
>
<
init-param
>
<
param-name
>encoding</
param-name
>
<
param-value
>UTF-8</
param-value
>
</
init-param
>
<
init-param
>
<
param-name
>forceEncoding</
param-name
>
<
param-value
>true</
param-value
>
</
init-param
>
</
filter
>
<
filter-mapping
>
<
filter-name
>encodingFilter</
filter-name
>
<
url-pattern
>/*</
url-pattern
>
</
filter-mapping
>
</
web-app
>
|
spring.xml
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
|
<?
xml
version
=
"1.0"
encoding
=
"UTF-8"
?>
xmlns:xsi
=
"http://www.w3.org/2001/XMLSchema-instance"
xmlns:mvc
=
"http://www.springframework.org/schema/mvc"
xmlns:aop
=
"http://www.springframework.org/schema/aop"
xmlns:tx
=
"http://www.springframework.org/schema/tx"
xsi:schemaLocation="http://www.springframework.org/schema/beans
<!-- 掃描service、dao組件 -->
<
context:component-scan
base-package
=
"com.yingjun.test"
/>
<!-- 分解配置 jdbc.properites -->
<
context:property-placeholder
location
=
"classpath:jdbc.properties"
/>
<!-- 數據源c3p0 -->
<
bean
id
=
"dataSource"
class
=
"com.mchange.v2.c3p0.ComboPooledDataSource"
>
<
property
name
=
"driverClass"
value
=
"${jdbc.driverClassName}"
/>
<
property
name
=
"jdbcUrl"
value
=
"${jdbc.url}"
/>
<
property
name
=
"user"
value
=
"${jdbc.username}"
/>
<
property
name
=
"password"
value
=
"${jdbc.password}"
/>
<
property
name
=
"maxPoolSize"
value
=
"${c3p0.pool.size.max}"
/>
<
property
name
=
"minPoolSize"
value
=
"${c3p0.pool.size.min}"
/>
<
property
name
=
"initialPoolSize"
value
=
"${c3p0.pool.size.ini}"
/>
<
property
name
=
"acquireIncrement"
value
=
"${c3p0.pool.size.increment}"
/>
</
bean
>
<!-- sessionFactory 將spring和mybatis整合 -->
<
bean
id
=
"sqlSessionFactory"
class
=
"org.mybatis.spring.SqlSessionFactoryBean"
>
<
property
name
=
"dataSource"
ref
=
"dataSource"
/>
<
property
name
=
"configLocation"
value
=
"classpath:spring-mybatis.xml"
/>
<
property
name
=
"mapperLocations"
value
=
"classpath*:com/yingjun/test/mapping/**/*.xml"
/>
</
bean
>
<
bean
class
=
"org.mybatis.spring.mapper.MapperScannerConfigurer"
>
<
property
name
=
"basePackage"
value
=
"com,yingjun.test.dao"
/>
<
property
name
=
"sqlSessionFactoryBeanName"
value
=
"sqlSessionFactory"
/>
</
bean
>
<
bean
id
=
"transactionManager"
class
=
"org.springframework.jdbc.datasource.DataSourceTransactionManager"
>
<
property
name
=
"dataSource"
ref
=
"dataSource"
/>
</
bean
>
<
tx:advice
id
=
"transactionAdvice"
transaction-manager
=
"transactionManager"
>
<
tx:attributes
>
<
tx:method
name
=
"add*"
propagation
=
"REQUIRED"
/>
<
tx:method
name
=
"append*"
propagation
=
"REQUIRED"
/>
<
tx:method
name
=
"insert*"
propagation
=
"REQUIRED"
/>
<
tx:method
name
=
"save*"
propagation
=
"REQUIRED"
/>
<
tx:method
name
=
"update*"
propagation
=
"REQUIRED"
/>
<
tx:method
name
=
"modify*"
propagation
=
"REQUIRED"
/>
<
tx:method
name
=
"edit*"
propagation
=
"REQUIRED"
/>
<
tx:method
name
=
"delete*"
propagation
=
"REQUIRED"
/>
<
tx:method
name
=
"remove*"
propagation
=
"REQUIRED"
/>
<
tx:method
name
=
"repair"
propagation
=
"REQUIRED"
/>
<
tx:method
name
=
"delAndRepair"
propagation
=
"REQUIRED"
/>
<
tx:method
name
=
"get*"
propagation
=
"SUPPORTS"
/>
<
tx:method
name
=
"find*"
propagation
=
"SUPPORTS"
/>
<
tx:method
name
=
"load*"
propagation
=
"SUPPORTS"
/>
<
tx:method
name
=
"search*"
propagation
=
"SUPPORTS"
/>
<
tx:method
name
=
"datagrid*"
propagation
=
"SUPPORTS"
/>
<
tx:method
name
=
"*"
propagation
=
"SUPPORTS"
/>
</
tx:attributes
>
</
tx:advice
>
<
aop:config
>
<
aop:pointcut
id
=
"transactionPointcut"
expression
=
"execution(* com.yingjun.test.service..*Impl.*(..))"
/>
<
aop:advisor
pointcut-ref
=
"transactionPointcut"
advice-ref
=
"transactionAdvice"
/>
</
aop:config
>
</
beans
>
|
爲了代替手工使用 SqlSessionDaoSupport 或 SqlSessionTemplate 編寫數據訪問對象 (DAO)的代碼,MyBatis-Spring 提供了一個動態代理的實現:MapperFactoryBean。這個類 可以讓你直接注入數據映射器接口到你的 service 層 bean 中。當使用映射器時,你僅僅如調 用你的 DAO 一樣調用它們就可以了,但是你不需要編寫任何 DAO 實現的代碼,因爲 MyBatis-Spring 將會爲你創建代理。
spring-mybatis.xml
1
2
3
4
5
|
<?
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
>
<!-- 暫時不需要其他配置-->
</
configuration
>
|
spring-mvc.xml
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
|
<?
xml
version
=
"1.0"
encoding
=
"UTF-8"
?>
xmlns:xsi
=
"http://www.w3.org/2001/XMLSchema-instance"
xmlns:p
=
"http://www.springframework.org/schema/p"
xsi:schemaLocation="
<!-- 默認的註解映射的支持 -->
<
mvc:annotation-driven
/>
<!-- 自動掃描該包,使SpringMVC認爲包下用了@controller註解的類是控制器 -->
<
context:component-scan
base-package
=
"com.yingjun.test.controller"
/>
<!--避免IE執行AJAX時,返回JSON出現下載文件 -->
<
bean
id
=
"mappingJacksonHttpMessageConverter"
class
=
"org.springframework.http.converter.json.MappingJacksonHttpMessageConverter"
>
<
property
name
=
"supportedMediaTypes"
>
<
list
>
<
value
>text/html;charset=UTF-8</
value
>
</
list
>
</
property
>
</
bean
>
<!-- 定義跳轉的文件的前後綴 ,視圖模式配置 -->
<
bean
class
=
"org.springframework.web.servlet.view.InternalResourceViewResolver"
>
<!-- 這裏的配置我的理解是自動給後面action的方法return的字符串加上前綴和後綴,變成一個 可用的url地址 -->
<
property
name
=
"prefix"
value
=
"/WEB-INF/jsp/"
/>
<
property
name
=
"suffix"
value
=
".jsp"
/>
</
bean
>
<!-- 配置文件上傳,如果沒有使用文件上傳可以不用配置,當然如果不配,那麼配置文件中也不必引入上傳組件包 -->
<
bean
id
=
"multipartResolver"
class
=
"org.springframework.web.multipart.commons.CommonsMultipartResolver"
>
<!-- 默認編碼 -->
<
property
name
=
"defaultEncoding"
value
=
"utf-8"
/>
<!-- 文件大小最大值 -->
<
property
name
=
"maxUploadSize"
value
=
"10485760000"
/>
<!-- 內存中的最大值 -->
<
property
name
=
"maxInMemorySize"
value
=
"40960"
/>
</
bean
>
</
beans
>
|
log4j.properties
1
2
3
4
5
6
7
8
9
|
jdbc.driverClassName=com.mysql.jdbc.Driver
jdbc.username=root
jdbc.password=root
c3p0.pool.size.max=20
c3p0.pool.size.min=5
c3p0.pool.size.ini=3
c3p0.pool.size.increment=2
|
jdbc.properties
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
|
log4j.rootLogger=info, console, debug, app, error
###Console ###
log4j.appender.console = org.apache.log4j.ConsoleAppender
log4j.appender.console.Target = System.out
log4j.appender.console.layout = org.apache.log4j.PatternLayout
log4j.appender.console.layout.ConversionPattern = %d %p[%C:%L]- %m%n
### debug ###
log4j.appender.debug = org.apache.log4j.DailyRollingFileAppender
log4j.appender.debug.File = log/debug.log
log4j.appender.debug.Append = true
log4j.appender.debug.Threshold = DEBUG
log4j.appender.debug.DatePattern='.'yyyy-MM-dd
log4j.appender.debug.layout = org.apache.log4j.PatternLayout
log4j.appender.debug.layout.ConversionPattern = %d %p[%c:%L] - %m%n
### app ###
log4j.appender.app = org.apache.log4j.DailyRollingFileAppender
log4j.appender.app.File = log/app.log
log4j.appender.app.Append = true
log4j.appender.app.Threshold = INFO
log4j.appender.app.DatePattern='.'yyyy-MM-dd
log4j.appender.app.layout = org.apache.log4j.PatternLayout
log4j.appender.app.layout.ConversionPattern = %d %p[%c:%L] - %m%n
### Error ###
log4j.appender.error = org.apache.log4j.DailyRollingFileAppender
log4j.appender.error.File = log/error.log
log4j.appender.error.Append = true
log4j.appender.error.Threshold = ERROR
log4j.appender.error.DatePattern='.'yyyy-MM-dd
log4j.appender.error.layout = org.apache.log4j.PatternLayout
log4j.appender.error.layout.ConversionPattern =%d %p[%c:%L] - %m%n
|
五. 利用MyBatis Generator自動創建實體類、映射文件以及DAO接口
MyBatis屬於一種半自動的ORM框架,所以主要的工作就是配置Mapping映射文件,但是由於手寫映射文件很容易出錯,所以可利用MyBatis生成器自動生成實體類、DAO接口和Mapping映射文件。這樣可以省去很多的功夫,將生成的代碼copy到項目工程中即可。
生成代碼需要的文件和jar並建立如下目錄結構:
在generatorl.xml中配置相關的數據庫連接,已經數據庫表:
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
|
<?
xml
version
=
"1.0"
encoding
=
"UTF-8"
?>
<!DOCTYPE generatorConfiguration
PUBLIC "-//mybatis.org//DTD MyBatis Generator Configuration 1.0//EN"
<
generatorConfiguration
>
<!-- 數據庫驅動 -->
<
classPathEntry
location
=
"mysql-connector-java-5.1.34.jar"
/>
<
context
id
=
"DB2Tables"
targetRuntime
=
"MyBatis3"
>
<
commentGenerator
>
<
property
name
=
"suppressDate"
value
=
"true"
/>
<!-- 是否去除自動生成的註釋 true:是 : false:否 -->
<
property
name
=
"suppressAllComments"
value
=
"true"
/>
</
commentGenerator
>
<!--數據庫鏈接URL,用戶名、密碼 -->
<
jdbcConnection
driverClass
=
"com.mysql.jdbc.Driver"
userId
=
"root"
password
=
"root"
>
</
jdbcConnection
>
<
javaTypeResolver
>
<
property
name
=
"forceBigDecimals"
value
=
"false"
/>
</
javaTypeResolver
>
<!-- 生成模型的包名和位置 -->
<
javaModelGenerator
targetPackage
=
"com.yingjun.test.model"
targetProject
=
"src"
>
<
property
name
=
"enableSubPackages"
value
=
"true"
/>
<
property
name
=
"trimStrings"
value
=
"true"
/>
</
javaModelGenerator
>
<!-- 生成映射文件的包名和位置 -->
<
sqlMapGenerator
targetPackage
=
"com.yingjun.test.mapping"
targetProject
=
"src"
>
<
property
name
=
"enableSubPackages"
value
=
"true"
/>
|