SSM(Spring+SpringMVC+Mybatis)框架超詳細搭建指南(利用Maven構建項目)

其實這是我實習生涯開始後的第一個任務,但是當時太忙了一直沒有時間記錄,就按照教程走了。剛好現在實習結束了有些時間,把整個搭建的過程還有一些坑記錄下來還是很有必要的。

DEMO

https://github.com/mgsky1/aboutSpring/tree/master/ssm_csdn

環境

  • IDEA 15.0.5
  • JDK 1.8
  • tomcat 7.0.69
  • Maven 3.3.9

思路

首先需要說明的是,Spring框架中包含了SpringMVC,所以說二者是可以天然整合的。而Mybatis需要一箇中間件,像“膠水”一樣,把它和Spring框架粘合在一起。Spring可以看成是一個java bean的管理器,它貫穿與整個整合過程。如下圖

整合步驟(有乾貨哦!)

在寫整合步驟的過程中,雖然都是SSM整合,但是我的風格更偏向與實用性,不會只是簡單的將SSM搭起來就完事了。在整合的測試用例選用上,我使用輸出JSON格式字符串來進行測試。這也是目前後端比較流行的一種方式,能夠與前端有效解耦
注:如有看到Optional字樣,表示可選步驟

最終項目結構

利用IDEA的Maven模板創建項目

在IDEA模板中,有兩個webapp,記得要選擇下圖選中所示的

項目構建完成後,在配置tomcat的項目運行war包時,可能你會看到下圖所示的情況,沒有Artifacts選項

解決辦法如下:
1、打開file -> project structure->factes,添加web項目

這裏寫圖片描述
2、修改factes的Web Resources Directory路徑,記得要定位到項目的webapp目錄下

3、進入Artifacts選項卡,按如下圖選擇,添加項目打包配置

4、修改路徑


保存後再進行server配置時就可以看到有Artifacts選項了

項目創建完成後,可以嘗試啓動一下,如果沒有報錯,可以進行下一步

添加Maven依賴

首先是版本

  • 版本不唯一,數據庫可以用Oracle,這裏以MySQL爲例
  • 數據庫連接池也可以使用阿里的
<properties>
    <!--Spring-->
    <spring.version>4.1.3.RELEASE</spring.version>
    <!--Json處理-->
    <json.version>2.7.4</json.version>
    <jackson.version>2.7.4</jackson.version>
    <!-- mybatis-->
    <mybatis.version>3.2.6</mybatis.version>
    <!-- mybatis與Spring的粘合劑-->
    <mybatis-spring.version>1.2.2</mybatis-spring.version>
    <!-- mysql數據庫驅動-->
    <mysql-connector-java.version>5.1.30</mysql-connector-java.version>
    <!-- 數據庫連接池-->
    <commons-dbcp.version>1.2.2</commons-dbcp.version>
</properties>

Optional

<!--日誌管理-->
 <log4j.version>1.2.17</log4j.version>
 <sl4j.version>1.6.1</sl4j.version>

依賴配置

<dependencies>
   <!-- spring核心包 包括SpringMVC -->
    <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>
    </dependency>
    <!--JSON解析-->
    <dependency>
      <groupId>com.fasterxml.jackson.core</groupId>
      <artifactId>jackson-core</artifactId>
      <version>2.7.4</version>
    </dependency>

    <dependency>
      <groupId>com.fasterxml.jackson.core</groupId>
      <artifactId>jackson-annotations</artifactId>
      <version>${json.version}</version>
    </dependency>

    <dependency>
      <groupId>com.fasterxml.jackson.core</groupId>
      <artifactId>jackson-databind</artifactId>
      <version>${json.version}</version>
    </dependency>

    <!-- mybatis核心包 -->
    <dependency>
      <groupId>org.mybatis</groupId>
      <artifactId>mybatis</artifactId>
      <version>${mybatis.version}</version>
    </dependency>

    <!-- mybatis/spring包 整合Mybatis和Spring使用 -->
    <dependency>
      <groupId>org.mybatis</groupId>
      <artifactId>mybatis-spring</artifactId>
      <version>${mybatis-spring.version}</version>
    </dependency>

    <!-- 導入Mysql數據庫鏈接jar包 -->
    <dependency>
      <groupId>mysql</groupId>
      <artifactId>mysql-connector-java</artifactId>
      <version>${mysql-connector-java.version}</version>
    </dependency>

    <!-- 導入dbcp的jar包,用來在applicationContext.xml中配置數據庫 -->
    <dependency>
      <groupId>commons-dbcp</groupId>
      <artifactId>commons-dbcp</artifactId>
      <version>${commons-dbcp.version}</version>
    </dependency>
</dependencies>

Optional

    <!-- 日誌文件管理包 -->
    <dependency>
      <groupId>log4j</groupId>
      <artifactId>log4j</artifactId>
      <version>${log4j.version}</version>
    </dependency>

    <dependency>
      <groupId>org.slf4j</groupId>
      <artifactId>slf4j-api</artifactId>
      <version>${sl4j.version}</version>
    </dependency>
    <dependency>
      <groupId>org.slf4j</groupId>
      <artifactId>slf4j-log4j12</artifactId>
      <version>${sl4j.version}</version>
    </dependency>

項目構建配置

爲了在項目打包時能夠將mybatis的*.xml的Mapper配置文件加載進去,在<build></build>標籤中添加以下內容

 <resources>
      <!--包含xml Mapper文件-->
      <resource>
        <directory>${basedir}/src/main/java</directory>
        <includes>
          <include>**/*.xml</include>
        </includes>
      </resource>
 </resources>

依賴配置完成後,讓Maven重新導包一下

日誌文件配置Optional

src/main 下新建一個Resources文件夾,並把它標記爲Resources Root
Resources 下添加文件log4j.properties
文件內容如下:

#定義開啓級別,測試階段一般設置DEBUG,Console,File
log4j.rootLogger=DEBUG,Console,File
#定義日誌輸出目的地爲控制檯
log4j.appender.Console=org.apache.log4j.ConsoleAppender
log4j.appender.Console.Target=System.out
#可以靈活地指定日誌輸出格式,下面一行是指定具體的格式
log4j.appender.Console.layout=org.apache.log4j.PatternLayout
log4j.appender.Console.layout.ConversionPattern=[%c]-%m%n

#文件大小到達指定尺寸的時候產生一個新的文件
log4j.appender.File=org.apache.log4j.RollingFileAppender
#指定輸出目錄以及日誌名稱
log4j.appender.File.File=logs/ssm.log
#定義文件最大大小
log4j.appender.File.MaxFileSize=10MB
#輸出所以日誌,如果換成DEBUG表示輸出DEBUG以上級別日誌
log4j.appender.File.Threshold=ALL
log4j.appender.File.layout=org.apache.log4j.PatternLayout
log4j.appender.File.layout.ConversionPattern=[%p][%d{yyyy-MM-ddHH\:mm\:ss}][%c]%m%n

在/webapp/WEB-INF/web.xml下追加以下內容

<!--日誌監聽-->
  <context-param>
    <param-name>log4jConfigLocation</param-name>
    <param-value>classpath:log4j.properties</param-value>
  </context-param>

  <listener>
    <listener-class>org.springframework.web.util.Log4jConfigListener</listener-class>
  </listener>

Spring與SpringMVC整合

因爲SpringMVC是Spring的一部分,它們有得天獨厚的整合關係,所以就先處理它們兩個

添加java文件夾,並設置成Sources Root,建立Java Web項目最基本的項目結構

在Resources文件夾下添加ssm.xml文件

這個便是SSM框架的核心配置文件,這裏先填寫與SpringMVC有關的部分,不過約束頭給出的是SSM全部的,不過不影響
文件內容如下
約束頭:

<?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:p="http://www.springframework.org/schema/p"
       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-3.1.xsd
                        http://www.springframework.org/schema/context
                        http://www.springframework.org/schema/context/spring-context-3.1.xsd
                        http://www.springframework.org/schema/mvc
                        http://www.springframework.org/schema/mvc/spring-mvc.xsd
                        ">
</beans>

<beans></beans> 標籤中間添加SpringMVC相關配置

  <!--配置Handler,也就是控制器,使用組件掃描-->
    <context:component-scan base-package="com.example" />
    <!--使用mvc:annotation-driven會加載很多的參數綁定方法 包括JSON解析-->
    <mvc:annotation-driven></mvc:annotation-driven>

    <!--註解映射器和適配器必須配對使用-->
    <!--視圖解析器
        解析jsp解析,默認使用jstl標籤,classpath下的所有jstl包
    -->
    <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver"></bean>

配置web.xml

在/webapp/WEB-INF/web.xml下追加如下內容

 <!--SpringMVC前端控制器-->
  <servlet>
    <servlet-name>springmvc</servlet-name>
    <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
    <!--contextConfigLocation配置SpringMVC加載的配置文件(配置處理器映射器、適配器等)-->
    <init-param>
      <param-name>contextConfigLocation</param-name>
      <param-value>classpath:ssm.xml</param-value>
    </init-param>
  </servlet>

  <servlet-mapping>
    <servlet-name>springmvc</servlet-name>
    <url-pattern>/</url-pattern>
  </servlet-mapping>

其中servlet-mapping 中的 url-pattern 有兩種寫法,一種是例子中的,還有一種是*.action,如果是後者,在訪問控制器的時候要加.action後綴,否則會404

測試

com.example.controller 包下添加MainController.java文件,編寫一個簡單的控制器

import java.util.HashMap;
import java.util.List;
import java.util.Map;

/**
 * Created by Martin Huang on 2018/7/1.
 */
@Controller
@RequestMapping("/main")
public class MainController {

    @RequestMapping("/testMVC")
    @ResponseBody
    public Map<String,Object> testMVC(){
        Map<String,Object> responseMap = new HashMap<String,Object>();
        responseMap.put("name","martin");
        return responseMap;
    }
}

這個控制器的作用就是輸出一個JSON字符串,key爲name,value爲martin
運行後如果瀏覽器返回以下JSON字符串結果,表示整合成功

Spring與Mybatis整合

編寫數據庫配置文件jdbc_mysql.properties

在Resources文件下新建文件,名爲jdbc_mysql.properties,內容如下

driver=com.mysql.jdbc.Driver
url=jdbc:mysql://HOST:PORT/mydb
user=YOUR_USER
password=YOUR_PASSWORD
#定義初始連接數
initialSize=0
#定義最大連接數
maxActive=20
#定義最大空閒
maxIdle=20
#定義最小空閒
minIdle=1
#定義最長等待時間
maxWait=60000

請自行將HOST:PORT 替換爲自己的數據庫ip:端口號、YOUR_USER 替換爲數據庫用戶名、YOUR_PASSWORD 替換爲數據庫用戶名對應密碼

配置ssm.xml

在原ssm.xml中追加以下內容

<!--引入配置文件-->
    <context:property-placeholder location="classpath*:jdbc_mysql.properties"/>
<!--配置mysql-->
    <bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource"
          destroy-method="close">
        <property name="driverClassName" value="${driver}" />
        <property name="url" value="${url}" />
        <property name="username" value="${user}" />
        <property name="password" value="${password}" />
        <!-- 初始化連接大小 -->
        <property name="initialSize" value="${initialSize}"></property>
        <!-- 連接池最大數量 -->
        <property name="maxActive" value="${maxActive}"></property>
        <!-- 連接池最大空閒 -->
        <property name="maxIdle" value="${maxIdle}"></property>
        <!-- 連接池最小空閒 -->
        <property name="minIdle" value="${minIdle}"></property>
        <!-- 獲取連接最大等待時間 -->
        <property name="maxWait" value="${maxWait}"></property>
    </bean>

    <!-- spring和MyBatis完美整合,不需要mybatis的配置映射文件 -->
    <bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
        <property name="dataSource" ref="dataSource" ></property>
        <!-- 自動掃描mapping.xml文件 -->
        <property name="mapperLocations" value="classpath:/com/example/dao/xml_mysql/*.xml"></property>
    </bean>

    <!-- DAO接口所在包名,Spring會自動查找其下的類 -->
    <bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
        <property name="basePackage" value="com.example.dao" />
        <property name="sqlSessionFactoryBeanName" value="sqlSessionFactory"></property>
    </bean>

測試

這裏做一個簡單的查詢,數據庫mydb中有一張ssm_role 表,內容是這樣的

我們將查詢這張表的全部內容,使用JSON字符串輸出,這裏使用的是Mapper代理開發

在dao層創建RoleMapper接口

import java.util.List;

/**
 * Created by Martin Huang on 2018/7/1.
 */
public interface RoleMapper {
    List getAllRoles();
}

在dao層新建xml_mysql包,並創建RoleMapper.xml文件

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd" >
<mapper namespace="com.example.dao.RoleMapper">
    <select id="getAllRoles" resultType="java.util.Map">
        SELECT * FROM ssm_role
    </select>
</mapper>

在service層創建RoleService接口

import java.util.List;
import java.util.Map;

/**
 * Created by Martin Huang on 2018/7/1.
 */
public interface RoleService {

    public List<Map<String,Object>> getAllRoles() throws Exception;
}

在service層新建impl包,並新增RoleServiceImpl實現類

import com.example.dao.RoleMapper;
import com.example.service.RoleService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.util.List;
import java.util.Map;

/**
 * Created by Martin Huang on 2018/7/1.
 */
@Service
public class RoleServiceImpl implements RoleService {

    @Autowired
    private RoleMapper roleMapper;

    @Override
    public List<Map<String, Object>> getAllRoles() throws Exception {
        return roleMapper.getAllRoles();
    }
}

在MainController中添加私有屬性和一個新的方法

 @Autowired
 private RoleService roleService;

  @RequestMapping("/testSQL")
  @ResponseBody
  public List<Map<String,Object>> testSQL(){
      try
      {
          return  roleService.getAllRoles();
      }catch (Exception e){
          e.printStackTrace();
          return null;
      }
}

運行項目後,如果瀏覽器顯示以下JSON字符串,表示SSM整合成功!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章