SSM框架——(SpringMVC+Spring+MyBatis+Maven多模組)整合
SpringMVC + Spring + MyBatis + Maven多模組
- SpringMVC + Spring + MyBatis
- Maven多模組
- 什麼是SSM框架?
-
SpringMVC:
1.客戶端傳送請求到DispacherServlet(分發器)
2.由DispacherServlet控制器查詢HanderMapping,找到處理請求的Controller
3.Controller呼叫業務邏輯處理後,返回ModelAndView
4.DispacherSerclet查詢檢視解析器,找到ModelAndView指定的檢視
5.檢視負責將結果顯示到客戶端 -
Spring:
1.Spring是一個輕量級的控制反轉(IOC)和麵向切面(AOP)的容器架構,IOC容器包含並管理應用物件的配置和生命週期,你可以配置你的每個bean如何被建立,也可以配置每個bean是隻有一個例項,還是每次需要時都生成一個新的例項,以及它們是如何相互關聯的
2.IOC思想最核心的地方在於,資源不由使用資源的雙方管理,而由不使用資源的第三方管理,這可以帶來很多好處。第一,資源集中管理,實現資源的可配置和易管理。第二,降低了使用資源雙方的依賴程度,也就是我們說的耦合度
3.容器提供了AOP技術,利用它很容易實現如許可權攔截、執行期監控等功能 -
MyBatis:
1.MyBatis是支援普通SQL查詢,儲存過程和高階對映的優秀持久層框架。MyBatis消除了幾乎所有的JDBC程式碼和引數的手工設定以及結果集的檢索。MyBatis使用簡單的XML或註解用於配置和原始對映,將介面和Java的POJOs(Plan Old Java Objects,普通的Java物件)對映成資料庫中的記錄
2.MyBatis的操作都是圍繞一個sqlSessionFactory例項展開的。MyBatis通過配置檔案關聯到各實體類的Mapper檔案,Mapper檔案中配置了每個類對資料庫所需進行的sql語句對映。在每次與資料庫互動時,通過sqlSessionFactory拿到一個sqlSession,再執行sql命令 - 為什麼使用Maven多模組?
- JavaEE專案開發中為了便於後期的維護,一般會進行分層開發,分層之後,各個層之間的職責會比較明確,後期維護起來也相對比較容易
專案結構
.
└── ssm-parent
├── pom.xml # 父POM
├── ssm-common # 工具類
│ ├── pom.xml # 引入常用工具依賴
│ └── src
│ └── main
│ └── java
│ └── com # 具體程式碼
├── ssm-dao # 資料庫訪問層
│ ├── pom.xml # 描述工程資源的目錄,編譯打包 mapper.xml
│ └── src
│ └── main
│ └── java
│ └── com # 具體程式碼
├── ssm-domain # 域模型層
│ ├── pom.xml
│ └── src
│ └── main
│ └── java
│ └── com # 具體程式碼
├── ssm-service # 業務邏輯層
│ ├── pom.xml # 引入Spring、JDBC依賴
│ └── src
│ └── main
│ ├── java
│ │ └── com # 具體程式碼
│ └── resources
│ └── applicationContext-service.xml # 掃描註解配置
└── ssm-web # 表現層
├── pom.xml # 定義一些常量 [jdk version]
└── src
└── main
├── java
│ └── com
├── resources
│ ├── applicationContext-aop.xml # 事務配置檔案
│ ├── applicationContext.properties # 配置檔案
│ ├── applicationContext-thread.xml # 執行緒池配置檔案
│ ├── applicationContext-web.xml # Spring跳轉相關配置檔案
│ ├── applicationContext.xml # Spring配置檔案
│ ├── dataSource.xml # 連線池資料來源配置檔案
│ ├── log4j.properties # 日誌配置檔案
│ └── mybatis-config.xml # Mybatis配置檔案
└── webapp # Web靜態資原始檔
├── index.jsp
├── js
├── view
└── WEB-INF # Web應用程式配置檔案
建立Maven多模組專案
一、建立ssm-parent專案
建立 ssm-parent,用來給各個子模組繼承
使用 cmd
或者 Terminal
,進入命令列,輸入以下命令:
mvn archetype:generate -DgroupId=com.ryan -DartifactId=ssm-parent -DarchetypeArtifactId=maven-archetype-quickstart -DinteractiveMode=false
命令執行完成之後可以看到在當前目錄生成了ssm-parent目錄,裡面有一個src目錄和一個 pom.xml檔案,如下圖所示:
.
└── ssm-parent
├── pom.xml
└── src
將src資料夾刪除,然後修改pom.xml檔案,將<packaging>jar</packaging>
修改為<packaging>pom</packaging>
,pom表示它是一個被繼承的模組,修改後的內容如下:
<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/maven-v4_0_0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.ryan</groupId>
<artifactId>ssm-parent</artifactId>
<packaging>pom</packaging>
<version>1.0-SNAPSHOT</version>
<name>ssm-parent</name>
<url>http://maven.apache.org</url>
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>3.8.1</version>
<scope>test</scope>
</dependency>
</dependencies>
</project>
注:
- archetype:maven工程的模板工具包
- mvn archetype:generate:建立專案(在maven 3.02以下的版本,使用archetype:create 命令建立)
- DgroupId:組織ID
- DartifactId:專案ID
- DarchetypeArtifactId:工程型別
- DinteractiveMode:是否已互動模式進行,如果是false的話就會採用預設設定建立專案
二、建立ssm-domain模組
命令列進入建立好的ssm-parent目錄,然後執行下列命令:
mvn archetype:generate -DgroupId=com.ryan -DartifactId=ssm-domain -DarchetypeArtifactId=maven-archetype-quickstart -DinteractiveMode=false
命令執行完成之後可以看到在ssm-parent目錄中生成了ssm-domain,裡面包含src目錄和pom.xml檔案。如下圖所示:
ssm-domain
├── pom.xml
└── src
修改ssm-domain目錄中的pom.xml檔案,把<groupId>com.ryan</groupId>
和<version>1.0-SNAPSHOT</version>
去掉,加上<packaging>jar</packaging>
,因為groupId和version會繼承ssm-parent中的groupId和version,packaging設定打包方式為jar,修改過後的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.ryan</groupId>
<artifactId>ssm-parent</artifactId>
<version>1.0-SNAPSHOT</version>
</parent>
<artifactId>ssm-domain</artifactId>
<packaging>jar</packaging>
<name>ssm-domain</name>
<url>http://maven.apache.org</url>
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>3.8.1</version>
<scope>test</scope>
</dependency>
</dependencies>
</project>
三、建立ssm-common模組
命令列進入建立好的ssm-parent目錄,然後執行下列命令:
mvn archetype:generate -DgroupId=com.ryan -DartifactId=ssm-common -DarchetypeArtifactId=maven-archetype-quickstart -DinteractiveMode=false
修改ssm-common目錄中的pom.xml檔案,把<groupId>com.ryan</groupId>
和<version>1.0-SNAPSHOT</version>
去掉,加上<packaging>jar</packaging>
,因為groupId和version會繼承ssm-parent中的groupId和version,packaging設定打包方式為jar,修改後的內容如下:
<?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.ryan</groupId>
<artifactId>ssm-parent</artifactId>
<version>1.0-SNAPSHOT</version>
</parent>
<artifactId>ssm-common</artifactId>
<packaging>jar</packaging>
<name>ssm-common</name>
<url>http://maven.apache.org</url>
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>3.8.1</version>
<scope>test</scope>
</dependency>
</dependencies>
</project>
四、建立ssm-dao模組
命令列進入建立好的ssm-parent目錄,然後執行下列命令:
mvn archetype:generate -DgroupId=com.ryan -DartifactId=ssm-dao -DarchetypeArtifactId=maven-archetype-quickstart -DinteractiveMode=false
修改ssm-dao目錄中的pom.xml檔案,把<groupId>com.ryan</groupId>
和<version>1.0-SNAPSHOT</version>
去掉,加上<packaging>jar</packaging>
,因為groupId和version會繼承ssm-parent中的groupId和version,packaging設定打包方式為jar,同時新增對ssm-domain、ssm-common模組的依賴,修改後的內容如下:
<?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.ryan</groupId>
<artifactId>ssm-parent</artifactId>
<version>1.0-SNAPSHOT</version>
</parent>
<artifactId>ssm-dao</artifactId>
<packaging>jar</packaging>
<name>ssm-dao</name>
<url>http://maven.apache.org</url>
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>3.8.1</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>com.ryan</groupId>
<artifactId>ssm-domain</artifactId>
<version>${project.version}</version>
</dependency>
<dependency>
<groupId>com.ryan</groupId>
<artifactId>ssm-common</artifactId>
<version>${project.version}</version>
</dependency>
</dependencies>
</project>
五、建立ssm-service模組
命令列進入建立好的ssm-parent目錄,然後執行下列命令:
mvn archetype:generate -DgroupId=com.ryan -DartifactId=ssm-service -DarchetypeArtifactId=maven-archetype-quickstart -DinteractiveMode=false
修改ssm-service目錄中的pom.xml檔案,把<groupId>com.ryan</groupId>
和<version>1.0-SNAPSHOT</version>
去掉,加上<packaging>jar</packaging>
,因為groupId和version會繼承ssm-parent中的groupId和version,packaging設定打包方式為jar,同時新增對ssm-dao模組的依賴,ssm-service依賴ssm-dao、ssm-domain和ssm-common,但是我們只需新增ssm-dao的依賴即可,因為ssm-dao已經依賴了ssm-domain、ssm-common。修改後的內容如下:
<?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.ryan</groupId>
<artifactId>ssm-parent</artifactId>
<version>1.0-SNAPSHOT</version>
</parent>
<artifactId>ssm-service</artifactId>
<packaging>jar</packaging>
<name>ssm-service</name>
<url>http://maven.apache.org</url>
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>3.8.1</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>com.ryan</groupId>
<artifactId>ssm-dao</artifactId>
<version>${project.version}</version>
</dependency>
</dependencies>
</project>
六、建立ssm-web模組
命令列進入建立好的ssm-parent目錄,然後執行下列命令:
mvn archetype:generate -DgroupId=com.ryan -DartifactId=ssm-web -DarchetypeArtifactId=maven-archetype-webapp -DinteractiveMode=false
命令執行完成之後可以看到在ssm-parent目錄中生成了ssm-web,裡面包含src目錄和pom.xml檔案。如下圖所示:
ssm-web
├── pom.xml
└── src
└── main
├── resources
└── webapp
├── index.jsp
└── WEB-INF
└── web.xml
修改ssm-web目錄中的pom.xml檔案,把<groupId>com.ryan</groupId>
和<version>1.0-SNAPSHOT</version>
去掉,因為groupId和version會繼承ssm-parent中的groupId和version,packaging設定打包方式為war,同時新增對ssm-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.ryan</groupId>
<artifactId>ssm-parent</artifactId>
<version>1.0-SNAPSHOT</version>
</parent>
<artifactId>ssm-web</artifactId>
<packaging>war</packaging>
<name>ssm-web Maven Webapp</name>
<url>http://maven.apache.org</url>
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>3.8.1</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>com.ryan</groupId>
<artifactId>ssm-service</artifactId>
<version>${project.version}</version>
</dependency>
</dependencies>
<build>
<finalName>ssm-web</finalName>
</build>
</project>
至此,Maven多模組專案已經搭建完成!
SSM框架整合配置
我們使用的是maven來管理的jar,所以只需要在pom.xml中加入相應的依賴,就能匯入需要的jar包。這裡把專案用到的jar貼在下面,可以自己調整版本號。因為是多模組專案,每個子模組下面都有pom.xml,這裡只舉例ssm-service下的pom.xml,當然所有模組的依賴也可以都放在ssm-parent下的pom.xml(即父專案的pom.xml),可按照需要自行調整
ssm-service 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.ryan</groupId>
<artifactId>ssm-parent</artifactId>
<version>1.0-SNAPSHOT</version>
</parent>
<artifactId>ssm-service</artifactId>
<packaging>jar</packaging>
<name>ssm-service</name>
<url>http://maven.apache.org</url>
<properties>
<spring-version>4.1.5.RELEASE</spring-version>
</properties>
<dependencies>
<!-- spring web -->
<!-- https://mvnrepository.com/artifact/org.springframework/spring-web -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-web</artifactId>
<version>${spring-version}</version>
</dependency>
<!-- spring jdbc -->
<!-- https://mvnrepository.com/artifact/org.springframework/spring-jdbc -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-jdbc</artifactId>
<version>${spring-version}</version>
</dependency>
<!-- spring context -->
<!-- https://mvnrepository.com/artifact/org.springframework/spring-context -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>${spring-version}</version>
</dependency>
<!-- spring webmvc -->
<!-- https://mvnrepository.com/artifact/org.springframework/spring-webmvc -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>${spring-version}</version>
</dependency>
<!-- spring aspect -->
<!-- https://mvnrepository.com/artifact/org.springframework/spring-aspects -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-aspects</artifactId>
<version>${spring-version}</version>
</dependency>
<!-- mybatis -->
<!-- https://mvnrepository.com/artifact/org.mybatis/mybatis -->
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.2.6</version>
</dependency>
<!-- mybatis spring -->
<!-- https://mvnrepository.com/artifact/org.mybatis/mybatis-spring -->
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis-spring</artifactId>
<version>1.2.2</version>
</dependency>
<!-- mysql -->
<!-- https://mvnrepository.com/artifact/mysql/mysql-connector-java -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.18</version>
</dependency>
<!-- druid -->
<!-- https://mvnrepository.com/artifact/com.alibaba/druid -->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid</artifactId>
<version>1.0.29</version>
</dependency>
<!-- javax.websocket-api -->
<!-- https://mvnrepository.com/artifact/javax.websocket/javax.websocket-api -->
<dependency>
<groupId>javax.websocket</groupId>
<artifactId>javax.websocket-api</artifactId>
<version>1.1</version>
<scope>provided</scope>
</dependency>
<!-- javaee-api -->
<!-- https://mvnrepository.com/artifact/javax/javaee-api -->
<dependency>
<groupId>javax</groupId>
<artifactId>javaee-api</artifactId>
<version>7.0</version>
<scope>provided</scope>
</dependency>
<!-- junit -->
<!-- https://mvnrepository.com/artifact/junit/junit -->
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
<scope>test</scope>
</dependency>
<!-- fileupload -->
<!-- https://mvnrepository.com/artifact/commons-fileupload/commons-fileupload -->
<dependency>
<groupId>commons-fileupload</groupId>
<artifactId>commons-fileupload</artifactId>
<version>1.3.1</version>
</dependency>
<dependency>
<groupId>com.ryan</groupId>
<artifactId>ssm-dao</artifactId>
<version>${project.version}</version>
</dependency>
</dependencies>
</project>
下面開始進行編寫框架所需配置檔案
引數配置檔案
通常我們把資料庫配置、redis等相關引數放到配置檔案中,所以在ssm-web模組中的resources資料夾裡新建applicationContext.properties檔案,存放專案相關引數配置
applicationContext.properties
#db
#jdbc.driver=oracle.jdbc.driver.OracleDriver
jdbc.driver=com.mysql.jdbc.Driver
#jdbc.url=jdbc:oracle:thin:@172.18.100.223:1521:duvet
jdbc.url=jdbc:mysql://116.62.22.2:3306/student?useUnicode=true&characterEncoding=utf8
jdbc.username=student
jdbc.password=Password@123456
pool.maxPoolSize=10
pool.removeAbandonedTimeout=180000
pool.maxWait=10000
pool.timeBetweenEvictionRunsMillis=60000
pool.minEvictableIdleTimeMillis=300000
pool.validationQuery=select 1
注:
- 配置中的資料庫資訊為測試庫,只有select許可權
連線池資料來源配置檔案
在ssm-web模組中的resources資料夾裡新建dataSource.xml檔案,配置連線池資料來源
- 資料庫連線資訊
- 配置資料庫連線池
- 宣告式事務
- 配置SqlSessionFactory物件
- 掃描dao層介面,動態實現dao介面
dataSource.xml
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
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/tx
http://www.springframework.org/schema/tx/spring-tx-4.0.xsd">
<bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource" init-method="init" destroy-method="close">
<property name="url" value="${jdbc.url}" />
<property name="driverClassName" value="${jdbc.driver}" />
<property name="maxActive" value="${pool.maxPoolSize}" />
<property name="username" value="${jdbc.username}" />
<property name="password" value="${jdbc.password}" />
<!-- 超過時間限制是否回收 -->
<property name="removeAbandoned" value="true" />
<!-- 超時時間;單位為秒。180秒=3分鐘 -->
<property name="removeAbandonedTimeout" value="${pool.removeAbandonedTimeout}" />
<!-- 配置獲取連線等待超時的時間 -->
<property name="maxWait" value="${pool.maxWait}" />
<!-- 配置間隔多久才進行一次檢測,檢測需要關閉的空閒連線,單位是毫秒 -->
<property name="timeBetweenEvictionRunsMillis" value="${pool.timeBetweenEvictionRunsMillis}" />
<!-- 配置一個連線在池中最小生存的時間,單位是毫秒 -->
<property name="minEvictableIdleTimeMillis" value="${pool.minEvictableIdleTimeMillis}" />
<property name="validationQuery" value="${pool.validationQuery} " />
<property name="testWhileIdle" value="true" />
<property name="testOnBorrow" value="false" />
<property name="testOnReturn" value="false" />
</bean>
<!-- 事務 控制 begin -->
<bean name="transactionManager"
class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="dataSource"></property>
</bean>
<tx:annotation-driven transaction-manager="transactionManager" proxy-target-class="true" order="10"/>
<!-- 事務 控制 end -->
<!-- 自動掃描mapping檔案 start -->
<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
<property name="dataSource" ref="dataSource" />
<property name="configLocation" value="classpath:mybatis-config.xml" />
<property name="mapperLocations">
<list>
<!-- 表示在com/ryan/mapper包或以下所有目錄中,以-Mapper.xml結尾所有檔案 -->
<value>classpath*:com/ryan/mapper/**/*Mapper.xml</value>
</list>
</property>
<!--<property name="typeAliasesSuperType" value="com.ryan.framework.entity.BaseEntity" />-->