【從零開始 圖文詳解】IDEA整合SSM框架:Spring+SpringMVC+Mybatis

1 準備

IntelliJ IDEA
Tomcat
JDK
Maven
mysql
spring、springmvc、mybatis 瞭解html

如今假設如上條件你都具有,那麼經過我這篇博客 你必定能夠整合出 SSM 框架,完成以下效果前端

這裏寫圖片描述

整個博客共分爲三部分:java

  • 創建 基於 Maven 的 WEB 項目,啓動 Tomcat ,項目啓動
  • 整合 Mybatis+Spring ,進行單元測試 能夠完成從數據庫查詢出數據功能
  • 整合 Mybaits+Spring+SpringMVC,輸入Url 完成整個 MVC 的流程

2 步驟

由於說的比較細,因此前面第一部分都瞭解能夠跳過。mysql

2.1 第一部分

1.新建基於 Maven 的Web工程 git

這裏寫圖片描述

2.填寫 GroupId 和 ArtifactId,參考github

 groupId通常分爲多個段,這裏我只說兩段,第一段爲域,第二段爲公司名稱。域又分爲org、com、cn等等許多,其中org爲非營利組織,com爲商業組織。舉個apache公司的tomcat項目例子:這個項目的groupId是org.apache,它的域是org(由於tomcat是非營利項目),公司名稱是apache,artigactId是tomcat。web

這裏寫圖片描述

3.填寫 Maven 配置。 spring

這裏寫圖片描述

圖片中一、二、3分別: 1:首先你要先配置好 Maven,若是配置好了,去 CMD DOSS 界面下輸入mvn --version 命令,若是有顯示,則表明已經配置好了,若是沒,下載maven,配置環境變量。 maven下載地址sql

2:選擇咱們的 maven 文件夾下的 setting,這裏特別要注意,可能由於 「牆」的緣由,下載 maven jar 包 很容易卡住,因此建議在 setting.xml 配置國內鏡像,好比阿里雲。數據庫

<!-- 複製如上一段鏡像代碼配置,添加阿里雲鏡像 -->
	 <mirror>
      <id>alimaven</id>
      <mirrorOf>central</mirrorOf>
      <name>aliyun maven</name>
      <url>http://maven.aliyun.com/nexus/content/groups/public/</url>
    </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.配置數據庫相關參數properties的屬性:${url} -->
    <context:property-placeholder location="classpath:jdbc.properties" />
複製代碼
  • 鏈接池。這裏使用 c3p0。
<!-- 2.數據庫鏈接池 -->
    <bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource">
        <!-- 配置鏈接池屬性 -->
        <property name="driverClass" value="${jdbc.driver}" />
        <property name="jdbcUrl" value="${jdbc.url}" />
        <property name="user" value="${jdbc.username}" />
        <property name="password" value="${jdbc.password}" />

        <!-- c3p0鏈接池的私有屬性 -->
        <property name="maxPoolSize" value="30" />
        <property name="minPoolSize" value="10" />
        <!-- 關閉鏈接後不自動commit -->
        <property name="autoCommitOnClose" value="false" />
        <!-- 獲取鏈接超時時間 -->
        <property name="checkoutTimeout" value="10000" />
        <!-- 當獲取鏈接失敗重試次數 -->
        <property name="acquireRetryAttempts" value="2" />
    </bean>
複製代碼
  • 配置SqlSessionFactory對象。專用來獲取 sqlSession。
<!-- 3.配置SqlSessionFactory對象 -->
    <bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
        <!-- 注入數據庫鏈接池 -->
        <property name="dataSource" ref="dataSource" />
        <!-- 配置MyBaties全局配置文件:mybatis-config.xml -->
        <property name="configLocation" value="classpath:mybatis-config.xml" />
        <!-- 掃描entity包 使用別名 -->
        <property name="typeAliasesPackage" value="ssm.entity" />
        <!-- 掃描sql配置文件:mapper須要的xml文件 -->
        <property name="mapperLocations" value="classpath*:mapper/*.xml" />
    </bean>
複製代碼

resources 下新建 mybatis-config.xml ,此文件也稱做 mybatis 的核心配置文件。裏面內容爲空 暫時

<?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>

</configuration>
複製代碼

新建 entity 包,用來放實體類,也就是 pojo。同時在 sqlSession 工廠中掃描整個實體類包。這樣在 mapper 中就能夠用 類名作別名,不用寫整個類的相對位置路徑了。

<select id="queryUserListByUsername" parameterType="String" resultType="User">
      SELECT
            *
      FROM
            USER
      WHERE
	        username = #{username}
  </select>
複製代碼

好比其中的 User。否則就要寫成

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 接口。
<!-- 4.配置掃描Dao接口包,動態實現Dao接口,注入到spring容器中 -->
    <bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
        <!-- 注入sqlSessionFactory -->
        <property name="sqlSessionFactoryBeanName" value="sqlSessionFactory" />
        <!-- 給出須要掃描Dao接口包 -->
        <property name="basePackage" value="ssm.dao" />
    </bean>
複製代碼

<property name="basePackage" value="ssm.dao" /> 根據本身實際狀況填寫

ok!到這裏位置,咱們的 spring-mybatis 就配置好了。已經能夠經過 mybatis 操做數據庫了,如今咱們來測試下 這一步出問題沒。 先往數據庫插入一些數據。這裏我提供一份個人 sql 文件,若是各位有須要, 直接運行就能夠了。

DROP TABLE IF EXISTS `items`;
CREATE TABLE `items` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `name` varchar(32) NOT NULL COMMENT '商品名稱',
  `price` float(10,1) NOT NULL COMMENT '商品訂價',
  `detail` text COMMENT '商品描述',
  `pic` varchar(64) DEFAULT NULL COMMENT '商品圖片',
  `createtime` datetime NOT NULL COMMENT '生產日期',
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=utf8;

-- ----------------------------
-- Records of items
-- ----------------------------
INSERT INTO `items` VALUES ('1', '臺式機', '3000.0', '該電腦質量很是好!!!!', null, '2016-02-03 13:22:53');
INSERT INTO `items` VALUES ('2', '筆記本', '6000.0', '筆記本性能好,質量好!!!!!', null, '2015-02-09 13:22:57');
INSERT INTO `items` VALUES ('3', '揹包', '200.0', '名牌揹包,容量大質量好!!!!', null, '2015-02-06 13:23:02');

-- ----------------------------
-- Table structure for user
-- ----------------------------
DROP TABLE IF EXISTS `user`;
CREATE TABLE `user` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `username` varchar(32) NOT NULL COMMENT '用戶名稱',
  `birthday` date DEFAULT NULL COMMENT '生日',
  `sex` char(1) DEFAULT NULL COMMENT '性別',
  `address` varchar(256) DEFAULT NULL COMMENT '地址',
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=27 DEFAULT CHARSET=utf8;

-- ----------------------------
-- Records of user
-- ----------------------------
INSERT INTO `user` VALUES ('1', '王五', null, '2', null);
INSERT INTO `user` VALUES ('10', '張三', '2014-07-10', '1', '北京市');
INSERT INTO `user` VALUES ('16', '張小明', null, '1', '河南鄭州');
INSERT INTO `user` VALUES ('22', '陳小明', null, '1', '河南鄭州');
INSERT INTO `user` VALUES ('24', '張三丰', null, '1', '河南鄭州');
INSERT INTO `user` VALUES ('25', '陳小明', null, '1', '河南鄭州');
INSERT INTO `user` VALUES ('26', '王五', null, null, null);
複製代碼

這裏寫圖片描述

這裏寫圖片描述

這是整個項目的結構。 在 entity 下創建 User 實體類,注意字段對齊。 在 dao 下創建 UserDao

import org.apache.ibatis.annotations.Param;
import ssm.entity.User;
import java.util.List;

/**
 * Created by guozhaohui628@gmail.com on 2018/5/7
 * Description:
 */
public interface UserDao {

    public List<User> queryUserListByUsername(String username);

    public List<User> queryUserListByUsername2Sex(@Param("username")String username, @Param("sex") int sex);

}
複製代碼

mapper 下新建 UserMappper.xml 用來寫 sql 語句。由於測試,因此這裏寫一個簡單的 sql 查詢。

<?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="ssm.mapper.UserDao">
    <!-- 目的:爲dao接口方法提供sql語句配置 -->
  <select id="queryUserListByUsername" parameterType="String" resultType="User">
      SELECT
            *
      FROM
            USER
      WHERE
	        username = #{username}
  </select>

    <select id="queryUserListByUsername2Sex" resultType="User">
        SELECT
            *
        FROM
            USER
        WHERE
            username = #{username}
        AND sex = #{sex}
    </select>
</mapper>
複製代碼

其中有一個地方要注意 <mapper namespace="ssm.mapper.UserDao"> 映射位置 換成本身的,可能咱們兩不同。

這裏有個小技巧特別要注意,通常開發中,咱們都是先在把 sql 寫完運行正確才放到這裏面來,好比下圖中,而且爲了美觀,複製 sql 語句前都會規範下 sql 語句,避免太亂。

這裏寫圖片描述

ok! 寫一個測試類 測試下。

import org.junit.Test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import ssm.dao.UserDao;
import ssm.entity.User;

import java.util.List;

/**
 * Created by guozhaohui628@gmail.com on 2018/5/7
 * Description:
 */
public class TestPratice {
    @Test
    public void A(){
        ApplicationContext ac = new ClassPathXmlApplicationContext("spring-mybatis.xml");
        UserDao userDao = ac.getBean(UserDao.class);
        List<User> userList = userDao.queryUserListByUsername2Sex("王五",1);
//        List<User> userList = userDao.queryUserListByUsername("王五");
        System.out.println(userList.toString());
    }
}
複製代碼

這裏寫圖片描述

好的,到這一步,說明咱們的 mybatis 和 spring 整合沒問題。

2.3 第三部分

如今來寫 spring-service.xml ,比較簡單,就是掃描下 service 類包和配置事務。

<?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:tx="http://www.springframework.org/schema/tx"
       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx.xsd">
    <!-- 掃描service包下全部使用註解的類型 -->
    <context:component-scan base-package="ssm.service" />

    <!-- 配置事務管理器 -->
    <bean id="transactionManager"
          class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
        <!-- 注入數據庫鏈接池 -->
        <property name="dataSource" ref="dataSource" />
    </bean>

    <!-- 配置基於註解的聲明式事務 -->
    <tx:annotation-driven transaction-manager="transactionManager" />
</beans>
複製代碼

spring + springmvc 整合 創建 spring-web ,裏面內容比較少,只是掃描了 controller 用來保證前端控制器 DispatcherServlet 可以找到並進入相關方法中。 同時還配置了試圖解析器 ViewResolve, 這樣咱們跳轉視圖時直接寫 視圖名稱便可,不用寫相對地址路徑了。

<!-- 3.配置jsp 顯示ViewResolver -->
    <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
        <property name="viewClass" value="org.springframework.web.servlet.view.JstlView" />
        <property name="prefix" value="/jsp/" />
        <property name="suffix" value=".jsp" />
    </bean>

    <!-- 4.掃描web相關的 controller -->
    <context:component-scan base-package="ssm.controller" />
複製代碼

最後就是配置 web.xml。主要做用是 配置 前端控制器 DispatcherServlet 重點是攔截規則處理。這裏咱們是全部都攔截。其次是 剛纔咱們 書寫的 三個 spring-*.xml 文件在這裏配置啓動。

<!-- spring mvc servlet-->
  <servlet>
    <servlet-name>SpringMVC</servlet-name>
    <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
    <init-param>
      <param-name>contextConfigLocation</param-name>
      <param-value>classpath:/spring-*.xml</param-value>
    </init-param>
  </servlet>
  <servlet-mapping>
    <servlet-name>SpringMVC</servlet-name>
    <!-- 此處也能夠配置成 *.do *.action形式 -->
    <url-pattern>/</url-pattern>
  </servlet-mapping>
複製代碼

而後就是日誌和編碼,對於當前的測試沒啥做用,可是仍是配置好吧

<context-param>
    <param-name>log4jConfigLocation</param-name>
    <param-value>classpath:log4j.properties</param-value>
  </context-param>

  <!-- 編碼過濾器 -->
  <filter>
    <filter-name>encodingFilter</filter-name>
    <filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
    <init-param>
      <param-name>encoding</param-name>
      <param-value>UTF-8</param-value>
    </init-param>
  </filter>
  <filter-mapping>
    <filter-name>encodingFilter</filter-name>
    <url-pattern>/*</url-pattern>
  </filter-mapping>
複製代碼

好的 終於搞完了,如今能夠安心的寫代碼了。如今準備一個這樣的 jsp 文件。

這裏寫圖片描述

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
<%@ taglib uri="http://java.sun.com/jsp/jstl/fmt"  prefix="fmt"%>
<%@ page isELIgnored="false" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>查詢商品列表</title>
</head>
<body> 
<form action="${pageContext.request.contextPath}/items/queryitem.action" method="post">
查詢條件:
<table width="100%" border=1>
<tr>
<td><input type="submit" value="查詢"/></td>
</tr>
</table>
商品列表:
<table width="100%" border=1>
<tr>
	<td>商品名稱</td>
	<td>商品價格</td>
	<td>生產日期</td>
	<td>商品描述</td>
	<td>操做</td>
</tr>
<c:forEach items="${itemList }" var="item">
<tr>
	<td>${item.name }</td>
	<td>${item.price }</td>
	<td>${item.createtime}</td>
	<td>${item.detail }</td>
	<td><a href="${pageContext.request.contextPath }/itemEdit.action?id=${item.id}">修改</a></td>
</tr>
</c:forEach>
</table>
</form>
</body>

</html>
複製代碼

咱們須要查詢全部的 item 數據顯示在上面。

這裏寫圖片描述

首先寫 ItemsDao

import org.springframework.stereotype.Repository;
import ssm.entity.Items;

import java.util.List;

/**
 * Created by guozhaohui628@gmail.com on 2018/5/8
 * Description:
 */
@Repository
public interface ItemsDao {
    public List<Items> queryAllItemsList();
}
複製代碼

對應的 ImtesMapper.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="ssm.dao.ItemsDao">
    <!-- 目的:爲dao接口方法提供sql語句配置 -->
    <select id="queryAllItemsList" resultType="Items">
         SELECT
            *
        FROM
            items;
    </select>
</mapper>
複製代碼

書寫 ItemsService 接口和 其實現類

import ssm.entity.Items;

import java.util.List;

/**
 * Created by guozhaohui628@gmail.com on 2018/5/8
 * Description:
 */
public interface ItemsService {

    List<Items> queryAllItemsList();

}
複製代碼
package ssm.service;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import ssm.dao.ItemsDao;
import ssm.entity.Items;

import java.util.List;

/**
 * Created by guozhaohui628@gmail.com on 2018/5/8
 * Description:
 */
@Service
public class ItemsServiceImpl implements ItemsService {

    // 注入Service依賴
    @Autowired
    private ItemsDao itemsdao;

    @Override
    public List<Items> queryAllItemsList() {
        return itemsdao.queryAllItemsList();
    }
}
複製代碼

最後寫 ItemsController

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.servlet.ModelAndView;
import ssm.entity.Items;
import ssm.service.ItemsServiceImpl;

import java.util.List;


/**
 * Created by guozhaohui628@gmail.com on 2018/5/8
 * Description:
 */
@Controller
public class ItemsController {


    // 注入Service依賴
    @Autowired
    private ItemsServiceImpl itemsService;

    @RequestMapping(value = "items/queryitem.action")
    public ModelAndView itemsList(){
        ModelAndView mav = new ModelAndView();
        List<Items> itemsList = itemsService.queryAllItemsList();
        System.out.println(itemsList.toString());
        mav.addObject("itemList", itemsList);
        mav.setViewName("itemList");
        return mav;
    }
}
複製代碼

.jsp中的代碼已經寫好了,直接用就能夠了。 咱們要測試 要麼直接點擊這個地址,要麼點擊查詢

這裏寫圖片描述

這裏寫圖片描述

好的 大功告成,寫的比較細 因此比較長。但願能拿幫到你!

3 留步

整合框架期間報錯以下幾個錯誤。若是有一樣的狀況能夠參考一二
.JSP 中 EL 表達式不起做用 無效
Cause: java.lang.NoSuchMethodException 還有幾個錯誤,沒有記錄下來,好比 spring註解方式 idea報could not autowire 等等。
整合期間參考: 這裏寫連接內容

若是幫到你,歡迎Star支持。源碼地址 這裏寫連接內容

相關文章
相關標籤/搜索