1. 程式人生 > >Spring + SpringMVC + Mybatis整合SSM框架配置方法

Spring + SpringMVC + Mybatis整合SSM框架配置方法

     剛學完SSM框架的整合,想找個專案玩玩,網上一搜資源一大把,把專案直接搬進開發工具裡,總是遇到各種各樣的問題,一方面是專案本身需要結合環境重新配置,一方面自己沒辦法理解別人的思想。不如從頭開始梳理一下SSM框架的配置整合方法,溫故而知新!

1.  配置專案物件模型檔案pom.xml

        使用IEDA基於maven-archetype-webapp模板新建maven專案後,這時候先檢查專案的目錄結構是否完整,檢查java原始碼檔案庫和resources資源庫的型別是否正確。檢查自動生成的pom.xml檔案,先刪除裡面一些不必要的項如舊版的junit、多餘的專案資訊後。

        由於我們習慣把部分資原始檔放在java原始碼檔案庫裡如mapper.xml檔案,為了保證讓maven打包時掃描到,先在build標籤下增加這些程式碼,把xml檔案包括進去。

<build>
    <finalName>ssm-00</finalName>
    <resources>
      <resource>
        <directory>src/main/java</directory>
        <includes>
          <include>**/*.xml</include>
        </includes>
      </resource>
    </resources>
</build>

        然後,就是最重要的一步,匯入所需的jar包,根據需求所用的框架、功能以groupId分類,分別列出artifactId清單,如下;在MyEclipse裡可以點選dependencies標籤出現介面選擇導包,而IDEA裡貌似只能通過增加dependency標籤的方式來導包。

  1. Spring框架的各個元件:org.springframework

  • spring-core

  • spring-context

  • spring-tx

  • spring-jdbc

  • spring-test

  • spring-web

  • spring-webmvc

  • spring-aop

  • spring-context-support

  1. 面向切面程式設計:org.aspectj

  • aspectjweaver

  1. Mybatis框架,支援到Spring中:org.mybatis

  • mybatis

  • mybatis-spring

  1. servelt、jsp元件:servletjavax.servlet

  • servlet-api

  • servlet.jsp-api

  1. 資料庫驅動:mysql

  • mysql-connector-java

  1. 使用阿里巴巴的連線池和fastjson:com.alibaba

  • druid

  • fastjson

  1. 日誌記錄:log4j

  • log4j

  1. 日誌輸出:org.slf4j

  • slf4j-log4j12

  1. 阿帕奇shiro許可權管理:org.apache.shiro

  • shiro-core

  1. 引入jackson:org.codehaus.jackson

  • jack-mapper-asl

  1. io流:commons-io

  • commons-io

  1. 模板語言:commons-code

  • commons-codec

  1. 阿帕奇模板引擎:org.apache.velocity

  • velocity-tools

  • velocity

  1. 檔案上傳:commons-fileupload

  • commons-fileupload

  1. maven原始碼編譯外掛:org.apache.maven.plugins

  • maven-compiler-plugins

  1. Mybatis-genenerator外掛:org.mybatis.generator

  • mybatis-generator-core

        最後一步,在第一步的build標籤下增加Mybatis-generatormaven編譯原始碼外掛的配置,pom.xml就配置完成了。

<plugins>
      <plugin>
        <groupId>org.mybatis.generator</groupId>
        <artifactId>mybatis-generator-maven-plugin</artifactId>
        <version>1.3.2</version>
        <configuration>
          <verbose>true</verbose>
          <overwrite>true</overwrite>
        </configuration>
      </plugin>
      <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-compiler-plugin</artifactId>
        <configuration>
          <source>1.6</source>
          <target>1.6</target>
        </configuration>
      </plugin>
</plugins>

2. Spring整合Mybatis配置

    Spring就是一個輕量級的控制反轉和麵向切面的容器框架,IOC容器將物件之間的依賴關係交由Spring進行控制,Spring框架提供了對其他優秀開源框架的介面支援。MyBatis是一個支援普通SQL查詢,儲存過程和高階對映的優秀持久層框架。

        首先,使用Mybatis-generator外掛自動生成實體類、DAO介面實現類和Mapper,配置方法已在另一篇博文中。此方法修改路徑後,試驗證明仍能在專案中使用。但為了在Maven中執行Mybatis-generator外掛,需再新建一個Configuration,配置方法如下。確定後,點選新生成的按鈕即可執行Mybatis-generator生成程式碼。

        然後,在resources目錄下新建spring-config.xml,用來整合Mybatis,作為新手,先理清思路再寫程式碼。配置步驟如下:

  1. 刪除舊版的xml約束,使用完整的新版spring4.0;
  2. 開啟切面程式設計;
  3. 開啟掃描註解生成bean;
  4. 包掃描路徑;
  5. 在Spring工廠介面中實現Mybatis整合;
  6. 設定Mapper介面的路徑;
  7. 配置資料來源dataSource,使用阿里巴巴連線池;
  8. 在6與7之間增加宣告事務管理;
  9. 在4與5之間增加佔位符,宣告jdbc.properties的位置。

        具體程式碼:

<?xml version="1.0" encoding="UTF-8"?>
<!--1.  xml約束-->
<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:aop="http://www.springframework.org/schema/aop"
       xmlns:tx="http://www.springframework.org/schema/tx"
       xsi:schemaLocation="http://www.springframework.org/schema/beans
    http://www.springframework.org/schema/beans/spring-beans-4.0.xsd
    http://www.springframework.org/schema/context
    http://www.springframework.org/schema/context/spring-context-4.0.xsd
    http://www.springframework.org/schema/aop
    http://www.springframework.org/schema/aop/spring-aop-4.0.xsd
    http://www.springframework.org/schema/tx
    http://www.springframework.org/schema/tx/spring-tx-4.0.xsd"
>

    <!--2. 開啟切面程式設計自動代理-->
    <aop:aspectj-autoproxy proxy-target-class="true"/>
    <!--3. 掃描註解生成bean-->
    <context:annotation-config/>
    <!--4. 包掃描-->
    <context:component-scan base-package="com.me"/>
    <!--9. 佔位符-->
    <context:property-placeholder location="classpath:jdbc.properties"/>
    <!--5. 整合mybatis-->
    <bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
        <property name="dataSource" ref="dataSource"/>
        <property name="mapperLocations" value="classpath:com/me/**/**.xml"/>
    </bean>
     <!--6. 設定mapper介面的位置;-->
    <bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
        <property name="basePackage" value="com.me.*.dao"/>
        <property name="sqlSessionFactoryBeanName" value="sqlSessionFactory"/>
    </bean>

    <!--8. 宣告事務管理 採用註解方式-->
    <tx:annotation-driven transaction-manager="transactionManager"/>
    <bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
        <property name="dataSource" ref="dataSource"/>
    </bean>
     <!--7.  配置dataSource,使用阿里巴巴連線池-->
    <!--資料庫設定-->
    <bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource"
          destroy-method="close" init-method="init">
        <property name="url" value="${jdbc_url}"/>
        <property name="username" value="${jdbc_username}"/>
        <property name="password" value="${jdbc_password}"/>
        <property name="initialSize" value="0"/>
        <!-- 最大使用連線數 -->
        <property name="maxActive" value="20"/>
        <property name="minIdle" value="0"/>
        <property name="maxWait" value="60000"/>
        <property name="validationQuery" value="${validationQuery}"/>
        <property name="testOnBorrow" value="false"/>
        <property name="testOnReturn" value="false"/>
        <property name="testWhileIdle" value="true"/>
        <property name="timeBetweenEvictionRunsMillis" value="60000"/>
        <property name="minEvictableIdleTimeMillis" value="25200000"/>
        <property name="removeAbandoned" value="true"/>
        <property name="removeAbandonedTimeout" value="1800"/>
        <property name="logAbandoned" value="true"/>
        <!-- <property name="filters" value="stat" /> -->
        <property name="filters" value="mergeStat"/>
    </bean>

</beans>

        在同目錄下新建jdbc.properties檔案,鍵入各JDBC引數即可。

3. SpringMVC配置

    SpringMVC是一個基於DispatcherServlet的MVC框架,每一個請求最先訪問的都是DispatcherServlet。它負責轉發每一個Request請求給相應的Handler,Handler處理以後再返回相應的檢視和模型。

        在resources目錄新建spring-mvc.xml檔案,開始配置:

  1. SpringMVC框架的XML約束;
  2. 包掃描的位置;
  3. 開啟MVC註解掃描
  4. 配置velocityConfigurer引擎;
  5. 配置試圖解析器

        spring-mvc.xml具體程式碼如下:

<?xml version="1.0" encoding="UTF-8"?>
<!--1. xml約束-->
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:context="http://www.springframework.org/schema/context"
       xmlns:mvc="http://www.springframework.org/schema/mvc" 
       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/context
      http://www.springframework.org/schema/context/spring-context.xsd
      http://www.springframework.org/schema/mvc
      http://www.springframework.org/schema/mvc/spring-mvc-4.0.xsd">

    <!--2. 包掃描-->
    <context:component-scan base-package="com.me.*.controller">
    </context:component-scan>
    <!--3. 開啟註解掃描-->
    <mvc:annotation-driven/>
	
	<--4. 配置velocityConfigurer引擎;-->
    <bean id="velocityConfigurer" class="org.springframework.web.servlet.view.velocity.VelocityConfigurer">
        <property name="resourceLoaderPath" value="/WEB-INF/views"/>
        <property name="velocityProperties">
            <props>
                <prop key="input.encoding">utf-8</prop>
                <prop key="output.encoding">utf-8</prop>
                <prop key="file.resource.loader.cache">false</prop>
                <prop key="file.resource.loader.modificationCheckInterval">1</prop>
                <prop key="velocimacro.library.autoreload">false</prop>
            </props>
        </property>
    </bean>
     <--5. 配置檢視解析-->
    <bean class="org.springframework.web.servlet.view.velocity.VelocityViewResolver">
        <property name="suffix" value=".vm"/>
        <property name="contentType" value="text/html;charset=utf-8"/>
	<!--日期函式名稱-->
        <property name="dateToolAttribute" value="date"/>
    </bean>

</beans>
        然後在webapp/WEB-INF目錄下新建web.xml檔案,用於初始化web配置資訊:
  1. spring-config.xml配置所在的位置
  2. 編碼過濾器;
  3. spring監聽器;
  4. springMVC配置servlet,使用dispatcherServlet啟動分發請求;
        web.xml
<?xml version="1.0" encoding="UTF-8"?>
<!--宣告web-app的版本,使用3.0的xsd-->
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xmlns="http://java.sun.com/xml/ns/javaee"
         xsi:schemaLocation="http://java.sun.com/xml/ns/javaee 
         http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"
         version="3.0">

  <display-name>ssm-0</display-name>
<!--2. spring-config.xml配置所在的位置;-->
  <context-param>
    <param-name>contextConfigLocation</param-name>
    <param-value>classpath:spring-config.xml</param-value>
  </context-param>
  <!-- 3. 編碼過濾器 -->
  <filter>
    <filter-name>encodingFilter</filter-name>
    <filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
    <async-supported>true</async-supported>
    <init-param>
      <param-name>encoding</param-name>
      <param-value>UTF-8</param-value>
    </init-param>
  </filter>
  <filter-mapping>
    <filter-name>encodingFilter</filter-name>
    <url-pattern>/*</url-pattern>
  </filter-mapping>
  <!-- 4. Spring監聽器 -->
  <listener>
    <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
  </listener>
  <!-- 5. Spring MVC servlet-->
  <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>
    <async-supported>true</async-supported>
  </servlet>
  <servlet-mapping>
    <servlet-name>SpringMVC</servlet-name>
    <url-pattern>/</url-pattern>
  </servlet-mapping>

</web-app>

        最後一步,用標題2. 中配置Mybatis-generator執行按鈕類似的方法配置Tomcat,新建按鈕。

4. 建立service介面和實現類

        在user/service路徑下分別建立一個介面及其實現類,用於將使用者物件的資訊插入到資料庫中。

        UserServiceImpl.java

@Service("UserServiceImpl")
public class UserServiceImpl implements UserTeacherService{
    @Autowired
    private UserMapper userMapper;
    @Override
    @Transactional(propagation = Propagation.REQUIRED)
    public int createUser(User user) {
        userMapper.insertSelective(user);
        return 0;
    }

}

5. 程式碼測試

        測試Tomcat伺服器和MVC是否正常連通,在使用者目錄下新建一個UserController.java類,在WEB-INF/views下新建test.vm。打上斷點,debug模式執行Tomcat,在瀏覽器地址鍵入相應對映的路徑,訪問後檢視控制檯資訊,具體程式碼:

        UserController.java

@Controller
@RequestMapping("log")
public class UserController {

    @RequestMapping("/test")
    public String user(){
        User user = new User();
        user.setID("13900000000");
        user.setAge(100);
        return "test";
    }
}

        test.vm

<html>
 <head>
    <title>Title</title>
 </head>
 <body>
 TESTING!
 </body>
</html>

        再測試能否將使用者物件資訊插入到資料庫。對上面的UserController.java這個類稍加修改,引入4. 中的物件,在user()方法內呼叫creatUser(User user)方法。

        UserController.java

@Controller
@RequestMapping("log")
public class UserController {

    @Autowired
    private UserService  userService;

    @RequestMapping("/test")
    public String user(){
        User user = new User();
        user.setID("13900000000");
        user.setAge(100);
        userService.createUser(user);
        return "test";
    }
}

        同樣debug除錯,用瀏覽器訪問對映地址,執行後檢視對應資料庫有無增加一條記錄。

(完)