MyBatis學習筆記

2021-10-16 19:44:02 字數 3645 閱讀 2426

"add"

parametertype

="student"

usegeneratedkeys

="true"

keyproperty

="id"

>

insert into student(name,gender,major,grade,supervisor_id)

values(#,#,#,#,#)

insert

>

這裡的關鍵是使用了supervisor.id這樣的寫法,這表明是把學生實體的supervisor屬性的id屬性值,作為插入的記錄的supervisor_id欄位的值。其他地方與之前的插入示例一致(mybatis增刪改示例)。

public

void

add(student student)

;

執行程式如下:

package com.demo;

import com.abc.domain.student;

import com.abc.domain.teacher;

public

class

mybatisspringdemo

public

static

void

main

(string[

] args)

}

執行後,登入mysql查詢。如下圖所示:

(注:第乙個紅框裡的命令「set names gbk」是為了能夠顯示中文。)

從第二個和第三個紅框之間的對比可以看出,資料已被寫入到資料庫(點此進入無事務處理的×××頁面)。

二、事務管理

在上面的示例中,並沒有為程式配置事務管理器,而在程式中也不像以前的示例那樣呼叫了提交事務的方法,但資料卻已實實在在地被寫入到了資料庫中。這是怎麼回事呢?mybatis官方文件告訴我們,凡是在spring事務之外執行的對映器方法,都會被自動提交(英文可參見中的「programmatic transaction management」部分,中文可參見中的「程式設計式事務管理」部分)。這樣一來,就沒有用上spring強大的事務管理功能。spring事務管理提供宣告式(declarative)和程式設計式(programmatic)兩種方式。今天就先給大家介紹一下程式設計式的基本用法(雖然宣告式是最常用的方式,但是發現想把它說清楚不是那麼容易滴,留待以後有機會再詳述吧)。

首先在spring的配置檔案(本例中為beans.xml)中配置mybatis-spring要用到的事務管理器,即org.springframework.jdbc.datasource.datasourcetransactionmanager。配置內容如下:

"transactionmanager"

class

="org.springframework.jdbc.datasource.datasourcetransactionmanager"

>

name

="datasource"

ref="datasource"

/>

bean

>

在這裡,事務管理器引用了在前面配置的資料來源datasource。顯而易見,這個資料來源必須是事務管理器所管理的事務將要操作的那個資料來源。也就是說,應該與sqlsessionfactorybean引用同乙個資料來源。因為我們正是由sqlsessionfactorybean來獲得對映器,進而呼叫對映器的方法來對資料庫進行操作。

需要注意的是,spring對事務管理做了抽象,提供了統一的程式設計介面。例如上述的datasourcetransactionmanager事務管理器,實際上是實現了介面org.springframework.transaction.platformtransactionmanager。針對不同的環境,spring提供了不同的實現。例如,對於hibernate,可使用事務管理器org.springframework.orm.hibernate3.hibernatetransactionmanager。與此相關的介面還有org.springframework.transaction.transactiondefinition和org.springframework.transaction.transactionstatus,分別代表事務的定義和事務的狀態。提供統一介面的好處是我們只需要針對這個介面程式設計,而無需考慮不同環境下事務處理的不同細節。

程式設計式事務管理**如下:

package com.demo;

import com.abc.domain.student;

import com.abc.domain.teacher;

import org.springframework.transaction.support.defaulttransactiondefinition;

import org.springframework.transaction.transactiondefinition;

import org.springframework.transaction.transactionstatus;

import org.springframework.transaction.platformtransactionmanager;

import org.springframework.jdbc.datasource.datasourcetransactionmanager;

public

class

mybatisspringdemo

public

static

void

main

(string[

] args)

catch

(exception e)

//提交事務

tm.commit

(status);}

}

執行結果如下:

查詢資料庫如下圖所示:

顯然,資料已被寫入。

三、使用bean繼承配置對映器

當我們需要在beans.xml中配置多個對映器時,它們的class和sqlsessionfactory屬性都是一樣的(也許還有其它一樣的屬性)。顯然,我們需要消除這種冗餘資訊。借助於bean繼承機制,我們可以達到這個目的。如下所示:

class

=abstract

="true"

>

name

="sqlsessionfactory"

ref="sqlsessionfactory"

/>

bean

>

parent

=>

name

= value

=/>

bean

>

mybatis學習筆記

隨便寫點,先把文章建立了,然後再新增內容。一 最重要的介面類 sqlsessionfactory,從類名上我認為這是乙個工廠類,用來建立sqlsession的例項。同乙個資料庫的連線或資料來源的訪問,可以用同乙個sqlsessionfactory來建立。二 乙個工具類,sqlsessionfacto...

mybatis學習筆記

mybatis的resultmap與resultclass 1 resultmap屬於直接對映,可以把結果集中的資料庫欄位與實體類中的屬性一一對應,這樣通過select語句得到的結果就會準確的對上號 2 resultclass屬於隱身對映,雖然你指定resultclass 具體某乙個類,但是sele...

mybatis學習筆記

簡單示例 目錄結構如下 1 編寫實體 public class blog 2 建立資料庫及實體對應表 3 config.xml配置檔案 select from blog where id select from blog where id 5 xml配置管理器 getresourceasreader...