1. 程式人生 > >SSM整合配置(Spring+Spring MVC+Mybatis)

SSM整合配置(Spring+Spring MVC+Mybatis)

一、配置準備

   通過Maven工程,在eclipse中整合SSM,並在Tomcat伺服器上執行  

  在進行配置前,先理清楚要配置哪些檔案,如圖,除web.xml外,其餘三個配置檔名稱均可自定義:

   如圖所示,一共有四個需要手動配置的檔案:

  1、web.xml:配置servlet、filter、listener

  2、applicationContext.xml:配置相關的bean,與mybatis整合

  3、Spring-Servlet.xml:用於配置檢視解析器、控制器等

  4、GenratorConfig.xml:用於生成Mybatis用到的實體類、Mapper介面、Map配置檔案

 

  新建一個Maven工程,工程結構如圖:

 

二、配置過程

  大致瞭解所需配置檔案後,開始配置

  1、Web.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/maven-v4_0_0.xsd">
  <modelVersion
>4.0.0</modelVersion> <groupId>ssm</groupId> <artifactId>ssm</artifactId> <packaging>war</packaging> <version>0.0.1-SNAPSHOT</version> <name>ssm Maven Webapp</name> <url>http://maven.apache.org</url> <properties>
<spring.version>5.0.0.RELEASE</spring.version> <!--mybatis版本號,3.4.5是2017年8月釋出的新版本--> <mybatis.version>3.4.5</mybatis.version> <!--<slf4j.version>1.7.25</slf4j.version>--> <slf4j.version>1.7.25</slf4j.version> <log4j.version>1.2.17</log4j.version> </properties> <dependencies> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>4.11</version> <scope>test</scope> </dependency> <!--spring核心包——Start--> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-core</artifactId> <version>${spring.version}</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-web</artifactId> <version>${spring.version}</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-oxm</artifactId> <version>${spring.version}</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-tx</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-webmvc</artifactId> <version>${spring.version}</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-aop</artifactId> <version>${spring.version}</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-context-support</artifactId> <version>${spring.version}</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-test</artifactId> <version>${spring.version}</version> <scope>test</scope> </dependency> <dependency> <groupId>org.mybatis</groupId> <artifactId>mybatis</artifactId> <version>${mybatis.version}</version> </dependency> <dependency> <groupId>com.github.pagehelper</groupId> <artifactId>pagehelper</artifactId> <version>4.1.6</version> </dependency> <dependency> <groupId>tk.mybatis</groupId> <artifactId>mapper</artifactId> <version>3.3.8</version> </dependency> <!--mybatis/spring包--> <dependency> <groupId>org.mybatis</groupId> <artifactId>mybatis-spring</artifactId> <version>1.3.1</version> </dependency> <!--mysql資料庫的jdbc連線包--> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <!-- mysql-8 需要 Connector/J 8.0.9 or higher --> <version>8.0.13</version> </dependency> <!-- 匯入dbcp的jar包,用來在applicationContext.xml中配置資料庫 --> <dependency> <groupId>commons-dbcp</groupId> <artifactId>commons-dbcp</artifactId> <version>1.4</version> </dependency> </dependencies> <build> <finalName>ssm</finalName> <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> <!-- 自動生成PO類的核心包 --> <dependencies> <dependency> <groupId>org.mybatis.generator</groupId> <artifactId>mybatis-generator-core</artifactId> <version>1.3.2</version> </dependency> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <!-- mysql-8 需要 Connector/J 8.0.9 or higher --> <version>8.0.13</version> </dependency> </dependencies> </plugin> </plugins> </build> </project>

   spring mvc採用前置控制器的設計模式,由一個DispatcherServlet負責分派,因此要在web.xml中對這個Servlet進行配置,該Servlet在啟動時便例項化,因此要配置load-on-startup屬性,我們先了解一下Spring MVC中的Context Hierarchy,首先看一張來自官網的圖

  WebApplicationContext是ApplicationContext的拓展,是用於生成Bean的工廠,每個DispatcherServlet都需要一個Servlet WebApplicationContext來進行自己的配置,多個DispatcherServlet共享一個Root WebApplicationContext的配置,通常,在Servlet WebApplicationContext中配置控制器、檢視解析器,在Root WebApplicationContext配置需要被多個Servlet共享的業務邏輯以及資料訪問的Bean。

  每個DispatcherServlet對應的Servlet WebApplicationContext,預設名稱為[servlet-name]-servlet,如本例中web.xml中配置servlet-name為spring,那麼預設的Servlet WebApplicationContext配置檔名稱便為spring-servlet,其預設路徑在WEB-INF下,當然,也可以通過在Servlet中配置init-param的contextConfigLocation來自定義配置路徑以及配置名稱,本例中不進行配置,採用預設的名稱 spring-servlet

  

   對於Root WebApplicationContext的配置,首先要在web.xml中通過<context-param>標籤,設定該標籤中contextConfigLocation的值,指定Root WebApplicationContext的路徑與名稱,隨後在通過配置一個名為org.springframework.web.context.ContextLoaderListener的監聽器,在啟動時讀取contextConfigLocation指定的Root WebApplicationContext,這裡指定的Root WebApplicationContext在src/main/resources/applicationContext.xml中。配置完畢後的web.xml如下所示

<!DOCTYPE web-app PUBLIC
 "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"
 "http://java.sun.com/dtd/web-app_2_3.dtd" >

<web-app> 
  <context-param>
      <param-name>contextConfigLocation</param-name>
      <param-value>classpath:applicationContext.xml</param-value>
  </context-param>
    
  <listener>
    <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
  </listener>
  
   <servlet>
      <servlet-name>spring</servlet-name>
      <servlet-class>
         org.springframework.web.servlet.DispatcherServlet
      </servlet-class>
      <load-on-startup>1</load-on-startup>
   </servlet>
   <servlet-mapping>
      <servlet-name>spring</servlet-name>
      <url-pattern>/</url-pattern>
   </servlet-mapping>  
</web-app>

2、spring-servlet.xml配置

  在該配置檔案中,主要配置控制器與檢視解析器,配置過程比較簡單,先在工程中新建一個實現控制器的包,這裡定義為ssm.controller,隨後配置一個檢視解析器的bean以及掃描控制器註解,配置完畢後如圖所示

<?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: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/context
    http://www.springframework.org/schema/context/spring-context.xsd
    http://www.springframework.org/schema/mvc
    http://www.springframework.org/schema/mvc/spring-mvc.xsd">
    <!--啟用spring的一些annotation -->
    <context:annotation-config/>       
    <!--  自動掃描該包,使SpringMVC認為包下用了@controller註解的類是控制器  -->
    <context:component-scan base-package="ssm.controller">
        <context:include-filter type="annotation" expression="org.springframework.stereotype.Controller"/>
    </context:component-scan>
    <!--配置檢視解析器-->
    <bean id="viewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver">
        <property name="prefix" value="/WEB-INF/jsp/"/>
        <property name="suffix" value=".jsp"/>
    </bean>
</beans>

3、generatorConfig.xml配置

  要在applicationContext.xml中整合spring與mybatis,至少要配置兩樣東西:一個 SqlSessionFactory 和至少一個數據對映器類,因此,我們要先通過generatorConfig.xml,幫助我們自動生成實體物件、Mapper介面,以及對應的Mapper.xml檔案。generatorConfig.xml的路徑由pom.xml中configurationFile指定

 

 

  在這個配置檔案中:

  jdbcConnection指定資料連線

  javaModelGenerator指定要生成的實體物件的位置,

  sqlMapGenerator指定要生成的Map.xml檔案的位置

  javaClientGenerator指定要生成的Mapper介面的位置

  table指定要生成的表,通過enable**ByExample屬性,指定是否要生成example檔案

  我們指定生成的資料表如下:

  

  最終配置檔案如圖

<?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>
    
    
    <context id="test" defaultModelType="flat">
    
        <commentGenerator>
            <property name="suppressDate" value="true"/>
            <!-- 是否去除自動生成的註釋 true:是 : false:否 -->
            <property name="suppressAllComments" value="true"/>
        </commentGenerator>
    
        <jdbcConnection driverClass="com.mysql.cj.jdbc.Driver" connectionURL="jdbc:mysql://127.0.0.1:3306/test?autoReconnect=true&amp;utoReconnectForPools=true&amp;
                        useUnicode=true&amp;characterEncoding=utf-8&amp;useSSL=false&amp;
                        serverTimezone=UTC"
                        userId="root" password="wqk123">
        </jdbcConnection>
        
        <javaTypeResolver>
            <property name="forceBigDecimals" value="false"/>
        </javaTypeResolver>
        <!-- pojo -->
        <javaModelGenerator targetPackage="com.entity" targetProject="src/main/java">
        </javaModelGenerator>
        <!-- 建立mapxml -->
        <sqlMapGenerator targetPackage="map" targetProject="src/main/resources">
            <property name="enableSubPackages" value="true"/>
        </sqlMapGenerator>
        <!-- 建立map介面,作用等同於dao介面 -->
        <javaClientGenerator targetPackage="com.map" type="XMLMAPPER" targetProject="src/main/java">
            <property name="enableSubPackages" value="true"/>
        </javaClientGenerator>
        
        <table tableName="food_item" enableCountByExample="false" enableUpdateByExample="false" enableDeleteByExample="false"
    enableSelectByExample="false" selectByExampleQueryId="false">            
            <generatedKey column="food_id" sqlStatement="MySql" identity="true"/>
        </table>
    
    </context>
    
    
</generatorConfiguration>

  配置完畢後,在專案上指定maven build,並設定Goalsmybatis-generator:generate -X,隨後自動生成相應檔案如圖

 

4、配置applicationContext.xml

  在配置generatorConfig.xml時提到了,如果要想在applicationContext.xml中實現Mybatis與spring的整合,那麼至少需要配置兩樣東西:一個 SqlSessionFactory至少一個數據對映器類,此外,在applicationContext.xml中還要掃描實現業務邏輯的service包並配置資料庫連結源  

<?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:context="http://www.springframework.org/schema/context"
       xmlns:tx="http://www.springframework.org/schema/tx"
       xsi:schemaLocation="http://www.springframework.org/schema/beans
                           http://www.springframework.org/schema/beans/spring-beans.xsd
                           http://www.springframework.org/schema/context
                           http://www.springframework.org/schema/context/spring-context.xsd
                           http://www.springframework.org/schema/tx
                           http://www.springframework.org/schema/tx/spring-tx.xsd">
<!--配置連線池資料來源-->
    <bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource">
        <property name="driverClassName" value="com.mysql.cj.jdbc.Driver"/>
        <property name="url" value="jdbc:mysql://127.0.0.1:3306/test?autoReconnect=true&amp;utoReconnectForPools=true&amp;
                        useUnicode=true&amp;characterEncoding=utf-8&amp;useSSL=false&amp;
                        serverTimezone=UTC"/>
        <property name="username" value="root"/>
        <property name="password" value="wqk123"/>
    </bean>
    <!--spring和mybatis整合-->
    <!--會話工廠bean SQLSessionFactory-->
    <bean id="SqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
        <!--資料來源-->
        <property name="dataSource" ref="dataSource"/>
        <!--別名-->
        <property name="typeAliasesPackage" value="com.entity"/>
        <!-- 感覺這裡不應該直接寫:ToolTPOMapper.xml -->
        <!--sql對映檔案-->
        <property name="mapperLocations" value="classpath:map/FoodItemMapper.xml"/>
        <!--<property name="configLocation" value="classpath:config/mybatis-config.xml"/>-->
    </bean>
    <!--掃描mapper介面包-->
    <bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
        <!--指定要自動掃描介面的基礎包,實現介面-->
        <property name="basePackage" value="com.map"/>
        <!--指定會話工廠,如果上下文中只有一個則可以省去-->
        <property name="sqlSessionFactoryBeanName" >
            <idref bean="SqlSessionFactory"/>
        </property>
    </bean>
    <!--service實現類掃描-->
    <context:component-scan base-package="com.service"/>
    <!--事務管理-->
    <bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
        <property name="dataSource" ref="dataSource"/>
    </bean>
    <!--支援註解驅動的事務管理,指定事務管理器-->
    <tx:annotation-driven transaction-manager="transactionManager"/>
    
</beans>

至此,配置以及完成

三、驗證配置

  實現一個簡單的功能,通過id引數讀取相應食品的名稱以及描述

1、定義業務邏輯的service介面並實現

2、定義控制器並實現

3、測試實際效果