IDEA搭建Spring + SrpingMVC + Mybatis(逆向工程)

寫在前面的話

  很久沒有接觸web了,重新開始寫(PS:對於SSM應該是第一次寫)遇到了一些問題,在這裏記錄下來整個SSM搭建的過程,留下些什麼值得以後去回憶。

一、環境描述

  • OS:macOS Mojave 版本 10.14.6
  • 編譯器:IntelliJ IDEA 2019.2.3 (Ultimate Edition)
  • Java版本:12
  • Maven版本:3.6.1
  • Tomcat版本:9.0.24
  • 數據庫及其版本:mysql-8.0.17

二、Spring和SpringMVC環境搭建

2.1 新建Maven項目

New->project

maven項目

注意:這裏如果選擇了Create from archetype,那麼新建的項目裏是沒有src目錄的,src目錄裏的東西都要自己手動建立。


下圖中的GroupId和ArtifactId可以簡單的理解爲該項目所屬的小組、項目名稱。

Groupid以及ArtifactId


此處的settings file和repository可以使用默認位置的,也可以使用自定義位置的,個人建議使用自定義位置的配置文件,如果這裏有其他疑問可以去Maven的相關教程。本文中我選擇了自己定義的配置文件位置。

在這裏插入圖片描述

  接下來一路next直到finish即可。

2.2 建立項目結構

  在接下來進行項目結構的建立之前,你看到的項目目錄應該和下圖差不多。如果不一樣,說明你需要手動新建這些文件夾,其中webapp要在file->project structure->facests中新建一個Web
項目結構
新建Web:
在這裏插入圖片描述


  首先在/src/main下建立java和resources文件。其中java文件的作用是放置服務端文件,resources是放置一些配置文件。
首先
  接下來要賦予java和resources上述的職責。在file->project structure中分別給java和resources選擇各自的“顏色”,結果如下:
在這裏插入圖片描述


  最後,在/src/main/java下建立相關的包,在/src/webapp/WEB-INF 下建立pages(放置jsp頁面用),最終的項目結構如下圖:
項目結構

2.3 搭建Spring框架

2.3.1 引入Maven依賴

  在未引入依賴之前,pom.xml內容如下:

<?xml version="1.0" encoding="UTF-8"?>

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
  <modelVersion>4.0.0</modelVersion>

  <groupId>com.web.ssm.yy</groupId>
  <artifactId>RegistrationSystem</artifactId>
  <version>1.0-SNAPSHOT</version>
  <packaging>war</packaging>

  <name>RegistrationSystem Maven Webapp</name>
  <!-- FIXME change it to the project's website -->
  <url>http://www.example.com</url>

  <properties>
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    <maven.compiler.source>1.7</maven.compiler.source>
    <maven.compiler.target>1.7</maven.compiler.target>
  </properties>

  <dependencies>
    <dependency>
      <groupId>junit</groupId>
      <artifactId>junit</artifactId>
      <version>4.11</version>
      <scope>test</scope>
    </dependency>
  </dependencies>

  <build>
    <finalName>RegistrationSystem</finalName>
    <pluginManagement><!-- lock down plugins versions to avoid using Maven defaults (may be moved to parent pom) -->
      <plugins>
        <plugin>
          <artifactId>maven-clean-plugin</artifactId>
          <version>3.1.0</version>
        </plugin>
        <!-- see http://maven.apache.org/ref/current/maven-core/default-bindings.html#Plugin_bindings_for_war_packaging -->
        <plugin>
          <artifactId>maven-resources-plugin</artifactId>
          <version>3.0.2</version>
        </plugin>
        <plugin>
          <artifactId>maven-compiler-plugin</artifactId>
          <version>3.8.0</version>
        </plugin>
        <plugin>
          <artifactId>maven-surefire-plugin</artifactId>
          <version>2.22.1</version>
        </plugin>
        <plugin>
          <artifactId>maven-war-plugin</artifactId>
          <version>3.2.2</version>
        </plugin>
        <plugin>
          <artifactId>maven-install-plugin</artifactId>
          <version>2.5.2</version>
        </plugin>
        <plugin>
          <artifactId>maven-deploy-plugin</artifactId>
          <version>2.8.2</version>
        </plugin>
      </plugins>
    </pluginManagement>
  </build>
</project>

現在添加了相關的依賴:

  <properties>
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    <maven.compiler.source>1.7</maven.compiler.source>
    <maven.compiler.target>1.7</maven.compiler.target>
    <spring.version>5.0.2.RELEASE</spring.version>
    <slf4j.version>1.6.6</slf4j.version>
    <log4j.version>1.2.12</log4j.version>
    <mysql.version>5.1.6</mysql.version>
    <mybatis.version>3.4.5</mybatis.version>
  </properties>

<dependencies>
      <dependency>
        <groupId>org.aspectj</groupId>
        <artifactId>aspectjweaver</artifactId>
        <version>1.6.8</version>
      </dependency>
      <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-aop</artifactId>
        <version>${spring.version}</version>
      </dependency>
      <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-context</artifactId>
        <version>${spring.version}</version>
      </dependency>
      <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-web</artifactId>
        <version>${spring.version}</version>
      </dependency>
      <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-webmvc</artifactId>
        <version>${spring.version}</version>
      </dependency>
      <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-test</artifactId>
        <version>${spring.version}</version>
      </dependency>
      <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-tx</artifactId>
        <version>${spring.version}</version>
      </dependency>
      <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-jdbc</artifactId>
        <version>${spring.version}</version>
      </dependency>
      <dependency>
        <groupId>junit</groupId>
        <artifactId>junit</artifactId>
        <version>4.12</version>
        <scope>compile</scope>
      </dependency>
      <dependency>
        <groupId>mysql</groupId>
        <artifactId>mysql-connector-java</artifactId>
        <version>${mysql.version}</version>
      </dependency>
      <dependency>
        <groupId>javax.servlet</groupId>
        <artifactId>servlet-api</artifactId>
        <version>2.5</version>
        <scope>provided</scope>
      </dependency>
      <dependency>
        <groupId>javax.servlet.jsp</groupId>
        <artifactId>jsp-api</artifactId>
        <version>2.0</version>
        <scope>provided</scope>
      </dependency>
      <dependency>
        <groupId>jstl</groupId>
        <artifactId>jstl</artifactId>
        <version>1.2</version>
      </dependency> <!-- log start -->
      <dependency>
        <groupId>log4j</groupId>
        <artifactId>log4j</artifactId>
        <version>${log4j.version}</version>
      </dependency>
      <dependency>
        <groupId>org.slf4j</groupId>
        <artifactId>slf4j-api</artifactId>
        <version>${slf4j.version}</version>
      </dependency>
      <dependency>
        <groupId>org.slf4j</groupId>
        <artifactId>slf4j-log4j12</artifactId>
        <version>${slf4j.version}</version>
      </dependency> <!-- log end -->
      <dependency>
        <groupId>org.mybatis</groupId>
        <artifactId>mybatis</artifactId>
        <version>${mybatis.version}</version>
      </dependency>
      <dependency>
        <groupId>org.mybatis</groupId>
        <artifactId>mybatis-spring</artifactId>
        <version>1.3.0</version>
      </dependency>
      <dependency>
        <groupId>c3p0</groupId>
        <artifactId>c3p0</artifactId>
        <version>0.9.1.2</version>
        <type>jar</type>
        <scope>compile</scope>
      </dependency>
    </dependencies>

注意在這裏加入依賴,加入後可能會飄紅,只需要點擊右下角的Import Changes或在側邊欄刷新一下Maven即可自動導入依賴。

解決方法一:
在這裏插入圖片描述

解決方法二:
在這裏插入圖片描述
引入依賴之後就不會變成紅色了:
在這裏插入圖片描述

2.3.2 添加Spring框架

  首先添加Spring的applicationContext.xml,位於/src/resources下:
在這裏插入圖片描述

接下來文件內部就會提示你,並沒有配置相關的上下文,所以按照提示一步一步去配置即可:
在這裏插入圖片描述

選擇剛纔建立的xml文件
在這裏插入圖片描述

2.3.3 編寫測試類,測試Spring

test類:
在這裏插入圖片描述
Test.java:

package com.yy.test;

import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

public class Test{

    @org.junit.Test
    public void TestSpring(){
        ApplicationContext applicationContext = new ClassPathXmlApplicationContext("classpath:applicationContext.xml");
        System.out.println(applicationContext.hashCode());
    }
}

點擊左側的小三角+圓形即可運行:
在這裏插入圖片描述
結果:
在這裏插入圖片描述

輸出了ApplicationContext對象的哈希值,如果想要測試注入的話,可以添加以下代碼,再次運行testSpring方法即可


以下內容爲測試Spring注入是否成功

  首先在service包下建立如下接口
在這裏插入圖片描述

UserService.java:

package com.yy.service;

import java.util.List;

public interface UserService {
    public List<Object> findAllUsers();
}

UserServiceImpl.java:

package com.yy.service.Impl;

import com.yy.service.UserService;
import org.springframework.stereotype.Service;

import java.util.List;

@Service
public class UserServiceImpl implements UserService {
    @Override
    public List<Object> findAllUsers() {
        System.out.println("service層實現被調用");
        return null;
    }
}

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"
       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">
    <!--開啓註解的掃描,希望處理service和dao,controller不需要Spring框架去處理-->
    <context:component-scan base-package="com.yy" >
        <!--配置哪些註解不掃描-->
        <context:exclude-filter type="annotation" expression="org.springframework.stereotype.Controller" />
    </context:component-scan>
</beans>

Test.java內修改爲:

package com.yy.test;

import com.yy.service.Impl.UserServiceImpl;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

public class Test{

    @org.junit.Test
    public void TestSpring(){
        ApplicationContext applicationContext = new ClassPathXmlApplicationContext("classpath:applicationContext.xml");
        UserServiceImpl userService = (UserServiceImpl) applicationContext.getBean("userServiceImpl");
        userService.findAllUsers();
    }
}

執行TestSpring()方法之後可以看到:
在這裏插入圖片描述
就此,說明我們的Spring框架已經成功添加。

2.4. 搭建SpringMVC

2.4.1 添加SpringMVC框架及整合Spring和SpringMVC

  首先,在/src/main/resources下添加Spring MVC框架的配置文件SpringMVC.xml,並添加如下內容:
SpringMVC.xml:

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:mvc="http://www.springframework.org/schema/mvc"
       xmlns:context="http://www.springframework.org/schema/context"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xsi:schemaLocation="
        http://www.springframework.org/schema/beans
        http://www.springframework.org/schema/beans/spring-beans.xsd
        http://www.springframework.org/schema/mvc
        http://www.springframework.org/schema/mvc/spring-mvc.xsd
        http://www.springframework.org/schema/context
        http://www.springframework.org/schema/context/spring-context.xsd">
    <!--開啓註解掃描,只掃描Controller註解-->
    <context:component-scan base-package="com.yy">
        <context:include-filter type="annotation" expression="org.springframework.stereotype.Controller"/>
    </context:component-scan>

    <!--配置的視圖解析器對象-->
    <bean id="internalResourceViewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver">
        <property name="prefix" value="/WEB-INF/pages/"/>
        <property name="suffix" value=".jsp"/>
    </bean>
    <!--過濾靜態資源,如果爆紅是因爲resources資源下還沒有這些靜態資源,我先註釋了-->
    <!-- <mvc:resources location="/css" mapping="/css/**"/>
     <mvc:resources location="/images/" mapping="/images/**"/>
     <mvc:resources location="/js/" mapping="/js/**"/>-->

    <!--開啓SpringMVC註解的支持-->
    <mvc:annotation-driven/>
</beans>

/src/main/resources/內容:
在這裏插入圖片描述
  接下來,在/src/main/webapp/WEB-INF/web.xml中添加SpringMVC相關的配置。
web.xml:

<!DOCTYPE web-app PUBLIC
        "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"
        "http://java.sun.com/dtd/web-app_2_3.dtd" >

<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_3_0.xsd"
         version="3.0">
  <display-name>Archetype Created Web Application</display-name>
  <!--配置Spring的監聽器,默認只加載WEB-INF目錄下的applicationContext.xml配置文件-->
  <listener>
    <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
  </listener>
  <!--設置配置文件的路徑-->
  <context-param>
    <param-name>contextConfigLocation</param-name>
    <param-value>classpath:applicationContext.xml</param-value>
  </context-param>
  <!--配置前端控制器-->
  <servlet>
    <servlet-name>dispatcherServlet</servlet-name>
    <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
    <!--加載springmvc.xml配置文件-->
    <init-param>
      <param-name>contextConfigLocation</param-name>
      <param-value>classpath:SpringMVC.xml</param-value>
    </init-param>
    <!--啓動服務器,創建該servlet-->
    <load-on-startup>1</load-on-startup>
  </servlet>
  <servlet-mapping>
    <servlet-name>dispatcherServlet</servlet-name>
    <url-pattern>/</url-pattern>
  </servlet-mapping>

  <!--解決中文亂碼的過濾器-->
  <filter>
    <filter-name>characterEncodingFilter</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>characterEncodingFilter</filter-name>
    <url-pattern>/*</url-pattern>
  </filter-mapping>
</web-app>

2.4.2 編寫相關代碼,測試SpringMVC

  在/src/webapp/WEB-INF/pages下建立list.jsp頁面
list.jsp:

<%--
  Created by IntelliJ IDEA.
  User: yangyang
  Date: 2019/10/10
  Time: 14:16
  To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>List頁面</title>
</head>
<body>
<h1>${tag}</h1>
</body>
</html>

  在controller包下添加PublicController.java類
PublicController.java:

package com.yy.controller;

import com.yy.service.UserService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;

import java.util.List;

@Controller
public class PublicController {

    @Autowired
    private UserService userService;

    @RequestMapping("/public/findAllUsers")
    public String findAllUsers(Model model){
        System.out.println("controller層被調用");
        // 因爲還未配置Mybatis,所以這裏只是模擬查詢查詢操作,沒有結果也不要擔心~
        List<Object>objectList = userService.findAllUsers();
        model.addAttribute("tag", "成功!");
        return "list";
    }
}

  接下來部署到Tomcat上,新建一個Tomcat Server:

在這裏插入圖片描述
在這裏插入圖片描述
點擊ok之後,會看到下邊有一個Warning: No artifacts marked for deployment,點擊Fix,選擇war exploed,然後將Application context一欄設置爲"/"
在這裏插入圖片描述
在這裏插入圖片描述

在這裏解釋一下war和war exploded的區別:

  • war : Web application ARchive,一種JAR文件,其中包含用來分發的JSP、Java Servlet、Java類、XML文件、標籤庫、靜態網頁(HTML和相關文件),以及構成Web應用程序的其他資源;
  • war exploded : 在這裏可以理解爲展開,不壓縮的意思。也就是war、jar等產出物沒壓縮前的目錄結構。建議在開發的時候使用這種模式,便於修改了文件的效果立刻顯現出來。

  最後點擊右上角的綠色啓動按鈕即可得到如下的界面:
在這裏插入圖片描述
  訪問:localhost:8080/public/findAllUsers,如果瀏覽器出現如下界面,則說明SpringMVC添加成功!
在這裏插入圖片描述
  同樣,查看idea的log窗口,可以看到:
在這裏插入圖片描述

2.5. 整合Spring、SpringMVC小結

2.5.1 理解“整合Spring、Spring MVC”

  在添加SpringMVC過程中,我們已經將Spring和SpringMVC給整合到了一起,在這裏簡單總結一下,什麼時候整合的,什麼樣子才叫整合成功。

  首先要理解哪部分是Spring,哪部分是SpringMVC。SpringMVC簡單的按照字面意思來理解就是Spring M(Model)V(View)C(Controller),而Spring主要用到的就是注入。
  也就是說,Spring和SpringMVC整合好的結果就是:成功的在SpringMVC中調用Spring的注入;換句話說,就是在controller(SpringMVC)中調用注入的service實現的對象(Spring)
  既然講清楚了,那麼就可以非常迅速的定位到代碼部分了。在PublicController.java中成功的注入了UserService對象,同時成功使用UserService對象的findAllUsers()方法。

PS:因爲尚未配置Mybatis,在此處執行userService.findAllUsers()時並沒有報出空指針異常的錯誤,所以我們認爲已經整合成功!

PublicController.java:

@Controller
public class PublicController {

    @Autowired
    private UserService userService;

    @RequestMapping("/public/findAllUsers")
    public String findAllUsers(Model model){
        System.out.println("controller層被調用");
        // 因爲還未配置Mybatis,所以這裏只是模擬查詢查詢操作,沒有結果也不要擔心~
        List<Object>objectList = userService.findAllUsers();
        model.addAttribute("tag", "成功!");
        return "list";
    }
}
2.5.2 如何整合Spring、SpringMVC

  可以看到web.xml中下邊這部分的代碼,註釋中寫了,他是默認加載WEB-INF下的applicationContext.xml文件,但是因爲我們有較多的配置文件(包括後來的Mybatis配置的文件),於是我們新建了/src/main/resoiurces這個文件,來存放我們的配置文件。因此在設置listener時候,需要設置配置文件的路徑。
  而這個監聽器的作用就是在服務器啓動的時候,去加載Spring的配置文件。加載了applicationContext.xml之後,就可以成功的使用Spring了。
web.xml:

  <!--配置Spring的監聽器,默認只加載WEB-INF目錄下的applicationContext.xml配置文件-->
  <listener>
    <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
  </listener>
  <!--設置配置文件的路徑-->
  <context-param>
    <param-name>contextConfigLocation</param-name>
    <param-value>classpath:applicationContext.xml</param-value>
  </context-param>

  至此,Spring和Spring MVC基礎部分就已經配置完成了。

三、Mybatis框架

搭建之前的話

  使用Mybatis的方法主要有兩種,第一種是開發者自己寫sql語句,第二種是Mybatis官方提供的逆向工程,也就是Mybatis Generator,MBG(Mybatis Generator)是專門爲MyBatis框架使用者定製的代碼生成器,可以快速的根據表生成對應的映射文件、接口、以及實體類。支持基本的增刪改查,以及QBC風格的條件查詢。
  但是金無足赤,人無完人,MGB也存在自己的缺點(個人借鑑),即:表連接、 存儲過程等這些複雜sql的定義需要我們手工編寫。同時,逆向工程方法只能執行一次, 如果再次執行就會繼續映射文件, 除非我們把之前生成的全都刪除。

搭建之前的代碼

  搭建Mybatis工作之前,我們需要建立一個屬於這個項目的數據庫以及一張用戶表。

/*刪掉存在的表*/
DROP TABLE IF EXISTS `users`;
/*建表*/
CREATE TABLE `users` (
  `id` int(32) NOT NULL AUTO_INCREMENT,
  `USERNAME` varchar(128) DEFAULT NULL,
  `PASSWORD` varchar(128) DEFAULT NULL,
  `TYPE` varchar(128) DEFAULT NULL,
  `AK` varchar(128) DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=9 DEFAULT CHARSET=utf8;
/*插入數據*/
INSERT INTO `USERS` VALUES (1, 'test', '123456', '2', NULL);

3.1 準備工作

3.1.1 在idea中安裝插件

  因爲使用的是逆向工程,我們需要idea中的一個插件來支援。Preferences->Plugins中的Marketplace中搜索Free Mybatis plugin,安裝好之後應該會重啓idea,注意做好代碼保存工作。
在這裏插入圖片描述

3.1.2 引入Maven依賴

  在pom.xml中添加依賴,注意代碼中的註釋,這個插件必須和pluginManagement同級
pom.xml:

<?xml version="1.0" encoding="UTF-8"?>

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
  <modelVersion>4.0.0</modelVersion>

  <groupId>com.web.ssm.yy</groupId>
  <artifactId>RegistrationSystem</artifactId>
  <version>1.0-SNAPSHOT</version>
  <packaging>war</packaging>

  <name>RegistrationSystem Maven Webapp</name>
  <!-- FIXME change it to the project's website -->
  <url>http://www.example.com</url>

  <properties>
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    <maven.compiler.source>1.7</maven.compiler.source>
    <maven.compiler.target>1.7</maven.compiler.target>
    <spring.version>5.0.2.RELEASE</spring.version>
    <slf4j.version>1.6.6</slf4j.version>
    <log4j.version>1.2.12</log4j.version>
    <mysql.version>5.1.6</mysql.version>
    <mybatis.version>3.4.5</mybatis.version>
  </properties>

  <dependencies>
    <dependency>
      <groupId>junit</groupId>
      <artifactId>junit</artifactId>
      <version>4.11</version>
      <scope>test</scope>
    </dependency>
    <dependency>
      <groupId>org.aspectj</groupId>
      <artifactId>aspectjweaver</artifactId>
      <version>1.6.8</version>
    </dependency>
    <dependency>
      <groupId>org.springframework</groupId>
      <artifactId>spring-aop</artifactId>
      <version>${spring.version}</version>
    </dependency>
    <dependency>
      <groupId>org.springframework</groupId>
      <artifactId>spring-context</artifactId>
      <version>${spring.version}</version>
    </dependency>
    <dependency>
      <groupId>org.springframework</groupId>
      <artifactId>spring-web</artifactId>
      <version>${spring.version}</version>
    </dependency>
    <dependency>
      <groupId>org.springframework</groupId>
      <artifactId>spring-webmvc</artifactId>
      <version>${spring.version}</version>
    </dependency>
    <dependency>
      <groupId>org.springframework</groupId>
      <artifactId>spring-test</artifactId>
      <version>${spring.version}</version>
    </dependency>
    <dependency>
      <groupId>org.springframework</groupId>
      <artifactId>spring-tx</artifactId>
      <version>${spring.version}</version>
    </dependency>
    <dependency>
      <groupId>org.springframework</groupId>
      <artifactId>spring-jdbc</artifactId>
      <version>${spring.version}</version>
    </dependency>
    <dependency>
      <groupId>junit</groupId>
      <artifactId>junit</artifactId>
      <version>4.12</version>
      <scope>compile</scope>
    </dependency>
    <dependency>
      <groupId>mysql</groupId>
      <artifactId>mysql-connector-java</artifactId>
      <version>${mysql.version}</version>
    </dependency>
    <dependency>
      <groupId>javax.servlet</groupId>
      <artifactId>servlet-api</artifactId>
      <version>2.5</version>
      <scope>provided</scope>
    </dependency>
    <dependency>
      <groupId>javax.servlet.jsp</groupId>
      <artifactId>jsp-api</artifactId>
      <version>2.0</version>
      <scope>provided</scope>
    </dependency>
    <dependency>
      <groupId>jstl</groupId>
      <artifactId>jstl</artifactId>
      <version>1.2</version>
    </dependency> <!-- log start -->
    <dependency>
      <groupId>log4j</groupId>
      <artifactId>log4j</artifactId>
      <version>${log4j.version}</version>
    </dependency>
    <dependency>
      <groupId>org.slf4j</groupId>
      <artifactId>slf4j-api</artifactId>
      <version>${slf4j.version}</version>
    </dependency>
    <dependency>
      <groupId>org.slf4j</groupId>
      <artifactId>slf4j-log4j12</artifactId>
      <version>${slf4j.version}</version>
    </dependency> <!-- log end -->
    <dependency>
      <groupId>org.mybatis</groupId>
      <artifactId>mybatis</artifactId>
      <version>${mybatis.version}</version>
    </dependency>
    <dependency>
      <groupId>org.mybatis</groupId>
      <artifactId>mybatis-spring</artifactId>
      <version>1.3.0</version>
    </dependency>
    <dependency>
      <groupId>c3p0</groupId>
      <artifactId>c3p0</artifactId>
      <version>0.9.1.2</version>
      <type>jar</type>
      <scope>compile</scope>
    </dependency>
  </dependencies>

  <build>
    <finalName>RegistrationSystem</finalName>
    <pluginManagement><!-- lock down plugins versions to avoid using Maven defaults (may be moved to parent pom) -->
      <plugins>
        <plugin>
          <artifactId>maven-clean-plugin</artifactId>
          <version>3.1.0</version>
        </plugin>
        <!-- see http://maven.apache.org/ref/current/maven-core/default-bindings.html#Plugin_bindings_for_war_packaging -->
        <plugin>
          <artifactId>maven-resources-plugin</artifactId>
          <version>3.0.2</version>
        </plugin>
        <plugin>
          <artifactId>maven-compiler-plugin</artifactId>
          <version>3.8.0</version>
        </plugin>
        <plugin>
          <artifactId>maven-surefire-plugin</artifactId>
          <version>2.22.1</version>
        </plugin>
        <plugin>
          <artifactId>maven-war-plugin</artifactId>
          <version>3.2.2</version>
        </plugin>
        <plugin>
          <artifactId>maven-install-plugin</artifactId>
          <version>2.5.2</version>
        </plugin>
        <plugin>
          <artifactId>maven-deploy-plugin</artifactId>
          <version>2.8.2</version>
        </plugin>
      </plugins>
    </pluginManagement>
    <!--    自動生成xml的插件,必須和pluginManagement同級-->
    <plugins>
      <plugin>
        <groupId>org.mybatis.generator</groupId>
        <artifactId>mybatis-generator-maven-plugin</artifactId>
        <version>1.3.2</version>
      </plugin>
    </plugins>
  </build>
</project>

3.2 配置generatorConfig.xml

  在/src/main/resources下新建generatorConfig.xml。這個文件是爲了定義數據源、實體類、Mapper和SQL生成規則。
在這裏插入圖片描述
generatorConfig.xml:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE generatorConfiguration PUBLIC "-//mybatis.org//DTD MyBatis Generator Configuration 1.0//EN"
        "http://mybatis.org/dtd/mybatis-generator-config_1_0.dtd">

<generatorConfiguration>

    <properties resource="generator.properties"/>

    <classPathEntry location="/Users/yangyang/IdeaProjects/Twossm/lib/mysql-connector-java-5.1.48-bin.jar" />

    <context id="contex1">
        <commentGenerator>
            <property name="suppressAllComments" value="true" /><!-- 是否取消註釋 -->
            <property name="suppressDate" value="true" /> <!-- 是否生成註釋代時間戳 -->
        </commentGenerator>

        <jdbcConnection driverClass="${jdbc.driver}" connectionURL="${jdbc.url}" userId="${jdbc.username}" password="${jdbc.password}" />

        <javaTypeResolver>
            <!-- 是否使用bigDecimal, false可自動轉化以下類型(Long, Integer, Short, etc.) -->
            <property name="forceBigDecimals" value="false" />
        </javaTypeResolver>

        <javaModelGenerator targetPackage="${modelPackage}" targetProject="${modelProject}" />
        <sqlMapGenerator targetPackage="${sqlPackage}" targetProject="${sqlProject}" />
        <javaClientGenerator targetPackage="${mapperPackage}" targetProject="${mapperProject}" type="XMLMAPPER"/>

        <table schema="" tableName="${table}" enableCountByExample="false" enableUpdateByExample="false" enableDeleteByExample="false" enableSelectByExample="false" selectByExampleQueryId="false"/>
    </context>
</generatorConfiguration>

  在/src/main/resources 下新建generator.properties。這個文件是爲了存儲generatorConfig.xml中的配置信息。注意修改generator.properties中的數據庫用戶名和密碼。

在這裏插入圖片描述
generator.properties:

jdbc.driver=com.mysql.jdbc.Driver
jdbc.url=jdbc:mysql://localhost:3306/ssm?useUnicode=true&characterEncoding=utf-8
jdbc.username=root
jdbc.password=root

# domain
modelPackage = com.yy.model
modelProject = src/main/java

sqlPackage = sqlmap
sqlProject = src/main/resources

mapperPackage = com.yy.mapper
mapperProject = src/main/java

table = users

3.3 執行generatorConfig.xml

在右上角的edit configurations
在這裏插入圖片描述
點擊加號,選擇添加maven
在這裏插入圖片描述
在commond line中輸入:mybatis-generator:generate -e,點擊apply之後,運行這個xml文件。
在這裏插入圖片描述

log文件裏輸出如下則表示生成成功:
在這裏插入圖片描述
在執行xml之後,項目結構如下圖所示,多了sqlmap、UserMapper和Users,sqlmap裏是對應的映射文件,mapper是接口文件,Users是實體類,這三者都是自動生成的。
在這裏插入圖片描述

3.4 Spring整合Mybatis

  能看到這裏的同學,也是有大毅力者。不錯,距離“成功”只有一步之遙了,加油。

  如本小節題,Spring整合Mybatis,那麼和Spring整合SpringMVC一樣,如果Mybatis的Mapper對象能夠成功注入,則說明整合成功了。

3.4.1 配置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"
       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">
    <!--開啓註解的掃描,希望處理service和dao,controller不需要Spring框架去處理-->
    <context:component-scan base-package="com.yy" >
        <!--配置哪些註解不掃描-->
        <context:exclude-filter type="annotation" expression="org.springframework.stereotype.Controller" />
    </context:component-scan>
    <!--Spring整合MyBatis框架-->
    <!--配置連接池-->
    <bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
        <property name="driverClassName" value="com.mysql.jdbc.Driver"/>
        <property name="url" value="jdbc:mysql://localhost:3306/ssm?useUnicode=true&amp;characterEncoding=utf8"/>
        <property name="username" value="root"/>
        <property name="password" value="root"/>
    </bean>

    <bean id="sqlSession" class="org.mybatis.spring.SqlSessionFactoryBean">
        <property name="typeAliasesPackage" value="com.yy.model" />
        <property name="dataSource" ref="dataSource"/>
        <property name="mapperLocations" value="classpath:sqlmap/*.xml"/>
    </bean>

    <bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
        <property name="basePackage" value="com.yy.mapper"/>
    </bean>
</beans>
3.4.2 測試Mybatis

  首先在UserService裏添加findUserById(Integer id)方法
UserService.java:

package com.yy.service;

import com.yy.model.Users;

import java.util.List;

public interface UserService {
    public List<Object> findAllUsers();
    public Users findUserById(Integer id);
}

  然後在實現類中實現相關的方法,同時在該類中添加UserMapper的對象
UserServiceImpl.java:

package com.yy.service.Impl;

import com.yy.mapper.UsersMapper;
import com.yy.model.Users;
import com.yy.service.UserService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.util.List;

@Service
public class UserServiceImpl implements UserService {
    @Autowired
    private UsersMapper usersMapper;

    @Override
    public List<Object> findAllUsers() {
        System.out.println("service層實現被調用");
        Users users = usersMapper.selectByPrimaryKey(1);
        System.out.println(users.getUsername());
        return null;
    }

    @Override
    public Users findUserById(Integer id) {
        System.out.println("service層findUserById被調用");
        Users users = usersMapper.selectByPrimaryKey(id);
        return users;
    }
}

  接着在Controller中添加相關的代碼。
PublicController.java:

package com.yy.controller;

import com.yy.model.Users;
import com.yy.service.UserService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;

import java.util.List;

@Controller
public class PublicController {

    @Autowired
    private UserService userService;

    @RequestMapping("/public/findAllUsers")
    public String findAllUsers(Model model){
        System.out.println("controller層被調用");
        // 因爲還未配置Mybatis,所以這裏只是模擬查詢查詢操作,沒有結果也不要擔心~
        List<Object>usersList = userService.findAllUsers();
        model.addAttribute("tag", "成功!");
        return "list";
    }

    @RequestMapping("/public/findUserById")
    public String findUserById(Model model){
        System.out.println("controller層findUserById被調用");
        Users users = userService.findUserById(1);
        model.addAttribute("username", users.getUsername());
        return "user_info";
    }

}

  最後在pages下添加顯示界面。
user_info.jsp:

<%--
  Created by IntelliJ IDEA.
  User: yangyang
  Date: 2019/10/10
  Time: 18:17
  To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>User Info</title>
</head>
<body>
<h1>用戶名:${username}</h1>
</body>
</html>

  點擊運行之後訪問localhost:8080/public/findUserById,如果界面顯示如下圖,則說明成功。
在這裏插入圖片描述

寫在後面的話

  至此,我們的SSM框架搭建完成,接下來就是要開心的完成業務邏輯部分了,這也就是大家自己的工作了。
  現在網上有各種關於CSDN的言論,無論是吹捧還是貶低,內容都離不開博客這個東西。雖然SSM的教程網上比比皆是,但是我覺得自己寫一次,無論是編譯器版本還是框架的版本都是在一直更新迭代的,那麼教程也不能固步自封,只保留在不流行的編譯器和古老的版本之中。
  另外,我認爲,如果自己一步一步寫一篇博客,這樣會有很清晰的思路,同時也會給自己留下很深刻的印象,也算是一種紀念吧。
  這篇博客大體框架是按照之前看過的一篇SSM的教程走下來的,但是與之不同的是我在這裏用了Mybatis Generator,所以這也是另一個我覺得需要記錄下來的原因。
  最後,關於開源的事情,我是一個忠實的開源粉絲,所以此次項目的源碼我會上傳到百度網盤,歡迎大家下載學習。還有什麼問題咱們評論區見~

鏈接:https://pan.baidu.com/s/1gg7F9chx6BNA_p1M2h0MiA
密碼:zvyd

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章