1. 程式人生 > >基於SpringMVC4.3.2+Spring4.3.2+MyBatis3.4.1搭建SSM框架

基於SpringMVC4.3.2+Spring4.3.2+MyBatis3.4.1搭建SSM框架

終於到了框架搭建的最後一步,實現我們的終極目標SpringMVC+Spring+MyBatis的SSM框架,這篇文章也是基於之前搭建的SpringMVC+Spring+Hibernate框架演變過來的,所以沒看過之前幾篇文章的同學請乘傳送帶。

在之前搭建SpringMVC+Spring+Hibernate的基礎上,我們替換Hibernate至Mybatis,其實很簡單了,所以這篇文章也很短,其他關於Spring,DAO設計模式的介紹都在之前文章中說過了。另外至於為什麼最後選擇使用Mybatis而不是Hibernate的原因,也在之前說過了。所以看這篇文章之前還是要看下之前兩篇文章的。好,接下來我們開始替換工作。

刪掉Hibernate相關Jar包

首先刪掉Hibernate相關的jar包,在這裡我刪掉了所有以Hibernate開頭的jar包

注意:同時要刪掉spring-orm的jar包,因為這個包依賴hibernate那邊的包,那邊的包刪掉後這個還在的話會報錯

加入MyBatis的Jar包

然後我們引入Mybatis需要的包

加入MyBatis Spring支援包

這個包要單獨從MyBatis官網下載,注意每個版本支援的Mybatis和Spring版本不一樣,官網也有說明,這裡因為我們MyBatis和Spring都是用的最新版本,所以mybatis-spring要最新的1.3.1。

這裡寫圖片描述

如果版本不對的話,會報getTimeOut的異常,如果遇到這個異常,只要檢查mybatis-spring這個jar包的版本號就可以了。

配置Mybatis

其實Mybatis和Hibernate總體的理念是差不多的,包括POJO,DAO的設計等等,不同的是他們對資料庫的對映,及操作方式。抱歉這裡我也是入門級的,無法評論孰優孰劣,具體關於Mybatis和Hibernate的差異可以自行百度,然後等我用一段時間後,有什麼心得也會補充進來。

所以需要改的地方其實不多,除了配置檔案就是幾個資料庫對映,下面一一為大家講解。

配置資料庫對映

Mybatis對資料庫的對映是可以寫成xml檔案的,當然還有另外一種實現是用介面,這裡只說一下xml形式的方法。

值得注意的是Mybatis不需要對映資料表,我簡單說一下原因,大家試著理解一下。Hibernate需要對映資料表,是因為Hibernate將對某張表的增刪改查操作都用HQL實現了一遍,這樣有一個好處就是開發者不用關心sql語言,就算資料庫換了也沒關心,Hibernate會做一個HQL->SQL的轉換。缺點就是對SQL的優化很難。而Mybatis與Hibernate在這個點上完全不同,Mybatis不關心表結構,你需要自己配置增刪改查的SQL語句,至於優點和缺點也恰好和Hibernate相反。下面我們看下Mybatis的配置檔案。

mapping/userMapper
<?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,namespace的值習慣上設定成包名+sql對映檔名,這樣就能夠保證namespace的值是唯一的 
    例如namespace="me.gacl.mapping.userMapper"就是me.gacl.mapping(包名)+userMapper(userMapper.xml檔案去除字尾) -->
<mapper namespace="com.helloworld.mapping.userMapper">
    <!-- 在select標籤中編寫查詢的SQL語句, 設定select標籤的id屬性為getUser,id屬性值必須是唯一的,不能夠重複 使用parameterType屬性指明查詢時使用的引數型別,resultType屬性指明查詢返回的結果集型別 
        resultType="me.gacl.domain.User"就表示將查詢結果封裝成一個User類的物件返回 User類就是users表所對應的實體類 -->
    <!-- 根據id查詢得到一個user物件 -->
    <select id="getUser" parameterType="int" resultType="com.helloworld.pojo.User">
        select *
        from user where userId=#{id}
    </select>
</mapper>

大家看到在配置檔案中我們配置了一條查詢語句,配置了輸入引數id,和返回引數。當然配置返回引數的型別後,Mybatis可以自動將返回的語句對映成一個JAVA類。

修改Mybatis配置檔案

在前面框架配置的基礎上,我們刪掉spring-common.xml,因為前面也說過這個common配置是對datasource和session等關於Hibernate的配置,建立spring-mybatis.xml,將mybatis配置檔案寫入這個檔案中。這也是前面說到配置檔案分開的優勢,你看,如果要修改持久層框架配置,只需要簡單替換就可以了。

配置如下

<?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:p="http://www.springframework.org/schema/p"
    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-3.1.xsd  
                        http://www.springframework.org/schema/context  
                        http://www.springframework.org/schema/context/spring-context-3.1.xsd  
                        http://www.springframework.org/schema/mvc  
                        http://www.springframework.org/schema/mvc/spring-mvc-4.0.xsd">

    <!-- 定義資料來源的資訊 -->
    <bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource"
        destroy-method="close">
        <property name="driverClass">
            <value>com.mysql.jdbc.Driver</value>
        </property>
        <property name="jdbcUrl">
            <value>jdbc:mysql://localhost:3306/test</value>
        </property>
        <property name="user">
            <value>root</value>
        </property>
        <property name="password">
            <value>zzw</value>
        </property>
        <property name="maxPoolSize">
            <value>80</value>
        </property>
        <property name="minPoolSize">
            <value>1</value>
        </property>
        <property name="initialPoolSize">
            <value>1</value>
        </property>
        <property name="maxIdleTime">
            <value>20</value>
        </property>
    </bean>

    <!-- spring和MyBatis完美整合,不需要mybatis的配置對映檔案 -->
    <bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
        <property name="dataSource" ref="dataSource" />
        <!-- 自動掃描mapping.xml檔案 -->
        <property name="mapperLocations" value="classpath:com/helloworld/mapping/*.xml"></property>
    </bean>

    <!-- DAO介面所在包名,Spring會自動查詢其下的類 -->
    <bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
        <property name="basePackage" value="com.helloworld.dao" />
        <property name="sqlSessionFactoryBeanName" value="sqlSessionFactory"></property>
    </bean>

    <!-- (事務管理)transaction manager, use JtaTransactionManager for global tx -->
    <bean id="transactionManager"
        class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
        <property name="dataSource" ref="dataSource" />
    </bean>

</beans>

配置檔案也比較容易理解,因為和Hibernate的概念都是一樣的。然後只要定義了mapperLocations,Spring會自動掃描路徑下的所有mapper檔案,做成Bean。同樣的,配置DAO所在的包名,也能自動將session注入到DAO中。

修改DAO類

前面DAO類繼承HibernateDaoSupport是對Hibernate的支援,這裡自然也要改掉了,Mybatis需要繼承SqlSessionDaoSupport,如下:

package com.helloworld.daoImpl;

import java.sql.Connection;

import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.mybatis.spring.support.SqlSessionDaoSupport;

import com.helloworld.dao.BaseDao;
import com.helloworld.pojo.User;

public class UserDao extends SqlSessionDaoSupport implements BaseDao{

    /**
      * 獲取相關的資料庫連線
      */
     public Connection getConnection() {
      return getSqlSession().getConnection();
     }

    public UserDao() {
        System.out.println("UserDao IN");
    }

    public User getUser(){
        String statement = "com.helloworld.mapping.userMapper.getUser";//對映sql的標識字串
        //執行查詢返回一個唯一user物件的sql
        User user = getSqlSession().selectOne(statement, 1);
        return user;
    }

    @Override
    public void saveObject(Object obj)
    {
        // TODO Auto-generated method stub

    }
}

至於Mapper檔案中配置的查詢檔案怎麼用,這裡也給了一個簡單的例子,非常簡單,看一下就可以了。

配置完成之後整個專案的目錄結構如下

這裡寫圖片描述

至此,Mybatis框架已經配置完成,可以和Hibernate一樣寫個Test類,看能不能正常獲取到資料庫中的資料,也可以將專案釋出,看訪問頁面能不能獲取的資料。

如果沒什麼意外,現在應該已經能夠通過訪問頁面來訪問資料庫然後顯示給使用者了。一個WEB專案最簡單的流程也就跑通了,然後就可以在這個簡單流程上開發自己相應的業務了。那接下來我也要去做我的業務了,開發過程中有什麼心得也會發在部落格中跟大家分享,敬請期待。