1. 程式人生 > >SSM框架——(SpringMVC+Spring+MyBatis+Maven多模組)整合

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>,因為groupIdversion會繼承ssm-parent中的groupIdversionpackaging設定打包方式為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>,因為groupIdversion會繼承ssm-parent中的groupIdversionpackaging設定打包方式為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>,因為groupIdversion會繼承ssm-parent中的groupIdversionpackaging設定打包方式為jar,同時新增對ssm-domainssm-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>,因為groupIdversion會繼承ssm-parent中的groupIdversionpackaging設定打包方式為jar,同時新增對ssm-dao模組的依賴,ssm-service依賴ssm-daossm-domainssm-common,但是我們只需新增ssm-dao的依賴即可,因為ssm-dao已經依賴了ssm-domainssm-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>去掉,因為groupIdversion會繼承ssm-parent中的groupIdversion,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&amp;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" />-->