SSM框架搭建教程(從零開始,圖文結合)


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.建立架構包

這里寫圖片描述
 
如果這里彈出此對話框,記得點擊 auto。

這里寫圖片描述

這里寫圖片描述

新建文件夾,利用Sources Resources 兩個標簽分別轉化 Java 和 Resources 文件夾

6.新建tomcat並且配置

這里寫圖片描述 這里寫圖片描述

7.啟動項目

這里寫圖片描述

2.2 第二部分

**1.添加 maven 依賴。**因為 pom.xml 里面 jar 包太多,太占內容,所以從源碼中復制吧。

2.因為SSM三者整合全部放在一個 .xml 中太雜。所以這里拆成三個 spring-mybaits.xmlspring-servicespring-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 下建立兩個包,分別放 daomapper

這里寫圖片描述

還有分別根據功能建包,一個功能建一個包,其中包含一組 功能文件,分別是 *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 + springmvc 整合 建立 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, 完事兒,寫的比較細,所以比較長。希望對你有幫助~

參考:


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM