ssm框架——springMVC+spring+mybatis整合流程

概述:

  ssm框架在項目中常常使用到,應用比較普遍,下面將介紹如何在idea中搭建ssm框架,以及搭建過程當中遇到的坑和爬坑的過程~項目的搭建主要思想是:採用分層的想法,對web層,service層,dao層;分別建立一個sping配置文件來管理;html

  web層對應的是spring-web.xml;主要配置一些相似:處理器映射器,處理器適配器,視圖解析器....解決訪問靜態資源的問題;前端

  service層對應的是spring-service.xml;主要是開啓註解掃描,管理service層的bean對象便可
java

  dao層對應的是spring-dao.xml;須要處理的是整合mybatis框架,遵循一個原則:若是spring和mybatis都能處理的事情,讓spring來處理,主要負責:掃描和管理dao層的bean對象,配置數據庫,數據庫鏈接池,配置SqlSessionFactory對象,配置事務管理器,以及配置掃描接口包對象……其中SqlsessionFactory對象和掃描接口包對象是主要用來配置mapper映射文件分離的。mysql

  固然還有一些相似db.properties,日誌配置文件等等之類的~web

步驟:

  0.項目的總結構spring

 

  1.導入maven依賴sql

    使用到的技術:springMVC /spring /mybatis/ gson /c3po /mysql鏈接java /spring鏈接mybatis /以及一些依賴包common-logging log4j...數據庫

    (spring鏈接springMVC的時候並不須要導入相似spring鏈接mybatis這樣的依賴包,可是要注意如何在web.xml中加載多個spring配置文件,由於是分層,每一層都有本身的spring配置文件)express

  項目pom.xml文件apache

<?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/maven-v4_0_0.xsd">

    <modelVersion>4.0.0</modelVersion>
    <packaging>war</packaging>

    <name>MybatisLearn</name>
    <groupId>com.kylin</groupId>
    <artifactId>MybatisLearn</artifactId>
    <version>1.0-SNAPSHOT</version>

    <build>
        <plugins>
            <plugin>
                <groupId>org.mortbay.jetty</groupId>
                <artifactId>maven-jetty-plugin</artifactId>
                <version>6.1.7</version>
                <configuration>
                    <connectors>
                        <connector implementation="org.mortbay.jetty.nio.SelectChannelConnector">
                            <port>8888</port>
                            <maxIdleTime>30000</maxIdleTime>
                        </connector>
                    </connectors>
                    <webAppSourceDirectory>${project.build.directory}/${pom.artifactId}-${pom.version}
                    </webAppSourceDirectory>
                    <contextPath>/</contextPath>
                </configuration>
            </plugin>
        </plugins>
    </build>

    <dependencies>
        <!-- junit -->
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>4.12-beta-3</version>
            <scope>test</scope>
        </dependency>

        <!-- log4j日誌部分 -->
        <dependency>
            <groupId>log4j</groupId>
            <artifactId>log4j</artifactId>
            <version>1.2.17</version>
        </dependency>

        <dependency>
            <groupId>jstl</groupId>
            <artifactId>jstl</artifactId>
            <version>1.2</version>
        </dependency>

        <!-- spring和springMVC 的基本依賴 開始 -->
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-core</artifactId>
            <version>4.3.18.RELEASE</version>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-expression</artifactId>
            <version>4.3.18.RELEASE</version>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-beans</artifactId>
            <version>4.3.18.RELEASE</version>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-aop</artifactId>
            <version>4.3.18.RELEASE</version>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-context</artifactId>
            <version>4.3.18.RELEASE</version>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-context-support</artifactId>
            <version>4.3.18.RELEASE</version>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-tx</artifactId>
            <version>4.3.18.RELEASE</version>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-web</artifactId>
            <version>4.3.18.RELEASE</version>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-jdbc</artifactId>
            <version>4.3.18.RELEASE</version>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-webmvc</artifactId>
            <version>4.3.18.RELEASE</version>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-aspects</artifactId>
            <version>4.3.18.RELEASE</version>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-tx</artifactId>
            <version>4.3.18.RELEASE</version>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-test</artifactId>
            <version>4.3.18.RELEASE</version>
        </dependency>
        <!-- spring 的基本依賴 結束 -->

        <!-- 添加mybatis依賴 -->
        <!-- https://mvnrepository.com/artifact/org.mybatis/mybatis -->
        <dependency>
            <groupId>org.mybatis</groupId>
            <artifactId>mybatis</artifactId>
            <version>3.4.1</version>
        </dependency>
        <!--spring鏈接mybats-->
        <dependency>
            <groupId>org.mybatis</groupId>
            <artifactId>mybatis-spring</artifactId>
            <version>1.3.1</version>
        </dependency>


        <!--servlet和jsp的依賴-->
        <dependency>
            <groupId>javax.servlet.jsp</groupId>
            <artifactId>javax.servlet.jsp-api</artifactId>
            <version>2.2.1</version>
            <scope>provided</scope>
        </dependency>
        <dependency>
            <groupId>javax.servlet</groupId>
            <artifactId>javax.servlet-api</artifactId>
            <version>3.1.0</version>
            <scope>provided</scope>
        </dependency>

        <!--gson處理json數據-->
        <dependency>
            <groupId>com.google.code.gson</groupId>
            <artifactId>gson</artifactId>
            <version>2.2.4</version>
        </dependency>

        <!-- mysql 驅動 -->
        <dependency>
            <groupId>Mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>5.1.30</version>
        </dependency>

        <!--c3p0鏈接池-->
        <dependency>
            <groupId>com.mchange</groupId>
            <artifactId>c3p0</artifactId>
            <version>0.9.5.2</version>
        </dependency>


        <!-- 須要的log4j2日誌包依賴 -->
        <dependency>
            <groupId>org.apache.logging.log4j</groupId>
            <artifactId>log4j-core</artifactId>
            <version>2.5</version>
        </dependency>
        <dependency>
            <groupId>org.apache.logging.log4j</groupId>
            <artifactId>log4j-web</artifactId>
            <version>2.5</version>
        </dependency>
        <dependency>
            <groupId>org.apache.logging.log4j</groupId>
            <artifactId>log4j-1.2-api</artifactId>
            <version>2.5</version>
        </dependency>

        <!--文件上傳-->
        <dependency>
            <groupId>commons-io</groupId>
            <artifactId>commons-io</artifactId>
            <version>2.4</version>
        </dependency>

        <dependency>
            <groupId>commons-logging</groupId>
            <artifactId>commons-logging</artifactId>
            <version>1.1.1</version>
        </dependency>

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

    </dependencies>

</project>

   注意:這裏mybatis的版本要和spring-mybatis的版本要匹配,不然會有異常-----org.mybatis.spring.transaction.SpringManagedTransaction.getTimeout()

匹配的版本有以下:

  3.3.1版本的mybatis和1.1.1的spring-mybatis匹配,

  3.4.1版本的mybatis和1.3.1的spring-mybatis匹配

  2.在resources目錄下建立一個spring目錄,分別編寫spring-web.xml,spring-service.xml和spring-dao.xml

    2.1spring-web.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
    http://www.springframework.org/schema/context/spring-context.xsd
    http://www.springframework.org/schema/mvc
    http://www.springframework.org/schema/mvc/spring-mvc-3.0.xsd">

    <!-- 4.掃描web相關的bean -->
    <context:component-scan base-package="com.kylin.controller" />
    <mvc:annotation-driven />


    <!-- 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="/WEB-INF/jsp/" />
        <property name="suffix" value=".jsp" />
    </bean>

</beans>

    2.2spring-service.xml文件(主要掃描本身層,建立和管理bean對象便可)

<?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="com.kylin.service" />

</beans>

    2.3spring-dao.xml文件(整合mybatis框架,處理mapper映射文件和接口分離問題)

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

    <!--掃描dao層-->
    <context:component-scan base-package="com.kylin.dao" />


    <!-- 配置整合mybatis過程 -->
    <!-- 1.引入數據庫配置的參數properties-->
    <context:property-placeholder location="classpath:db.properties" />

    <!-- 配置c3p0數據庫鏈接池 -->
    <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}"/>
        <!--池參數不進行配置,使用默認池參數-->
    </bean>

    <!-- 3. 配置事務管理器,大概事務就由該bean來管理,不用咱們手動的提交 -->
    <bean id="transactionManager"
          class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
        <!-- 注入數據庫鏈接池 -->
        <property name="dataSource" ref="dataSource" />
    </bean>
    <!-- 4.配置基於註解的聲明式事務 -->
    <!--<tx:annotation-driven transaction-manager="transactionManager" />-->


    <!-- 5.配置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" />
        <!-- 掃描domain包 使用別名 -->
        <!--<property name="typeAliasesPackage" value="com.blog.dao" />-->
        <!-- 掃描找到映射文件:mapper須要的xml文件 -->
        <property name="mapperLocations" value="classpath:mapper/*.xml" />
    </bean>

    <!-- 4.配置掃描Dao接口包,動態實現Dao接口,注入到spring容器中 -->
    <bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
        <!-- 注入sqlSessionFactory -->
        <property name="sqlSessionFactoryBeanName" value="sqlSessionFactory" />
        <!-- 給出須要掃描Dao接口包 -->
        <property name="basePackage" value="com.kylin.dao" />
    </bean>


</beans>

  3.配置web.xml文件(加載多個spring文件,配置前端控制器等……)

<?xml version="1.0" encoding="UTF-8"?>
<web-app version="2.4"
         xmlns="http://java.sun.com/xml/ns/j2ee"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee
         http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd">


    <!--首先是spring整合springMVC的過程-->
    <!--  ContextLoaderListener 加載IOC容器,Spring框架的底層是listener -->
    <context-param>
        <param-name>contextConfigLocation</param-name>
         <!-- 指定Spring的配置文件的路徑和名稱 -->
        <param-value>classpath*:spring/spring-service.xml;classpath*:spring/spring-dao.xml</param-value>
    </context-param>
    <!-- Bootstraps the root web application context before servlet initialization -->
    <listener>
        <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
    </listener>

    <!--配置前端控制器-->
    <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/spring-web.xml</param-value>
        </init-param>
        <load-on-startup>1</load-on-startup>
    </servlet>
    <servlet-mapping>
        <servlet-name>springMVC</servlet-name>
        <url-pattern>/</url-pattern>
    </servlet-mapping>
</web-app>

注意:

  當須要加載多個spring配置文件的時候,使用<content-param>標籤,而且若是有多個的話,中間用;來分離(具體看上面),還有那個監聽器很是重要,底層就是靠的這個來加載多個spring配置文件的,並且最好把這2個標籤放在最前面,接下來就是配置前端控制器,因爲咱們配置文件的路徑不是默認的,因此也須要加上<init-param>來配置上spring-web.xml的路徑。

  4.mybatis-config.xml配置文件以及db.properties文件

    4.1mybatis-config.xml

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


    <!--能夠配置一些spring配置不了的東西,例如spring分頁插件~~~等等之類的-->
</configuration>

    4.2db.properites

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

 

  5.編寫mapper映射文件和dao層的接口

  因爲idea並不能解析在src下非java的文件,因此須要使mapper映射文件和接口分離,那麼就不能再使用mybatis-config.xml來管理,而是用spring-dao.xml管理,具體的配置已經在上面的文件中給了~接下來介紹的是mapper的映射文件的寫法

    5.1在resources下建立mapper目錄,建立UserMapper.xml映射文件

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
        PUBLIC "-//ibatis.apache.org//DTD Mapper 3.0//EN"
        "http://ibatis.apache.org/dtd/ibatis-3-mapper.dtd">

<!-- mapper 爲根元素節點, 一個namespace對應一個dao -->
<mapper namespace="com.kylin.dao.UserDao">

    <insert id="insertUser" parameterType="com.kylin.pojo.User">
        insert  into user (id,username,birthday,sex,address)
        values(#{id},#{username},#{birthday},#{sex},#{address})
    </insert>

    <select id="selectAllUsers" resultType="com.kylin.pojo.User">
        select * from user
    </select>
</mapper>

 注意:映射文件中的命名空間的路徑指的是該映射文件對應的接口文件的路徑!!!

      5.2就在src下建立相應的dao層的接口文件

package com.kylin.dao;

import com.kylin.pojo.User;
import org.springframework.stereotype.Repository;

import java.util.List;

@Repository
public interface UserDao {

    void insertUser(User user);
    List<User> selectAllUsers();
}

  6.編寫service層的東西,建立service層,裏面再建立一個Impl目錄用來實現service層的接口

    6.1編寫UserService接口

package com.kylin.service;

import com.kylin.pojo.User;

import java.util.List;

public interface UserService {

    void insertUser(User user);
    List<User>selectAllUsers();
}

    6.2編寫UserService接口的實現類UserServiceImpl.java

package com.kylin.service.Impl;

import com.kylin.dao.UserDao;
import com.kylin.pojo.User;
import com.kylin.service.UserService;
import org.springframework.stereotype.Service;

import javax.annotation.Resource;
import java.util.List;

@Service(value = "userServiceImpl")
public class UserServiceImpl implements UserService {

    @Resource(name = "userDao")
    private UserDao userDao;
    @Override
    public void insertUser(User user) {
        //調用dao層
        userDao.insertUser(user);
    }

    @Override
    public List<User> selectAllUsers() {
        return userDao.selectAllUsers();
    }
}

 注意:是把實現類設置成bean對象,不過可能名字使用的是接口名的

  7.2編寫web層UserController

package com.kylin.controller;

import com.google.gson.Gson;
import com.kylin.pojo.User;
import com.kylin.service.Impl.UserServiceImpl;
import com.kylin.service.UserService;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.ResponseBody;

import javax.annotation.Resource;
import java.util.Date;
import java.util.List;

@Controller
public class UserController {
    @Resource(name = "userServiceImpl")
    private UserServiceImpl userService;
    //插入用戶
    @RequestMapping(value = "/insert",method = RequestMethod.POST)
    @ResponseBody
    public String insertUser(@RequestBody String jsonStr){
        Gson gson=new Gson();
        User user=gson.fromJson(jsonStr,User.class);
        user.setBirthday(new Date());
        userService.insertUser(user);
        return "hello world";

    }
    @RequestMapping(value = "/selectAllUsers",method = RequestMethod.GET,produces = "text/html;charset=utf-8")
    @ResponseBody
    public String selectAllUsers(){
        List<User>userList=userService.selectAllUsers();
        for (User user:userList){
            System.out.println(user.getId());
        }
        return "hello world2";
    }

}

總結:

  這樣就大概搭建好一個ssm框架,文章中省略了一些東西,好比數據庫的建立之類的~可是那些都不是主要的內容;我的以爲是:須要處理好web.xml中加載多個spring配置文件的問題,以及mapper映射文件分離的問題~還有就是spring和springMVC的整理並不須要其餘的jar包,可是spring鏈接mybatis框架須要額外的jar包spring-mybatis.jar,這裏的版本須要對應好;否則會有異常。

相關文章
相關標籤/搜索