1. 程式人生 > >MyBatis3與Spring4整合方法詳解(使用SqlSessionTemplate類)

MyBatis3與Spring4整合方法詳解(使用SqlSessionTemplate類)

由於專案需要,第一次接觸MyBatis,在網上找了很多MyBatis與Spring的整合方法,網上的資料不夠詳細,雖然講了很多整合方法,但卻沒有針對每一種方法去詳細講解,對於沒有相關基礎的人難以操作,因此自己整理記錄如下(注:本次使用的是比較常用的SqlSessionTemplate,沒有使用Mapper介面)。

本次使用版本為MyBatis 3.2.5、Spring4.0.7,為了將兩者整合還需要一個jar包"mybatis-spring-1.2.2.jar",工具使用的是Eclipse kepler,本次使用到的所有jar包會附在最後。

本次整合建立的是普通Java Web工程,沒有使用Maven工程,整合好之後的程式目錄結構如下圖所示,src與conf是類路徑,src用於存放程式碼,conf用於存放配置檔案以及MyBatis對映檔案。applicationContext.xml是Spring配置檔案,MyBatisConf.xml是MyBatis配置檔案,這配置檔案的名字可以隨意命名。

首先建立Java Web工程,並參考上圖建立相應資料夾與包,匯入MyBatis的jar包、Spring的jar包、Oracle驅動包、資料庫連線池的jar包。

一.建立庫表對映類並配置MyBatis


 首先在資料庫中建立一張表“USER_INFO”
create table USER_INFO
(
 ID VARCHAR2(10) not null,
 USER_NAME VARCHAR2(50) not null,
 USER_AGE VARCHAR2(100) not null,
 USER_ADD VARCHAR2(200)
)
表建立好之後便建立其對映類“UserInfo”,位於包“vo”中
public class UserInfo {
private String id;
private String userName;
private String userAge;
private String userAdd;
public String getId()
{  return id; }
public void setId(String id)
{  this.id = id; }
public String getUserName()
{  return userName; }
public void setUserName(String userName)
{  this.userName = userName; }
public String getUserAge()
{  return userAge; }
public void setUserAge(String userAge)
{  this.userAge = userAge; }
public String getUserAdd()
{  return userAdd; }
public void setUserAdd(String userAdd)
{  this.userAdd = userAdd; }
}
 
對映類建立好之後便建立MyBatis對映檔案(即Mapper檔案),位於conf的mapper包中,檔案內容如下:
<?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="UserInfoMapper">
<resultMap type="UserInfo">
<id property="id" column="id" />
<result property="userName" column="user_name" />
<result property="userAge" column="user_age" />
<result property="userAdd" column="user_add" />
</resultMap>
</mapper>
Mapper檔案中的resultMap用於配置表中欄位與對映類屬性間的對映關係,其中的"type"表示對映類的完整類名,但此處沒有使用"vo.UserInfo"的原因是在MyBatis配置檔案中配置了其別名。

 緊接著就是建立MyBatis的配置檔案"MyBatisConf.xml",用於配置對映類的別名並配置Mapper檔案的路徑,檔案內容如下:
<?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>
   <!-- 配置對映類的別名 -->
   <typeAliases>  
       <typeAlias alias="UserInfo"/>  
   </typeAliases>  
   <!-- 配置Mapper檔案的路徑 -->
   <mappers>
       <mapper resource="mapper/UserInfoMapper.xml"/>
   </mappers>
</configuration>
如果不與Spring進行整合的話,此配置檔案還需要配置資料來源資訊,與Spring整合之後資料來源就配置在Spring配置檔案中,只需要配置對映檔案的路徑就可以了。

二.配置Spring

在配置資料來源Bean時,其中的連線引數可以直接寫在配置檔案裡,但更好的是將連線引數單獨放到一個屬性檔案中,然後將此檔案配置在Spring配置檔案中讓資料來源Bean讀取即可。在conf中建立jdbc配置檔案“jdbc.properties”,檔案內容如下:
jdbc.driverClassName=oracle.jdbc.driver.OracleDriver
jdbc.url=jdbc:oracle:thin:@localhost:1521:orcl
jdbc.username=des
jdbc.password=des
接下來建立Spring配置檔案“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"
xmlns:mvc="http://www.springframework.org/schema/mvc"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-4.0.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-4.0.xsd
http://www.springframework.org/schema/mvc
http://www.springframework.org/schema/mvc/spring-mvc-4.0.xsd">
</beans>

然後便可以在Spring配置檔案中引入jdbc配置檔案了,程式碼如下所示:

<context:property-placeholder location="classpath:jdbc.properties"/>
然後在Spring配置檔案配置資料來源Bean,程式碼如下:
<bean class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close">
 <property value="${jdbc.driverClassName}" />
 <property value="${jdbc.url}" />
 <property value="${jdbc.username}" />
 <property value="${jdbc.password}" />
</bean>  
在Mybatis中對資料庫的所有操作都是基於一個SqlSession的,而SqlSession是由SqlSessionFactory來產生的,SqlSessionFactory又是由SqlSessionFactoryBuilder來生成的。但是Mybatis-Spring給我們封裝了一個SqlSessionFactoryBean,在這個bean裡面還是通過SqlSessionFactoryBuilder來建立對應的SqlSessionFactory,進而獲取到對應的SqlSession。通過SqlSessionFactoryBean我們可以通過對其指定一些屬性來提供Mybatis的一些配置資訊。所以接下來我們需要在Spring的applicationContext配置檔案中定義一個SqlSessionFactoryBean。
<bean class="org.mybatis.spring.SqlSessionFactoryBean">
  <!-- 指定使用的資料來源 -->
  <property ref="dataSource" />
  <!-- 指定MyBatis配置檔案路徑 -->
  <property name="configLocation" value="MyBatisConf.xml"/>
</bean>
在定義SqlSessionFactoryBean的時候,dataSource屬性是必須指定的,它表示用於連線資料庫的資料來源。當然,我們也可以指定一些其他的屬性,下面簡單列舉幾個:

l  mapperLocations:它表示我們的Mapper檔案存放的位置,當我們的Mapper檔案跟對應的Mapper介面處於同一位置的時候可以不用指定該屬性的值。

l  configLocation:用於指定Mybatis的配置檔案位置。如果指定了該屬性,那麼會以該配置檔案的內容作為配置資訊構建對應的SqlSessionFactoryBuilder,但是後續屬性指定的內容會覆蓋該配置檔案裡面指定的對應內容。

l  typeAliasesPackage:它一般對應我們的實體類所在的包,這個時候會自動取對應包中不包括包名的簡單類名作為包括包名的別名。多個package之間可以用逗號或者分號等來進行分隔。

l  typeAliases:陣列型別,用來指定別名的。指定了這個屬性後,Mybatis會把這個型別的短名稱作為這個型別的別名,前提是該類上沒有標註@Alias註解,否則將使用該註解對應的值作為此種類型的別名。
<property>
   <array>
       <value>com.tiantian.mybatis.model.Blog</value>
       <value>com.tiantian.mybatis.model.Comment</value>
   </array>
</property>
l  plugins:陣列型別,用來指定Mybatis的Interceptor。

l  typeHandlersPackage:用來指定TypeHandler所在的包,如果指定了該屬性,SqlSessionFactoryBean會自動把該包下面的類註冊為對應的TypeHandler。多個package之間可以用逗號或者分號等來進行分隔。

l  typeHandlers:陣列型別,表示TypeHandler。

在配置好SqlSessionFactory之後,我們便可以配置SqlSessionTemplate了。Mybatis-Spring為我們提供了一個實現了SqlSession介面的SqlSessionTemplate類,它是執行緒安全的,可以被多個Dao同時使用。同時它還跟Spring的事務進行了關聯,確保當前被使用的SqlSession是一個已經和Spring的事務進行綁定了的。而且它還可以自己管理Session的提交和關閉。當使用了Spring的事務管理機制後,SqlSession還可以跟著Spring的事務一起提交和回滾。

使用SqlSessionTemplate時我們可以在Spring的applicationContext配置檔案中如下定義:
<bean id="sessionTemplate" class="org.mybatis.spring.SqlSessionTemplate">
    <constructor-arg index="0" ref="sqlSessionFactory" />
</bean>
這樣我們就可以通過Spring的依賴注入在Dao中直接使用SqlSessionTemplate來程式設計了。

三.編寫Dao、Service程式碼

 在完成MyBatis與Spring的基本配置之後便可以編寫Dao層、Service層程式碼。首先在MyBatis的Mapper檔案中編寫SQL語句,內容如下:

<select parameterType="String" resultMap="UserInfoMap">
select * from user_info where id = # {id}
</select>
此SQL表示根據使用者ID查詢使用者資訊,"id"用於唯一表示此SQL語句,"parameterType"表示傳入引數型別,"resultMap"表示返回對映類要與對映關係元素的"id"保持一致。此時完整的Mapper檔案內容如下(不包括檔案頭):
<mapper namespace="UserInfoMapper">
<resultMap type="UserInfo">
 <id property="id" column="id" />
 <result property="userName" column="user_name" />
 <result property="userAge" column="user_age" />
 <result property="userAdd" column="user_add" />
</resultMap>
<select parameterType="String" resultMap="UserInfoMap">
       select * from user_info where id = #
</select>
</mapper>
然後建立介面IUserDao,位於包"dao"中,程式碼如下:
public interface IUserDao {\
/**
 * 根據使用者ID查詢使用者資訊
 * @param id
 * @return
 */
public UserInfo findUserById(String id);
}
然後建立此介面的實現類"UserDaoImpl",位於包"dao.impl"中,程式碼如下:
public class UserDaoImpl implements IUserDao {
private SqlSessionTemplate sessionTemplate;
public void setSessionTemplate(SqlSessionTemplate sessionTemplate)
{  this.sessionTemplate = sessionTemplate; }
@Override
public UserInfo findUserById(String id)
{  UserInfo user = sessionTemplate.selectOne("UserInfoMapper.selectUserByID", "12");  return user; }
}
然後在Spring配置檔案中註冊此實現類的Bean,併為其注入"sessionTemplate"的屬性值,程式碼如下:
<bean class="dao.impl.UserDaoImpl">
  <property name="sessionTemplate" ref="sessionTemplate" />
</bean>
最後一步便是編寫Service程式碼,由於此案例沒有使用前端頁面呼叫的方式,所以就在Service中通過main方法模擬對Dao層的呼叫,否則還應有Service層介面、controller層編碼以及前端頁面。Service類"UserService "位於包"service"中
public class UserService {
  //Spring容器
private static ApplicationContext ctx;
private static IUserDao userDao;
static
{  
// 在類路徑下尋找Spring配置檔案  
ctx = new ClassPathXmlApplicationContext("applicationContext.xml"); }
public static void main(String[] args)
{  userDao = (IUserDao)ctx.getBean("userDao");  UserInfo user = userDao.findUserById("12");  System.out.println(user.getId());  System.out.println(user.getUserName()); }
}
上述類中有兩個屬性,"ctx"就是Spring容器,在main方法中先通過其給屬性"userDao"賦值,然後呼叫其方法"findUserById"通過使用者ID查詢使用者資訊。
至此,MyBatis與Spring整合的例項便已完成。

附:jar包列表

相關推薦

MyBatis3Spring4整合方法(使用SqlSessionTemplate)

由於專案需要,第一次接觸MyBatis,在網上找了很多MyBatis與Spring的整合方法,網上的資料不夠詳細,雖然講了很多整合方法,但卻沒有針對每一種方法去詳細講解,對於沒有相關基礎的人難以操作,因此自己整理記錄如下(注:本次使用的是比較常用的SqlSessionTemplate,沒有使用Mapper介

FlumeKafka整合案例

環境配置 名稱 版本 下載地址 Centos 7.0 64x 百度 Zookeeper 3.4.5 Flume 1.6.0 Kafka 2.1.0 配置Flu

Date.parse()Date.getTime()方法(js獲取時間戳的幾種方式)

這兩個方法的返回值都是 1970/1/1 午夜距離該日期時間的毫秒數 實際中如何使用 下面的例子中,我們將取得從 1970/01/01 到 2017/03/19 的毫秒數 1、Date.parse()的 使用 var d = Date.pa

Python property get/set方法

1.java裡get/set方法 大部分的同學開始寫java程式碼的時候,最初始的程式碼肯定是欄位的get/set方法。大家對於java特別冗長的詬病,很大一部分來自於無處不在的get/set方法。甚至國內有相當一部分不負責任的java書籍,裡面靠大段的get/set

[js高手之路]原型對象(prototype)原型鏈相關屬性方法

隱式 之前 username tar uname create pro getproto .get 一,instanceof: instanceof檢測左側的__proto__原型鏈上,是否存在右側的prototype原型. 我在之前的兩篇文章 [js高手之路]構造函數的基

面向物件—的__new__()方法 [Python] Python 之 __new__() 方法例項化

[Python] Python 之 __new__() 方法與例項化   __new__() 是在新式類中新出現的方法,它作用在構造方法建造例項之前,可以這麼理解,在 Python 中存在於類裡面的構造方法 __init__() 負責將類的例項化,而在 __init__()

jvm原理(34)虛方法動態分派機制

編寫程式碼: public class MyTest7 { public static void main(String[] args) { Animal animal = new Animal(); Animal

“全棧2019”Java第五十七章:多型構造方法

難度 初級 學習時間 10分鐘 適合人群 零基礎 開發語言 Java 開發環境 JDK v11 IntelliJ IDEA v2018.3 文章原文連結 “全棧2019”Java第五十七章:多型與構造方法詳解 下一章 “全棧2019”Java第五十八章:多型中方法返回型

“全棧2019”Java第五十九章:抽象抽象方法

難度 初級 學習時間 10分鐘 適合人群 零基礎 開發語言 Java 開發環境 JDK v11 IntelliJ IDEA v2018.3 文章原文連結 “全棧2019”Java第五十九章:抽象類與抽象方法詳解 下一章 “全棧2019”Java第六十章:如何定義介面

“全棧2019”Java第六十三章:介面抽象方法

難度 初級 學習時間 10分鐘 適合人群 零基礎 開發語言 Java 開發環境 JDK v11 IntelliJ IDEA v2018.3 文章原文連結 “全棧2019”Java第六十三章:介面與抽象方法詳解 下一章 “全棧2019”Java第六十四章:介面與靜態方法詳

“全棧2019”Java第六十四章:接口靜態方法

分享圖片 java 回復 開發語言 java學習 dea 接口 了解 學習計劃 難度 初級 學習時間 10分鐘 適合人群 零基礎 開發語言 Java 開發環境 JDK v11 IntelliJ IDEA v2018.3 文章原文鏈接 “全棧2019”Java第六十四章:

jQuery事件繫結on()、bind()delegate() 方法

使用JS一段時間了,專案過程中發現在jQuery中繫結事件時,有人用bind(),有人用on(),有人用delegate(),還有人用live(),看程式碼的時候覺得都實現功能了也就掀過去了,只是一直沒完全弄懂之間的區別,於是今天查了下資料,自己做個總結。 之

Spring4.0MVC學習資料,ApplicationContext中的方法(三)

做為java開源的一部分,spring框架一直排在老大的位置。Spring4.0 是 Spring 推出的一個重大版本升級,進一步加強了 Spring 作為 Java 領域第一開源平臺的地位。Spring4.0 引入了眾多 Java 開發者期盼的新特性,如泛型依賴注入、Sp

繫結事件on()、bind()delegate() 方法

啃了一段日子的js相關了,學的過程中發現在jQuery中繫結事件時,有人用bind(),有人用on(),有人用delegate(),還有人用live(),看程式碼

Java8中Optional定義使用方法

概述 到目前為止,著名的NullPointerException是導致Java應用程式失敗的最常見原因。過去,為了解決空指標異常,Google公司著名的Guava專案引入了Optional類,Guava通過使用檢查空值的方式來防止程式碼汙染,它鼓勵程式設計師寫更乾淨的程式碼。受到Goo

android matrix 最全方法進階

1 概述 這裡我們會詳細講解matrix的各個方法,以及它的用法。matrix叫做矩陣,在前面講解 ColorFilter 的文章中,我們講解了ColorMatrix,他是一個4*5的矩陣。而這裡,我們講解的Matrix不是用於處理顏色的,而是處理圖形的。他是一個3*3的

基於jdk1.8的equals()hashCode()方法

閱讀目錄 equals()方法詳解hashcode() 方法詳解 Hashset、Hashmap、Hashtable與hashcode()和equals()的密切關係 equals()方法詳解 equals()方法是用來判斷其他的物件是否和該物件相等. equals()方法在object類中定義如

Lua元表方法(轉)

Lua中提供的元表是用於幫助Lua資料變數完成某些非預定義功能的個性化行為,如兩個table的相加。假設a和b都是table,通過元表可以定義如何計算表示式a+b。當Lua試圖將兩個table相加時,它會先檢查兩者之一是否有元表,然後檢查該元表中是否存在_

PHP介面繼承及介面多繼承原理實現方法

在PHP的介面中,介面可以繼承介面。雖然PHP類只能繼承一個父類(單繼承),但是介面和類不同,介面可以實現多繼承,可以繼承一個或者多個介面。當然介面的繼承也是使用extends關鍵字,要多個繼承的話只要用逗號把繼承的介面隔開即可。 需要注意的是當你介面繼承其它介面時候,

虛存主存的地址對映方法

為最近在寫系統命令的時候,經常會出現段錯誤。但是段錯誤的提示資訊一般情況下是比較少的,所以斷錯誤並不是很好找。前幾天從網上查詢了關於段錯誤的一些資料,發現一般段錯誤基本都是與記憶體有關,比如有:訪問不