1. 程式人生 > >手把手教你搭建與整合SSM框架(文末附原始碼)(Spring MVC + Spring + MyBatis)

手把手教你搭建與整合SSM框架(文末附原始碼)(Spring MVC + Spring + MyBatis)

目錄

1.匯入jar包

2.專案目錄總覽

3.配置Spring IoC容器

4.連線資料庫配置

5.整合mybatis環境

5.1配置對映器 

5.2建立Mapper介面

5.3建立資料庫表和實體類

6.整合Spring MVC

6.1配置 dispatcherServlet

6.2建立控制器controller

6.3建立檢視

7.SSM測試

8.原始碼地址


1.匯入jar包


為了使初學者減少不必要的學習阻礙,本例採用手動匯入jar包(不使用maven),在你的web工程的WEB-INF/lib目錄下匯入如下jar包

這裡給出各jar包的下載地址:

spring和spring-mvc:https://repo.spring.io/release/org/springframework/spring/

myBatis:https://github.com/mybatis/mybatis-3/releases

mybatis-spring:https://github.com/mybatis/spring/release

 

如果不想在官網找的話,其他jar包均可以在mvn倉庫中搜索到,地址:https://mvnrepository.com/,例如mysql的驅動包:

這裡有幾點需要注意:

  1. 要特別注意jar包的版本,不同版本的jar包之間可能會有版本衝突問題,例如mytatis-3.4.2和mybatis-spring-1.2.5會有衝突,不注意到後面報錯會很難排查,建議讀者先按博主的jar包版本下載。
  2. 還是jar包的版本,mysql驅動包6版本之前連線資料庫會有不同,後面會有提到,還是建議讀者和博主版本一致。
  3. 細心的讀者可能會發現myBatis的jar包怎麼會有兩個?這是因為在spring3釋出的時候,myBatis3還沒有完成,所以spring並不支援myBatis3,故MyBatis社群就自己開發了MyBatis-Spring專案用以支援spring。
  4. 在本例中除去log4j日誌包以外都是必須包!

 2.專案目錄總覽


在這裡先給出整個ssm整合與測試的結構圖,目的是為了使讀者能夠全域性的有一個大概印象,也方便在後續的搭建過程中能夠回到這裡查漏補缺,讀者這裡不需要知道每個檔案含義,之後都會說明,如下圖:

 

3.配置Spring IoC容器


IoC(Inversion of Control ),即控制反轉,是spring的核心。什麼是控制反轉呢?簡單來說就是原來由你自己建立並控制的java物件現在交由spring內的容器來控制並管理,即控制權被反轉了,而這個容器就是IoC容器

而配置IoC容器,就是往這個容器中提前放入我們專案中可能會用到的各種物件,什麼時候用,什麼時候再取出來(是不是很方便???),通常我們有兩種方式來配置,一個是xml檔案配置,一個是註解配置。對於第三方的類,我們通常通過xml配置,對於我們自己建立的類,我們通常通過註解進行配置。

在src的根目錄下新建applicationContext.xml檔案(重要部分均做了註釋)

 applicationContext.xml

<?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: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/tx
	    http://www.springframework.org/schema/tx/spring-tx-4.0.xsd
      	http://www.springframework.org/schema/aop
        http://www.springframework.org/schema/aop/spring-aop-4.0.xsd">
          
    <!-- 引入jdbc配置檔案 -->    
    <bean id="propertyConfigurer" class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
        <property name="location" value="classpath:jdbc.properties"/>
    </bean>
    <!-- 配置資料庫連線池 -->
    <bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close">
        <property name="driverClassName" value="${jdbc.mysql.driver}"/>
        <property name="url" value="${jdbc.mysql.url}"/>
        <property name="username" value="${jdbc.mysql.username}"/>
        <property name="password" value="${jdbc.mysql.password}"/>
        <property name="initialSize" value="${jdbc.initialSize}"/>
        <property name="minIdle" value="${jdbc.minIdle}"/>
        <property name="maxIdle" value="${jdbc.maxIdle}"/>
        <property name="maxActive" value="${jdbc.maxActive}"/>
        <property name="maxWait" value="${jdbc.maxWait}"/>
        <property name="defaultAutoCommit" value="${jdbc.defaultAutoCommit}"/>
        <property name="removeAbandoned" value="${jdbc.removeAbandoned}"/>
        <property name="removeAbandonedTimeout" value="${jdbc.removeAbandonedTimeout}"/>
        <property name="testWhileIdle" value="${jdbc.testWhileIdle}"/>
        <property name="timeBetweenEvictionRunsMillis" value="${jdbc.timeBetweenEvictionRunsMillis}"/>
        <property name="numTestsPerEvictionRun" value="${jdbc.numTestsPerEvictionRun}"/>
        <property name="minEvictableIdleTimeMillis" value="${jdbc.minEvictableIdleTimeMillis}"/>
    </bean>
    <!-- 整合mybatis環境 -->
    <bean id="SqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
        <!-- 關聯資料庫連線池 -->
        <property name="dataSource" ref="dataSource"/>
        <!-- 指定mybatis配置檔案 -->
        <property name="configLocation" value = "classpath:sqlMapConfig.xml"/>
    </bean>

	<!-- 啟用掃描機制,並指定掃描對應的包 -->
	<context:annotation-config/>
	<context:component-scan base-package="com.ssm.*"/>
	
    <!-- 採用自動掃描方式建立mapper bean操作資料庫 -->
    <bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
    	<property name="SqlSessionFactoryBeanName" value="SqlSessionFactory"/>
    	<property name="basePackage" value="com.ssm.mapper"/>
    	<!-- 指定標註才掃描成為mapper bean-->
    	<property name="annotationClass" value="org.springframework.stereotype.Repository"/>
    </bean>
    <!-- 配置資料來源事務管理器 -->
    <bean id ="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
    	<property name="dataSource" ref="dataSource"/>
    </bean>
    <!-- 使用註解定義事務-->
    <tx:annotation-driven transaction-manager="transactionManager"/>
   
</beans>

4.連線資料庫配置


觀察IoC容器的配置我們發現引入了jdbc配置檔案,檔案中對資料庫連線的一些屬性進行了設定。

這裡需要注意的是,從mysql-connector-java-6開始,驅動的名稱變成了“com.mysql.cj.jdbc.Driver”,並且資料庫連線地址也需要加上時區(serverTimezone)和useSSL屬性。

在src根目錄下新建jdbc.properties檔案,如下:

 jdbc.properties

#============================================================================
# MySQL
#============================================================================
jdbc.mysql.driver=com.mysql.cj.jdbc.Driver
jdbc.mysql.url=jdbc:mysql://127.0.0.1:3306/ssm?characterEncoding=utf-8&serverTimezone=UTC&useSSL=false
jdbc.mysql.username=root
jdbc.mysql.password=123

jdbc.initialSize=5
jdbc.minIdle=5
jdbc.maxIdle=20
jdbc.maxActive=100
jdbc.maxWait=100000
jdbc.defaultAutoCommit=false
jdbc.removeAbandoned=true
jdbc.removeAbandonedTimeout=600
jdbc.testWhileIdle=true
jdbc.timeBetweenEvictionRunsMillis=60000
jdbc.numTestsPerEvictionRun=20
jdbc.minEvictableIdleTimeMillis=300000

我們觀察IoC配置檔案,在引入了jdbc配置檔案後,開始進行了資料庫連線池的配置,其中<property>標籤的value值是從引入的jdbc配置中得到的。連線資料庫配置的目的是為了之後整合myBatis框架。

5.整合mybatis環境


繼續回到IoC配置檔案,配置完資料庫連線池以後開始整合mybatis,首先需要關聯之前配置的資料庫連線池,之後引入mybatis配置檔案。

在src根目錄下新建檔案sqlMapConfig.xml,如下: 

 sqlMapConfig.xml

<?xml version="1.0" encoding="UTF-8" ?>  
<!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Config 3.0//EN"  
        "http://mybatis.org/dtd/mybatis-3-config.dtd"> 
<configuration>
	<settings>
		<!-- 這個配置使全域性的對映器啟用或禁用快取 -->
		<setting name="cacheEnabled" value="true"/>
		<!-- 允許jdbc支援生成的鍵 -->
		<setting name="useGeneratedKeys" value="true"/>
		<!-- 配置預設的執行器 -->
		<setting name="defaultExecutorType" value="REUSE"/>
		<!-- 全域性啟用或禁用延遲載入 -->
		<setting name="lazyLoadingEnabled" value="true"/>
		<!-- 設定超時時間,它決定驅動等待一個數據庫響應的時間 -->
		<setting name="defaultStatementTimeout" value="25000"/>
	</settings>
	<!-- 別名配置 -->
	<typeAliases>
		<typeAlias alias="role" type="com.ssm.pojo.Role"/>
	</typeAliases>
	<!-- 指定對映器路徑 -->
	<mappers>
		<mapper resource="com/ssm/sqlMapper/RoleMapper.xml"/>
	</mappers>
</configuration>

5.1配置對映器 

觀察sqlMapConfig.xml配置檔案,我們發現在最後引入了對映器配置檔案,對映器的作用是建立實體類與資料庫表之間的一種對映關係,同時在對映器中寫入操作資料庫的sql語句。

新建com/ssm/sqlMapper包,在包下新建RoleMapper.xml配置檔案,如下:

 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.ssm.mapper.RoleMapper">
	
	<select id="getRole" parameterType="long" resultType="role">
  		SELECT id,role_name as roleName,note FROM t_role WHERE ID = #{id}
	</select>
	
	<insert id="insertRole" useGeneratedKeys="true" keyProperty="id">
		insert into t_role (role_name,note)
		values (#{roleName},#{note})
	</insert>

	<update id="updateRole">
		update t_role set
		role_name = #{roleName},
		note = #{note}
		where id = #{id}
	</update>

	<delete id="deleteRole">
		delete from t_role where id = #{id}
	</delete>
</mapper>

5.2建立Mapper介面

有了對映器還不夠,mybatis操作資料庫還需要介面

新建com.ssm.mapper包,新建介面RoleMapper,如下:

介面com.ssm.mapper.RoleMapper 

package com.ssm.mapper;

import org.apache.ibatis.annotations.Param;
import org.springframework.stereotype.Repository;

import com.ssm.pojo.Role;

@Repository
public interface RoleMapper {

	public int insertRole(Role role);
	public int deleteRole(@Param("id") Long id);
	public int updateRole(Role role);
	public Role getRole(@Param("id") Long id);
	
}

5.3建立資料庫表和實體類

至此mybatis的配置已經全部完成,但要操作資料庫我們還需要實體類和資料庫表

實體類(角色):com.ssm.pojo.Role 

package com.ssm.pojo;

public class Role {

	private Long id;
	private String roleName;
	private String note;
	public Long getId() {
		return id;
	}
	public void setId(Long id) {
		this.id = id;
	}
	public String getRoleName() {
		return roleName;
	}
	public void setRoleName(String roleName) {
		this.roleName = roleName;
	}
	public String getNote() {
		return note;
	}
	public void setNote(String note) {
		this.note = note;
	}
	
}

資料庫表:t_role

6.整合Spring MVC

如果你的web專案使用的是servlet3.0標準,那麼你的專案WEB-INF/目錄下是沒有web.xml配置檔案的,這時你要手動在WEB-INF/目錄下建立web.xml配置檔案,如下

web.xml

<?xml version="1.0" encoding="UTF-8"?>
<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_2_5.xsd" id="WebApp_ID" version="2.5">
	
	<!-- 配置spring ioc配置檔案路徑 -->
	<context-param>
		<param-name>contextConfigLocation</param-name>
		<param-value>WEB-INF/classes/applicationContext.xml</param-value>
	</context-param>
	<!-- 配置contextLoaderListener用以初始化spring ioc容器 -->
	<listener>
		<listener-class>
			org.springframework.web.context.ContextLoaderListener
		</listener-class>
	</listener>
	<!-- 配置dispatcherServlet -->
	<servlet>
		<!-- 注意:spring mvc框架會根據servlet-name配置,找到/WEB-INF/dispatcher-servlet.xml作為配置檔案載入web工程中 -->
		<servlet-name>dispatcher</servlet-name>
		<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
		<!-- 使得dispatch在伺服器啟動的時候就初始化 -->
		<load-on-startup>2</load-on-startup>
	</servlet>
	<!-- servlet攔截配置 -->
	<servlet-mapping>
		<servlet-name>dispatcher</servlet-name>
		<url-pattern>*.do</url-pattern>
	</servlet-mapping>
	
</web-app>

觀察以上配置檔案發現引入了我們之前配置的IoC配置檔案,使得專案啟動的時候能初始化IoC容器,同時配置檔案中引入了dispatcherServlet配置檔案 ,dispathcerServlet是spring mvc的核心,對到來的請求進行處理和排程。

6.1配置 dispatcherServlet

在WEB-INF/目錄下新建dispatcher-servlet.xml配置檔案

 dispatcher-servlet.xml

<?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:aop="http://www.springframework.org/schema/aop"
       xmlns:tx="http://www.springframework.org/schema/tx"
       xmlns:p="http://www.springframework.org/schema/p"
       xmlns:mvc="http://www.springframework.org/schema/mvc"
       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/tx
	    http://www.springframework.org/schema/tx/spring-tx-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/mvc
        http://www.springframework.org/schema/mvc/spring-mvc-4.0.xsd">
        
        <!-- 使用註解驅動 -->
        <mvc:annotation-driven/>
        <!-- 定義掃描裝載的包 -->
        <context:component-scan base-package="com.*"/>
        <!-- 定義檢視解析器 -->
        <!-- 找到web工程/WEB-INF/jsp資料夾,且檔案結尾為.jsp的檔案作為對映 -->
        <bean id="viewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver"
         p:prefix="/WEB-INF/jsp/" p:suffix=".jsp"/>
        <!-- 開啟註解事務-->
    	<tx:annotation-driven transaction-manager="transactionManager"/>
</beans>
        

轉發器配置檔案中主要配置瞭解析器,根據你的請求分發到指定目錄的檢視進行解析。

6.2建立控制器controller

新建包com.ssm.controller,新建java類RoleController.class:

package com.ssm.controller;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.servlet.ModelAndView;

import com.ssm.pojo.Role;
import com.ssm.service.RoleService;

@Controller
//請求在"/role"路徑下才執行此控制器
@RequestMapping("/role")
public class RoleController {

	@Autowired
	private RoleService roleService = null;
	//請求在getRole路徑下此方法才執行
	@RequestMapping(value="/getRole",method=RequestMethod.GET)
	public ModelAndView getRole(@RequestParam("id") Long id) {
		
		Role role = roleService.getRole(id);
		ModelAndView mv = new ModelAndView();
		mv.setViewName("roleDetails");
		mv.addObject("role", role);
		return mv;
	}
}

 控制器接受請求引數取出role存入模型中並轉發到指定檢視(這裡是roleDetails)進行解析。

6.3建立檢視

根據檢視解析器的配置,我們在WEB-INF/目錄下新建資料夾jsp,同時新建jsp頁面roleDetails.jsp:

 roleDetails.jsp

<%@ page pageEncoding="utf-8"%>
<html>
<head>
<meta charset="UTF-8">
<title>ssm框架測試</title>
</head>
<body>
<b>角色名稱:</b><span>${role.roleName}</span><br/>
<b>角色描述:</b><span>${role.note}</span>
</body>
</html>

jsp頁面中我們通過el表示式對資料進行展示。

7.SSM測試

到這裡ssm的整合就全部完成了,我們開始進行測試,從資料庫中取出角色資訊返回到jsp頁面中進行展示

新建com.ssm.service和com.ssm.service.impl包,分別建立RoleService介面和RoleServiceImpl實現類:

 RoleService介面

package com.ssm.service;

import com.ssm.pojo.Role;

public interface RoleService {
	public Role getRole(Long id);
}

 RoleServiceImpl實現類

package com.ssm.service.impl;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Isolation;
import org.springframework.transaction.annotation.Propagation;
import org.springframework.transaction.annotation.Transactional;

import com.ssm.mapper.RoleMapper;
import com.ssm.pojo.Role;
import com.ssm.service.RoleService;

@Service//表示此類將自動註冊到spring容器中去(前提是已經在xml配置檔案中啟用了掃描)
public class RoleServiceImpl implements RoleService {

	@Autowired
	private RoleMapper roleMapper = null;

	@Override
	public Role getRole(Long id) {
		return roleMapper.getRole(id);
	}

}

 到這裡啟動tomcat伺服器,輸入請求:http://localhost:8080/project-181107-ssm/role/getRole.do?id=1得到頁面:

執行成功,ssm整合成功!!!!

在這裡我簡單梳理一下這個測試的整個執行流程:

頁面發出請求,通過dispatcherServlet分發到指定的controller進行響應,controller接收請求引數,根據引數,通過service到資料庫中取出對應id的Role,之後控制器將得到的Role物件裝進ModelAndView(模型與檢視)中,之後將ModelAndView物件返回給指定的檢視(jsp頁面),頁面通過EL表示式得到Role物件的資訊並展示出來。

controller中的RoleService內部是通過我們之前配置的RoleMapper介面去資料庫中取出資料的,同時我們把資料庫操作的Mapper介面都放入了Spring IoC容器中,至此整個SSM框架都聯通起來了。

8.原始碼地址

連結:https://pan.baidu.com/s/1lpkIf_PSQbY4lJvGX-hZ1A 
           提取碼:mj2r 

歡迎留言討論指正......^_^......