IDEA結合Maven,SSM整合

這是基礎的SSM整合,使用IDEA+Maven,而且本次使用了逆向工程
整合步驟
1.創建空的web項目,添加pom依賴

2.需要的配置文件:
web.xml
springmvc.xml
applicationContext.xml
jdbc.properties
log4j.properties
逆向工程還需要generatorConfig.xml

在web.xml中配置Spring容器與SpringMVC核心控制器

3.整合MyBatis與Spring

添加pom依賴

<dependencies>
<!--    spring   + springwebmvc-->
    <dependency>
      <groupId>org.springframework</groupId>
      <artifactId>spring-webmvc</artifactId>
      <version>5.2.2.RELEASE</version>
    </dependency>

<!--    mybatis-->
    <dependency>
      <groupId>org.mybatis</groupId>
      <artifactId>mybatis-spring</artifactId>
      <version>2.0.3</version>
    </dependency>

    <dependency>
      <groupId>org.mybatis</groupId>
      <artifactId>mybatis</artifactId>
      <version>3.5.2</version>
    </dependency>

<!--    JDBC-->
    <dependency>
      <groupId>mysql</groupId>
      <artifactId>mysql-connector-java</artifactId>
      <version>5.1.44</version>
    </dependency>

    <dependency>
      <groupId>org.springframework</groupId>
      <artifactId>spring-jdbc</artifactId>
      <version>5.2.2.RELEASE</version>
    </dependency>

    <!--事務管理-->
    <dependency>
      <groupId>org.springframework</groupId>
      <artifactId>spring-tx</artifactId>
      <version>5.2.2.RELEASE</version>
    </dependency>


    <!--AspectJ-->
    <dependency>
      <groupId>org.aspectj</groupId>
      <artifactId>aspectjweaver</artifactId>
      <version>1.8.0</version>
    </dependency>


<!--    jstl   jsp  servlet-->
    <dependency>
      <groupId>javax.servlet</groupId>
      <artifactId>jstl</artifactId>
      <version>1.2</version>
    </dependency>

    <dependency>
      <groupId>javax.servlet.jsp</groupId>
      <artifactId>javax.servlet.jsp-api</artifactId>
      <version>2.3.3</version>
      <scope>provided</scope>
    </dependency>

    <dependency>
      <groupId>javax.servlet</groupId>
      <artifactId>javax.servlet-api</artifactId>
      <version>4.0.1</version>
      <scope>provided</scope>
    </dependency>
  </dependencies>
  <!--逆向工程-->
    <build>
        <plugins>
            <plugin>
                <groupId>org.mybatis.generator</groupId>
                <artifactId>mybatis-generator-maven-plugin</artifactId>
                <version>1.3.7</version>
                <configuration>
                    <!-- 是否覆蓋已存在的接口和POJO該配置不包括Mapper
                                  若爲False將會生成版本記錄-->
                    <overwrite>true</overwrite>
                </configuration>
            </plugin>
        </plugins>
    </build>

web.xml加載配置文件:

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"
         version="4.0">

    <!--Spring begin-->

    <!--配置spring容器  配置監聽器   在程序啓動時加載applicationContext.xml -->
    <context-param>
        <param-name>contextConfigLocation</param-name>
        <param-value>classpath:applicationContext.xml</param-value>
    </context-param>
    <listener>
        <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
    </listener>
    <!--Spring end-->

    <!--SpringMVC begin-->
    <servlet>
        <!--1.配置前端控制器-->
        <servlet-name>dispatcherServlet</servlet-name>
        <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
        <init-param>
            <!-- 默認找 /WEB-INF/[servlet的名稱]-servlet.xml -->
            <param-name>contextConfigLocation</param-name>
            <param-value>classpath:springmvc.xml</param-value>
        </init-param>
        <load-on-startup>0</load-on-startup>
    </servlet>
    <servlet-mapping>
        <servlet-name>dispatcherServlet</servlet-name>
        <url-pattern>*.action</url-pattern>
    </servlet-mapping>
    <!--前端控制器end-->

    <!--2.配置編碼過濾器,處理POST提交亂碼問題-->
    <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>
        <!--是否設置響應編碼-->
        <init-param>
            <param-name>forceResponseEncoding</param-name>
            <param-value>true</param-value>
        </init-param>
    </filter>
    <filter-mapping>
        <filter-name>encodingFilter</filter-name>
        <url-pattern>/*</url-pattern>
    </filter-mapping>

        <!--編碼過濾器end-->

    <!--SpringMVC end-->
</web-app>

jdbc.properties

jdbc.driver = com.mysql.jdbc.Driver
jdbc.url = jdbc:mysql:///student?characterEncoding=utf8&nullCatalogMeansCurrent=true
jdbc.user = root
jdbc.password = 123456
location = D:/maven/repository/mysql/mysql-connector-java/5.1.44/mysql-connector-java-5.1.44.jar


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 https://www.springframework.org/schema/context/spring-context.xsd">
    <!--開啓註解掃描-->
    <context:component-scan base-package="com.cx"/>
    <!--整合mybatis相關的  配置數據庫-->
    <context:property-placeholder location="classpath:jdbc.properties"/>

    <!--配置數據源-->
    <bean class="org.springframework.jdbc.datasource.DriverManagerDataSource" id="dataSource">
        <property name="driverClassName" value="${jdbc.driver}"/>
        <property name="url" value="${jdbc.url}"/>
        <property name="username" value="${jdbc.user}"/>
        <property name="password" value="${jdbc.password}"/>
    </bean>
    <!--產生SqlSessionFactory-->
    <bean class="org.mybatis.spring.SqlSessionFactoryBean">
        <property name="dataSource" ref="dataSource"/>
        <!--如果需要可以在這裏配置別名-->
        <!--<property name="typeAliases" value="對應包下的"/>-->
        <!--也可以自定義一個配置文件:SqlMapConfig.xml 進行引入核心配置別名什麼的-->
        <!--<property name="configLocation" value="SqlMapConfig.xml"/>-->
    </bean>
    <!--動態代理  掃描-->
    <bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
        <property name="basePackage" value="com.cx.dao"/>
    </bean>
</beans>

創建並配置springmvc.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:mvc="http://www.springframework.org/schema/mvc"
       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context https://www.springframework.org/schema/context/spring-context.xsd http://www.springframework.org/schema/mvc https://www.springframework.org/schema/mvc/spring-mvc.xsd">
    <!--開啓掃描包註解-->
    <context:component-scan base-package="com.cx"/>
    <!--註解驅動-->
    <mvc:annotation-driven/>
    <!--配置視圖解析器-->
    <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
        <property name="prefix" value="/jsp/"/>
        <property name="suffix" value=".jsp"/>
    </bean>
</beans>

逆向生成配置文件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="jdbc.properties"></properties>-->
    <properties resource="jdbc.properties"/>
    <!--指定特定數據庫的jdbc驅動jar包的位置-->
    <classPathEntry location="${location}"/>
    <context id="default" targetRuntime="MyBatis3">
        <!-- optional,旨在創建class時,對註釋進行控制 -->
        <commentGenerator>
            <property name="suppressDate" value="true"/>
            <property name="suppressAllComments" value="true"/>
        </commentGenerator>

        <!--jdbc的數據庫連接 -->
        <jdbcConnection
                driverClass="${jdbc.driver}" connectionURL="${jdbc.url}" userId="${jdbc.user}" password="${jdbc.password}">
        </jdbcConnection>

        <!-- 非必需,類型處理器,在數據庫類型和java類型之間的轉換控制-->
        <javaTypeResolver>
            <property name="forceBigDecimals" value="false"/>
        </javaTypeResolver>

        <!--Model模型生成器,用來生成含有主鍵key的類,記錄類 以及查詢Example類
        targetPackage 指定生成的model生成所在的包名
        targetProject 指定在該項目下所在的路徑 -->
        <javaModelGenerator targetPackage="com.cx.pojo" targetProject="src/main/java">
            <!-- 是否允許子包,即targetPackage.schemaName.tableName -->
            <property name="enableSubPackages" value="false"/>
            <!-- 是否對model添加 構造函數 -->
            <property name="constructorBased" value="true"/>
            <!-- 是否對類CHAR類型的列的數據進行trim操作 -->
            <property name="trimStrings" value="true"/>
            <!-- 建立的Model對象是否 不可改變 即生成的Model對象不會有 setter方法,只有構造方法 -->
            <property name="immutable" value="false"/>
        </javaModelGenerator>

        <!--mapper映射文件生成所在的目錄 爲每一個數據庫的表生成對應的SqlMap文件 -->
        <sqlMapGenerator targetPackage="com.cx.dao"
                         targetProject="src/main/resources">
            <property name="enableSubPackages" value="false"/>
        </sqlMapGenerator>

        <!--mapper接口文件生成所在的目錄 爲每一個數據庫的表生成對應的接口文件 -->
        <javaClientGenerator type="XMLMAPPER" targetPackage="com.cx.dao" targetProject="src/main/java">
            <!-- enableSubPackages:是否讓schema(數據庫名稱)作爲包的後綴 -->
            <property name="enableSubPackages" value="false"/>
        </javaClientGenerator>


        <!--指定需要生成的表-->
        <table  tableName="student"></table>
    </context>
</generatorConfiguration>


測試:

controller:

@Controller
public class StudentController {
    @Autowired
    private StudentService studentService;
    @RequestMapping("selectAllStu")
    public ModelAndView selectAllStu(){
        List<Student> students = studentService.selectAll();
        ModelAndView modelAndView = new ModelAndView();
        modelAndView.addObject("students",students);
        modelAndView.setViewName("studentList");
        return modelAndView;
    }
}

service:

public interface StudentService {
    List<Student> selectAll();
}

serviceImpl

@Service
public class StudentServiceImpl implements StudentService {
    @Autowired
    private StudentMapper studentMapper;
    @Override
    public List<Student> selectAll() {
        return studentMapper.selectByExample(null);
    }
}

studentList.jsp:

<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%--
  Created by IntelliJ IDEA.
  User: ycx
  Date: 2020/6/19
  Time: 18:30
  To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>Title</title>
</head>
<body>
<table border="1">
    <c:forEach items="${students}" var="student" varStatus="in">
        <tr>
            <th>${in.count}</th>
            <th>id</th>
            <th>username</th>
            <th>password</th>
        </tr>
        <tr>
            <td>${in.count}</td>
            <td>${student.id}</td>
            <td>${student.name}</td>
            <td>${student.pwd}</td>
        </tr>
    </c:forEach>
</table>
</body>
</html>

dao、pojo、mapper文件都是逆向工程產生的
運行結果:
在這裏插入圖片描述
到此SSM的整合基本上就完成了; (事務配置和其他配置均與Spring項目沒有區別)

事務AOP等配置與單獨的Spring沒有區別,但不過要注意現在有兩個Spring配置文件,別寫錯位置;

Spring和SpringMVC容器的關係

SpringMVC容器固然是一個擁有Spring所有功能的容器,但是爲了分離關注點,通常SpringMVC容器只處理與請求響應相關的內容,即Controller層;

Spring框架採用了父子容器的方式來實現分離關注點;實際上SpringMVC被作爲了Spring的子容器;如下所示:
在這裏插入圖片描述

  • 外層的Spring容器爲父容器
  • 裏面的SpringMVC爲子容器,要強調的是其他的框架並不是容器,只是容器中的一堆Bean;

職責分配:

  • Spring容器主要負責集成其他框架,配置AOP,事務
  • SpringMVC容器負責處理請求響應即Controller層

特點:

子容器可直接訪問父容器中的Bean,而父容器不能訪問子容器的Bean
子容器優先從自身裏查找Bean,找不到時纔會找父容器

容易出的問題:

  • 事務處理通常在父容器中配置。

因爲MyBatis相關Bean是由父容器管理的,假設已經在父容器爲Service層配置了事務,子容器沒有配置事務,但是子容器卻掃描了Service層,這時候事務就不生效了,因爲子容器中有ServiceBean,但是卻沒有事務;

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