手把手教你搭建與整合SSM框架(文末附原始碼)(Spring MVC + Spring + MyBatis)
目錄
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的驅動包:
這裡有幾點需要注意:
- 要特別注意jar包的版本,不同版本的jar包之間可能會有版本衝突問題,例如mytatis-3.4.2和mybatis-spring-1.2.5會有衝突,不注意到後面報錯會很難排查,建議讀者先按博主的jar包版本下載。
- 還是jar包的版本,mysql驅動包6版本之前連線資料庫會有不同,後面會有提到,還是建議讀者和博主版本一致。
- 細心的讀者可能會發現myBatis的jar包怎麼會有兩個?這是因為在spring3釋出的時候,myBatis3還沒有完成,所以spring並不支援myBatis3,故MyBatis社群就自己開發了MyBatis-Spring專案用以支援spring。
- 在本例中除去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
歡迎留言討論指正......^_^......