一、配置准備
通過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&utoReconnectForPools=true& useUnicode=true&characterEncoding=utf-8&useSSL=false& 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,並設置Goals為mybatis-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&utoReconnectForPools=true& useUnicode=true&characterEncoding=utf-8&useSSL=false& 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、測試實際效果