基於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專案最簡單的流程也就跑通了,然後就可以在這個簡單流程上開發自己相應的業務了。那接下來我也要去做我的業務了,開發過程中有什麼心得也會發在部落格中跟大家分享,敬請期待。