1、准備
IntelliJ IDEA
Tomcat
JDK
Maven
mysql
spring、springmvc、mybatis 了解
現在假設如上條件你都具備,那么通過我這篇博客 你一定可以整合出 SSM 框架,完成如下效果

整個博客共分為三部分:
- 建立 基於 Maven 的 WEB 項目,啟動 Tomcat ,項目啟動
- 整合 Mybatis+Spring ,進行單元測試 可以完成從數據庫查詢出數據功能
- 整合 Mybaits+Spring+SpringMVC,輸入Url 完成整個 MVC 的流程
2、步驟
因為說的比較細,所以前面第一部分都了解可以跳過。
2.1 第一部分
1.新建基於 Maven 的Web工程

2.填寫 GroupId 和 ArtifactId,參考
groupId一般分為多個段,這里我只說兩段,第一段為域,第二段為公司名稱。域又分為org、com、cn等等許多,其中org為非營利組織,com為商業組織。舉個apache公司的tomcat項目例子:這個項目的groupId是org.apache,它的域是org(因為tomcat是非營利項目),公司名稱是apache,artigactId是tomcat。

3.填寫 Maven 配置。

圖片中1、2、3分別: 1:首先你要先配置好 Maven,如果配置好了,去 CMD DOSS 界面下輸入mvn --version
命令,如果有顯示,則代表已經配置好了,如果沒,下載maven,配置環境變量。 maven下載地址
2:選擇我們的 maven 文件夾下的 setting,這里特別要注意,可能因為 “牆”的原因,下載 maven jar 包 很容易卡住,所以建議在 setting.xml
配置國內鏡像,比如阿里雲。
1 <!-- 復制如上一段鏡像代碼配置,添加阿里雲鏡像 --> 2 <mirror> 3 <id>alimaven</id> 4 <mirrorOf>central</mirrorOf> 5 <name>aliyun maven</name> 6 <url>http://maven.aliyun.com/nexus/content/groups/public/</url> 7 </mirror>

在相應位置填上如上代碼即可。
3.這里為了從頭開始,我新建了個倉庫地址。這里大家隨意,也可以和我一樣。

4.填寫工程名,module名,前者是 workspace 后者代表一個項目

5.建立架構包



新建文件夾,利用Sources
Resources
兩個標簽分別轉化 Java 和 Resources 文件夾
6.新建tomcat並且配置


7.啟動項目

2.2 第二部分
**1.添加 maven 依賴。**因為 pom.xml 里面 jar 包太多,太占內容,所以從源碼中復制吧。
2.因為SSM三者整合全部放在一個 .xml 中太雜。所以這里拆成三個 spring-mybaits.xml
,spring-service
,spring-web
配置 spring-mybatis.xml
,包含如下內容:
- 數據庫配置文件
jdbc.properties
。包含數據庫地址 密碼 庫名等等。
1 <!-- 1.配置數據庫相關參數properties的屬性:${url} --> 2 <context:property-placeholder location="classpath:jdbc.properties" />
- 連接池。這里使用 c3p0。
1 <!-- 2.數據庫連接池 --> 2 <bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource"> 3 <!-- 配置連接池屬性 --> 4 <property name="driverClass" value="${jdbc.driver}" /> 5 <property name="jdbcUrl" value="${jdbc.url}" /> 6 <property name="user" value="${jdbc.username}" /> 7 <property name="password" value="${jdbc.password}" /> 8 9 <!-- c3p0連接池的私有屬性 --> 10 <property name="maxPoolSize" value="30" /> 11 <property name="minPoolSize" value="10" /> 12 <!-- 關閉連接后不自動commit --> 13 <property name="autoCommitOnClose" value="false" /> 14 <!-- 獲取連接超時時間 --> 15 <property name="checkoutTimeout" value="10000" /> 16 <!-- 當獲取連接失敗重試次數 --> 17 <property name="acquireRetryAttempts" value="2" /> 18 </bean>
- 配置SqlSessionFactory對象。專用來獲取 sqlSession。
1 <!-- 3.配置SqlSessionFactory對象 --> 2 <bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean"> 3 <!-- 注入數據庫連接池 --> 4 <property name="dataSource" ref="dataSource" /> 5 <!-- 配置MyBaties全局配置文件:mybatis-config.xml --> 6 <property name="configLocation" value="classpath:mybatis-config.xml" /> 7 <!-- 掃描entity包 使用別名 --> 8 <property name="typeAliasesPackage" value="ssm.entity" /> 9 <!-- 掃描sql配置文件:mapper需要的xml文件 --> 10 <property name="mapperLocations" value="classpath*:mapper/*.xml" /> 11 </bean>
在 resources
下新建 mybatis-config.xml
,此文件也稱作 mybatis 的核心配置文件。里面內容為空 暫時
1 <?xml version="1.0" encoding="UTF-8" ?> 2 <!DOCTYPE configuration 3 PUBLIC "-//mybatis.org//DTD Config 3.0//EN" 4 "http://mybatis.org/dtd/mybatis-3-config.dtd"> 5 <configuration> 6 7 </configuration>
新建 entity 包,用來放實體類,也就是 pojo。同時在 sqlSession 工廠中掃描整個實體類包。這樣在 mapper 中就可以用 類名做別名,不用寫整個類的相對位置路徑了。
1 <select id="queryUserListByUsername" parameterType="String" resultType="User"> 2 SELECT 3 * 4 FROM 5 USER 6 WHERE 7 username = #{username} 8 </select>
比如其中的 User。不然就要寫成
1 ssm.entity.User
對於 sql 配置文件,我這里放在 resources-->mapper--> 下。

對於 *mapper.xml 的位置處理有很多中方式。有的放在 mapper
包下。然后在 mapper
下建立兩個包,分別放 dao
和 mapper

還有分別根據功能建包,一個功能建一個包,其中包含一組 功能文件,分別是 *Dao *Mapper.xml

具體怎樣做根據實際項目情況來,如果項目系統功能復雜還是建議后面兩種,不然到時候會很痛苦(項目多,文件就多,如果第一種方法,則跨度大,屏幕占滿 :) )
<property name="mapperLocations" value="classpath*:mapper/*.xml" />
<property name="configLocation" value="classpath:mybatis-config.xml" />
根據自己實際情況填寫
- mapper 動態代理開發,掃描 dao 接口。
1 <!-- 4.配置掃描Dao接口包,動態實現Dao接口,注入到spring容器中 --> 2 <bean class="org.mybatis.spring.mapper.MapperScannerConfigurer"> 3 <!-- 注入sqlSessionFactory --> 4 <property name="sqlSessionFactoryBeanName" value="sqlSessionFactory" /> 5 <!-- 給出需要掃描Dao接口包 --> 6 <property name="basePackage" value="ssm.dao" /> 7 </bean>
<property name="basePackage" value="ssm.dao" />
根據自己實際情況填寫
ok!到這里位置,我們的 spring-mybatis 就配置好了。已經可以通過 mybatis 操作數據庫了,現在我們來測試下 這一步出問題沒。 先往數據庫插入一些數據。這里我提供一份我的 sql 文件,如果各位有需要, 直接運行就可以了。
1 DROP TABLE IF EXISTS `items`; 2 CREATE TABLE `items` ( 3 `id` int(11) NOT NULL AUTO_INCREMENT, 4 `name` varchar(32) NOT NULL COMMENT '商品名稱', 5 `price` float(10,1) NOT NULL COMMENT '商品定價', 6 `detail` text COMMENT '商品描述', 7 `pic` varchar(64) DEFAULT NULL COMMENT '商品圖片', 8 `createtime` datetime NOT NULL COMMENT '生產日期', 9 PRIMARY KEY (`id`) 10 ) ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=utf8; 11 12 -- ---------------------------- 13 -- Records of items 14 -- ---------------------------- 15 INSERT INTO `items` VALUES ('1', '台式機', '3000.0', '該電腦質量非常好!!!!', null, '2016-02-03 13:22:53'); 16 INSERT INTO `items` VALUES ('2', '筆記本', '6000.0', '筆記本性能好,質量好!!!!!', null, '2015-02-09 13:22:57'); 17 INSERT INTO `items` VALUES ('3', '背包', '200.0', '名牌背包,容量大質量好!!!!', null, '2015-02-06 13:23:02'); 18 19 -- ---------------------------- 20 -- Table structure for user 21 -- ---------------------------- 22 DROP TABLE IF EXISTS `user`; 23 CREATE TABLE `user` ( 24 `id` int(11) NOT NULL AUTO_INCREMENT, 25 `username` varchar(32) NOT NULL COMMENT '用戶名稱', 26 `birthday` date DEFAULT NULL COMMENT '生日', 27 `sex` char(1) DEFAULT NULL COMMENT '性別', 28 `address` varchar(256) DEFAULT NULL COMMENT '地址', 29 PRIMARY KEY (`id`) 30 ) ENGINE=InnoDB AUTO_INCREMENT=27 DEFAULT CHARSET=utf8; 31 32 -- ---------------------------- 33 -- Records of user 34 -- ---------------------------- 35 INSERT INTO `user` VALUES ('1', '王五', null, '2', null); 36 INSERT INTO `user` VALUES ('10', '張三', '2014-07-10', '1', '北京市'); 37 INSERT INTO `user` VALUES ('16', '張小明', null, '1', '河南鄭州'); 38 INSERT INTO `user` VALUES ('22', '陳小明', null, '1', '河南鄭州'); 39 INSERT INTO `user` VALUES ('24', '張三豐', null, '1', '河南鄭州'); 40 INSERT INTO `user` VALUES ('25', '陳小明', null, '1', '河南鄭州'); 41 INSERT INTO `user` VALUES ('26', '王五', null, null, null);
這是整個項目的結構。 在 entity
下建立 User
實體類,注意字段對齊。 在 dao
下建立 UserDao
1 import org.apache.ibatis.annotations.Param; 2 import ssm.entity.User; 3 import java.util.List; 4 5 /** 6 * Created by guozhaohui628@gmail.com on 2018/5/7 7 * Description: 8 */ 9 public interface UserDao { 10 11 public List<User> queryUserListByUsername(String username); 12 13 public List<User> queryUserListByUsername2Sex(@Param("username")String username, @Param("sex") int sex); 14 15 }
在 mapper
下新建 UserMappper.xml
用來寫 sql 語句。因為測試,所以這里寫一個簡單的 sql 查詢。
1 <?xml version="1.0" encoding="UTF-8"?> 2 <!DOCTYPE mapper 3 PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" 4 "http://mybatis.org/dtd/mybatis-3-mapper.dtd"> 5 <mapper namespace="ssm.mapper.UserDao"> 6 <!-- 目的:為dao接口方法提供sql語句配置 --> 7 <select id="queryUserListByUsername" parameterType="String" resultType="User"> 8 SELECT 9 * 10 FROM 11 USER 12 WHERE 13 username = #{username} 14 </select> 15 16 <select id="queryUserListByUsername2Sex" resultType="User"> 17 SELECT 18 * 19 FROM 20 USER 21 WHERE 22 username = #{username} 23 AND sex = #{sex} 24 </select> 25 </mapper>
其中有一個地方要注意 <mapper namespace="ssm.mapper.UserDao">
映射位置 換成自己的,可能我們兩不一樣。
這里有個小技巧特別要注意,一般開發中,我們都是先在把 sql 寫完運行正確才放到這里面來,比如下圖中,並且為了美觀,復制 sql 語句前都會規范下 sql 語句,避免太亂。

ok! 寫一個測試類 測試下。
1 import org.junit.Test; 2 import org.springframework.context.ApplicationContext; 3 import org.springframework.context.support.ClassPathXmlApplicationContext; 4 import ssm.dao.UserDao; 5 import ssm.entity.User; 6 7 import java.util.List; 8 9 /** 10 * Created by guozhaohui628@gmail.com on 2018/5/7 11 * Description: 12 */ 13 public class TestPratice { 14 @Test 15 public void A(){ 16 ApplicationContext ac = new ClassPathXmlApplicationContext("spring-mybatis.xml"); 17 UserDao userDao = ac.getBean(UserDao.class); 18 List<User> userList = userDao.queryUserListByUsername2Sex("王五",1); 19 // List<User> userList = userDao.queryUserListByUsername("王五"); 20 System.out.println(userList.toString()); 21 } 22 }
好的,到這一步,說明我們的 mybatis 和 spring 整合沒問題。
2.3 第三部分
現在來寫 spring-service.xml
,比較簡單,就是掃描下 service
類包和配置事務。
1 <?xml version="1.0" encoding="UTF-8"?> 2 <beans xmlns="http://www.springframework.org/schema/beans" 3 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 4 xmlns:context="http://www.springframework.org/schema/context" 5 xmlns:tx="http://www.springframework.org/schema/tx" 6 xsi:schemaLocation="http://www.springframework.org/schema/beans 7 http://www.springframework.org/schema/beans/spring-beans.xsd 8 http://www.springframework.org/schema/context 9 http://www.springframework.org/schema/context/spring-context.xsd 10 http://www.springframework.org/schema/tx 11 http://www.springframework.org/schema/tx/spring-tx.xsd"> 12 <!-- 掃描service包下所有使用注解的類型 --> 13 <context:component-scan base-package="ssm.service" /> 14 15 <!-- 配置事務管理器 --> 16 <bean id="transactionManager" 17 class="org.springframework.jdbc.datasource.DataSourceTransactionManager"> 18 <!-- 注入數據庫連接池 --> 19 <property name="dataSource" ref="dataSource" /> 20 </bean> 21 22 <!-- 配置基於注解的聲明式事務 --> 23 <tx:annotation-driven transaction-manager="transactionManager" /> 24 </beans>
spring-web
,里面內容比較少,只是掃描了
controller
用來保證前端控制器
DispatcherServlet
能夠找到並進入相關方法中。 同時還配置了試圖解析器
ViewResolve
, 這樣我們跳轉視圖時直接寫 視圖名稱即可,不用寫相對地址路徑了。
1 <!-- 3.配置jsp 顯示ViewResolver --> 2 <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver"> 3 <property name="viewClass" value="org.springframework.web.servlet.view.JstlView" /> 4 <property name="prefix" value="/jsp/" /> 5 <property name="suffix" value=".jsp" /> 6 </bean> 7 8 <!-- 4.掃描web相關的 controller --> 9 <context:component-scan base-package="ssm.controller" />
最后就是配置 web.xml。主要作用是 配置 前端控制器 DispatcherServlet
重點是攔截規則處理。這里我們是所有都攔截。其次是 剛才我們 書寫的 三個 spring-*.xml
文件在這里配置啟動。
1 <!-- spring mvc servlet--> 2 <servlet> 3 <servlet-name>SpringMVC</servlet-name> 4 <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class> 5 <init-param> 6 <param-name>contextConfigLocation</param-name> 7 <param-value>classpath:/spring-*.xml</param-value> 8 </init-param> 9 </servlet> 10 <servlet-mapping> 11 <servlet-name>SpringMVC</servlet-name> 12 <!-- 此處也可以配置成 *.do *.action形式 --> 13 <url-pattern>/</url-pattern> 14 </servlet-mapping>
然后就是日志和編碼,對於當前的測試沒啥作用,但是還是配置好吧
1 <context-param> 2 <param-name>log4jConfigLocation</param-name> 3 <param-value>classpath:log4j.properties</param-value> 4 </context-param> 5 6 <!-- 編碼過濾器 --> 7 <filter> 8 <filter-name>encodingFilter</filter-name> 9 <filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class> 10 <init-param> 11 <param-name>encoding</param-name> 12 <param-value>UTF-8</param-value> 13 </init-param> 14 </filter> 15 <filter-mapping> 16 <filter-name>encodingFilter</filter-name> 17 <url-pattern>/*</url-pattern> 18 </filter-mapping>
好的 終於搞完了,現在可以安心的寫代碼了。現在准備一個這樣的 jsp 文件。
1 <%@ page language="java" contentType="text/html; charset=UTF-8" 2 pageEncoding="UTF-8"%> 3 <%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %> 4 <%@ taglib uri="http://java.sun.com/jsp/jstl/fmt" prefix="fmt"%> 5 <%@ page isELIgnored="false" %> 6 <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> 7 <html> 8 <head> 9 <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> 10 <title>查詢商品列表</title> 11 </head> 12 <body> 13 <form action="${pageContext.request.contextPath}/items/queryitem.action" method="post"> 14 查詢條件: 15 <table width="100%" border=1> 16 <tr> 17 <td><input type="submit" value="查詢"/></td> 18 </tr> 19 </table> 20 商品列表: 21 <table width="100%" border=1> 22 <tr> 23 <td>商品名稱</td> 24 <td>商品價格</td> 25 <td>生產日期</td> 26 <td>商品描述</td> 27 <td>操作</td> 28 </tr> 29 <c:forEach items="${itemList }" var="item"> 30 <tr> 31 <td>${item.name }</td> 32 <td>${item.price }</td> 33 <td>${item.createtime}</td> 34 <td>${item.detail }</td> 35 <td><a href="${pageContext.request.contextPath }/itemEdit.action?id=${item.id}">修改</a></td> 36 </tr> 37 </c:forEach> 38 </table> 39 </form> 40 </body> 41 42 </html>
我們需要查詢所有的 item 數據顯示在上面。
首先寫 ItemsDao
1 import org.springframework.stereotype.Repository; 2 import ssm.entity.Items; 3 4 import java.util.List; 5 6 /** 7 * Created by guozhaohui628@gmail.com on 2018/5/8 8 * Description: 9 */ 10 @Repository 11 public interface ItemsDao { 12 public List<Items> queryAllItemsList(); 13 }
對應的 ImtesMapper.xml
1 <?xml version="1.0" encoding="UTF-8"?> 2 <!DOCTYPE mapper 3 PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" 4 "http://mybatis.org/dtd/mybatis-3-mapper.dtd"> 5 <mapper namespace="ssm.dao.ItemsDao"> 6 <!-- 目的:為dao接口方法提供sql語句配置 --> 7 <select id="queryAllItemsList" resultType="Items"> 8 SELECT 9 * 10 FROM 11 items; 12 </select> 13 </mapper>
書寫 ItemsService
接口和 其實現類
1 import ssm.entity.Items; 2 3 import java.util.List; 4 5 /** 6 * Created by guozhaohui628@gmail.com on 2018/5/8 7 * Description: 8 */ 9 public interface ItemsService { 10 11 List<Items> queryAllItemsList(); 12 13 }
1 package ssm.service; 2 3 import org.springframework.beans.factory.annotation.Autowired; 4 import org.springframework.stereotype.Service; 5 import ssm.dao.ItemsDao; 6 import ssm.entity.Items; 7 8 import java.util.List; 9 10 /** 11 * Created by guozhaohui628@gmail.com on 2018/5/8 12 * Description: 13 */ 14 @Service 15 public class ItemsServiceImpl implements ItemsService { 16 17 // 注入Service依賴 18 @Autowired 19 private ItemsDao itemsdao; 20 21 @Override 22 public List<Items> queryAllItemsList() { 23 return itemsdao.queryAllItemsList(); 24 } 25 }
最后寫 ItemsController
1 import org.springframework.beans.factory.annotation.Autowired; 2 import org.springframework.stereotype.Controller; 3 import org.springframework.web.bind.annotation.RequestMapping; 4 import org.springframework.web.servlet.ModelAndView; 5 import ssm.entity.Items; 6 import ssm.service.ItemsServiceImpl; 7 8 import java.util.List; 9 10 11 /** 12 * Created by guozhaohui628@gmail.com on 2018/5/8 13 * Description: 14 */ 15 @Controller 16 public class ItemsController { 17 18 19 // 注入Service依賴 20 @Autowired 21 private ItemsServiceImpl itemsService; 22 23 @RequestMapping(value = "items/queryitem.action") 24 public ModelAndView itemsList(){ 25 ModelAndView mav = new ModelAndView(); 26 List<Items> itemsList = itemsService.queryAllItemsList(); 27 System.out.println(itemsList.toString()); 28 mav.addObject("itemList", itemsList); 29 mav.setViewName("itemList"); 30 return mav; 31 } 32 }
.jsp中的代碼已經寫好了,直接用就可以了。 我們要測試 要么直接點擊這個地址,要么點擊查詢
OK, 完事兒,寫的比較細,所以比較長。希望對你有幫助~