《Java EE主流開源框架》第4部分 MyBatis框架_第1頁
《Java EE主流開源框架》第4部分 MyBatis框架_第2頁
《Java EE主流開源框架》第4部分 MyBatis框架_第3頁
《Java EE主流開源框架》第4部分 MyBatis框架_第4頁
《Java EE主流開源框架》第4部分 MyBatis框架_第5頁
已閱讀5頁,還剩137頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權,請進行舉報或認領

文檔簡介

Java主流開源框架MyBatis框架——導讀public

class

Employee

{private

int

id;private

String

loginName;private

String

empPwd;private

String

empName;private

String

dept;private

String

pos;private

int

level;private

SalaryInfo

salaryInfo;get、set、構(gòu)造省略MyBatis本是Apache的一個開源項目iBatis,這個項目在2010年由Apache

Software

Foundation遷移到Google

Code,并改名為MyBatis;于2013年11月遷移到Github。MyBatis是一個關系對象映射框架,是一個半自動化的持久層框架。它支持定制化SQL、存儲過程及高級映射。MyBatis框架避免了幾乎所有的JDBC代碼和手動設置參數(shù)及獲取結(jié)果集。MyBatis框架可以使用簡單的XML或注解來配置和映射原生信息,將接口和Java的POJO對象映射成數(shù)據(jù)庫中的記錄。本章介紹了ORM框架的相關理論知識,并比較了MyBatis框架和Hibernate框架這兩個最常用的ORM框架的區(qū)別;重點介紹了MyBatis框架的核心接口SqlSession、配置文件、關聯(lián)查詢、動態(tài)SQL等知識點,并通過代碼實現(xiàn)了基于MyBatis框架的增刪改查操作和數(shù)據(jù)關聯(lián)查詢(一對一關聯(lián)/一對多關聯(lián)/多對多關聯(lián));介紹并演示了基于注解方式的代碼實現(xiàn);介紹了MyBatis框架的事務處理、緩存機制等。16.1

MyBatis與Hibernate的區(qū)別:Hibernate是完全面向?qū)ο?、全自動地建立對象與數(shù)據(jù)庫表的映射關系的持久層框架;MyBatis是一個關系對象映射框架,是一個半自動化持久層框架。這兩種框架都是開源框架。理論上,MyBatis和Hibernate都采用ORM框架。但是,MyBatis需要手動編寫SQL語句,而且需要自行管理對象與數(shù)據(jù)庫表的映射關系。雖說它也是對象關系映射,解決了面向?qū)ο笈c關系型數(shù)據(jù)庫不匹配的問題,但由于它是半自動化的,要手動編寫管理SQL語句,因此它并不是純粹的ORM框架,MyBatis的官方解釋是Data

Mapper

Framework,即數(shù)據(jù)映射框架。開發(fā)速度比較:Hibernate中的SQL語句已經(jīng)被封裝,可以直接使用(也可以自己編寫HQL語句);而MyBatis需要手動編寫SQL語句(一般使用XML文件配置管理,也可以使用注解)。而且,Hibernate是完全的對象關系映射的框架,無須關注底層,只需要管理對象即可。MyBatis需要自己管理對象映射關系。因此,對于非常了解Hibernate的開發(fā)者來說,

Hibernate更方便與快捷。性能比較:Hibernate的SQL語句會自動生成,因此限制了復雜情況下SQL語句的優(yōu)化,而MyBatis通過手動編寫SQL語句

可以自由地進行優(yōu)化,在效率上,Hibernate略差一些。而且,MyBatis更加靈活,更適合習慣于傳統(tǒng)手動編寫SQL語句的程序。Hibernate的二級緩存在配置SessionFactory時就進行了詳細的配置,之后在表對象映射中配置選擇哪種緩存;而MyBatis的二級緩存會在每個表對象映射中再進行配置,因此針對不同的表就可以定義不同的緩存機制,也可以共享相同的緩存配置與實例??傊琀ibernate的功能更加強大與復雜,其本身的二級緩存機制也更好。但是,其缺點也顯而易見,由于它的強大與復雜,所以非常不易掌握,技術門檻很高。但是,大部分選擇項目并不需要選擇如此強大、復雜的框架。因此,MyBatis由于其小巧、方便、高效、簡單、直接且靈活的特點被廣大開發(fā)者所崇尚。第16章JMayvBaEtEisW快eb速開入發(fā)門概述16.2

MyBatis結(jié)構(gòu)特性:從功能層次來講,MyBatis整體架構(gòu)分為接口層、核心層(數(shù)據(jù)處理層)、基礎層,如圖第16章JMayvBaEtEisW快eb速開入發(fā)門概述16.2

MyBatis結(jié)構(gòu)特性:(1)在接口層,MyBatis提供對外的API(Application

Programming

Interface,應用程序編程接口),通過這些API可以進行數(shù)據(jù)庫的各種操作。在接口層,可以實現(xiàn)增/刪/改/查接口,以及動態(tài)地更改配置接口。當接口層接收到調(diào)用的請求時,會調(diào)用核心層(數(shù)據(jù)處理層)的相關方法來完成具體的數(shù)據(jù)處理。(2)在核心層,MyBatis會進行配置文件解析、參數(shù)映射、SQL語句解析SQL語句執(zhí)行、結(jié)果處理及映射。這樣就完成了一次數(shù)據(jù)庫操作。(3)基礎層為核心層提供最基礎的支撐,MyBatis會把一些公用的東西抽取并整合成一個個基礎的組件供核心層進行調(diào)用。該層實現(xiàn)日志管理、緩存管理、(數(shù)據(jù)源/連接池)連接管理、事務處理、配置加載等。對核心層的參數(shù)映射、SQL語句解析、SQL語句執(zhí)行、結(jié)果處理及映射可以進行如下細分。(1)參數(shù)映射如圖所示。(2)SQL語句解析如圖所示。第16章JMayvBaEtEisW快eb速開入發(fā)門概述16.2

MyBatis結(jié)構(gòu)特性:(3)SQL語句執(zhí)行包括以下內(nèi)容。①SimpleExecutor類會做一些比較簡單且常規(guī)的執(zhí)行,每執(zhí)行一次Statement都會進行創(chuàng)建和關閉。②ReuseExecutor類會將Statement存入Map容器中,如果要使用Statement,則直接從Map中取出,Statement是一直存在的,不會另外創(chuàng)建Statement。這個類是可以復用的。BatchExecutor類是作為批處理執(zhí)行器存在的。這三種類(執(zhí)行器)都繼承自BaseExecutor基類,而BaseExecutor類則實現(xiàn)了Executor接口。SQL語句執(zhí)行如圖16-4所示。三種類如圖第16章章JMayvBaaEtEisW快eb速開入發(fā)門概述16.2

MyBatis結(jié)構(gòu)特性:MyBatis接口層與核心層的主要類有以下幾種。(1)SqlSessionFactoryBuilder。SqlSessionFactoryBuilder可以通過XML或者在程序中自行創(chuàng)建Configuration對象,通過build方法創(chuàng)建

SqlSessionFactory對象。SqlSessionFactoryBuilder可以說是MyBatis的應用程序的入口。(2)SqlSessionFactory。SqlSessionFactoryBuilder通過build方法創(chuàng)建SqlSessionFactory對象,其主要功能是創(chuàng)建SqlSession對象。SqlSession對象必須有一個Configuration屬性,這個對象是通過SqlSessionFactoryBuilder創(chuàng)建的。(3)SqlSession。SqlSession對象是通過SqlSessionFactory創(chuàng)建的,它的一個必有屬性Configuration是通過SqlSessionFactoryBuilder創(chuàng)建的,另一個必有屬性是Executor,SqlSession通過它來完成對數(shù)據(jù)庫的操作。其實,SqlSession對象的主要功能就是對數(shù)據(jù)庫進行一次訪問和結(jié)果映射的過程。SqlSession是一個接口(接口是一種特殊的類),DefaultSqlSession是它的默認實現(xiàn)類。第16章JMayvBaEtEisW快eb速開入發(fā)門概述16.2

MyBatis結(jié)構(gòu)特性:(4)Executor。Executor對象在SqlSessionFactoryBuilder創(chuàng)建Configuration對象時就已經(jīng)被創(chuàng)建,它一直存在Configuration對象中,

Executor會調(diào)用StatementHandler進行數(shù)據(jù)的訪問并得到結(jié)果。Executor是一個接口,它的實現(xiàn)類是BaseExecutor。(5)StatementHandler。MyBatis會在StatementHandler中進行數(shù)據(jù)庫訪問操作。如果是查詢操作,存在查詢結(jié)果,則會調(diào)用ResultSetHandler進行處理。(6)ResultSetHandler。如果是查詢操作,存在查詢結(jié)果,則會調(diào)用ResultSetHandler進行處理。第16章章JMayvBaaEtEisW快eb速開入發(fā)門概述16.3

MyBatis半自動化映射原理:全自動化ORM框架提供從普通Java對象(POJO)到數(shù)據(jù)庫表的所有映射機制,它會根據(jù)POJO與數(shù)據(jù)庫表之間的關聯(lián)關系及存儲邏輯自動生成SQL語句,之后調(diào)用JDBC接口執(zhí)行。全自動化ORM框架的著力點是數(shù)據(jù)庫操作封裝全面、實現(xiàn)POJO與數(shù)據(jù)庫表之間的自動映射、SQL語句的自動生成和執(zhí)行。MyBatis采用半自動化ORM框架,之所以稱為半自動化,是因為它沒有對提供的映射機制及數(shù)據(jù)庫操作進行全面的封裝,它沒有對SQL語句進行自動生成與執(zhí)行。與其說它是POJO與數(shù)據(jù)庫表之間的自動映射,不如說它是POJO與SQL語句之間

的映射。也就是說,MyBatis中的SQL語句需要由開發(fā)人員自己編寫并執(zhí)行,之后通過配置文件去映射POJO與SQL語句所需要的參

數(shù)及返回結(jié)果(映射到指定的POJO屬性)。這樣做的好處是,可以把SQL語句從代碼中剝離出來(寫在配置文件中),從而做到在不改變代碼的情況下,靈活、自由地配置和修改自己需要的SQL語句與映射;避免了系統(tǒng)自動生成SQL語句所耗費的資源(系統(tǒng)處理量過大),從而大大提高了運行效率;開發(fā)門檻較低,易于掌握,但同時也會降低開發(fā)效率(不會自動生成SQL語句,需要手動編寫)。第16章JMayvBaEtEisW快eb速開入發(fā)門概述16.4第一個MyBatis實例:下面通過第一個MyBatis實例進行深入的介紹,利用之前的Employee表做一個插入操作。步驟一:下載導入MyBatis核心類庫,這里使用3.4.1版本。步驟二:創(chuàng)建實體類EmployeeEntity,此類實現(xiàn)POJO與SQL的映射,將其屬性與SQL的參數(shù)(表字段)相對應。第16章JMayvBaEtEisW快eb速開入發(fā)門概述public

class

EmployeeEntity

{private

int

id;private

String

loginName;private

String

empPwd;private

String

empname;private

String

dept;private

String

pos;private

int

level;get、set、構(gòu)造省略第16章JMayvBaEtEisW快eb速開入發(fā)門概述16.4第一個MyBatis實例:步驟三:編寫映射配置文件EmployeeMapper.xml。<?xml

version="1.0"

encoding="UTF-8"?><!DOCTYPE

mapper

PUBLIC

"-////DTD

Mapper

3.0//EN""/dtd/mybatis-3-mapper.dtd"><mapper

namespace="com.chinasofti.chapter030101.mapper.EmployeeMapper"><insert

id="save"

parameterType="com.chinasofti.chapter030101.entity.EmployeeEntity"

useGeneratedKeys="true">INSERT

INTO

employee(loginName,empPwd,empname)

VALUES(#{loginName},#{empPwd},#{empname})</insert></mapper>namespace命名空間屬性,一般為了便于區(qū)分而采用包名+文件名的命名方式。insert標簽為插入語句的標簽,其中的id屬性必須是唯一的,這里定義為save。insert標簽中的parameterType是插入的參數(shù)類型,這里使用實體類來插入。insert標簽中的useGeneratedKeys屬性用于確定是否采用主鍵自動增長策略,如果數(shù)據(jù)庫支持自增策略則配置有效。insert標簽中包含一條SQL語句,它向Employee表中插入數(shù)據(jù),#{×××}代表占位符,×××為數(shù)據(jù)類型實體類中對應字段的屬性,它會自動地獲取實體類中對應屬性的值并填充到SQL語句的當前位置上。16.4第一個MyBatis實例:步驟四:編寫MyBatis的配置文件mybatis-config.xml。第16章JMayvBaEtEisW快eb速開入發(fā)門概述<?xml

version="1.0"

encoding="UTF-8"?><!DOCTYPE

configurationPUBLIC

"-////DTD

Config

3.0//EN""/dtd/mybatis-3-config.dtd"><configuration><!--配置環(huán)境(連接的數(shù)據(jù)庫):可以配置多個數(shù)據(jù)庫,default:配置某一個數(shù)據(jù)庫的唯一標識,表示默認使用的數(shù)據(jù)庫--><environments

default="mysql"><environment

id="mysql"><!--事務處理類型為簡單的JDBC--><transactionManager

type="JDBC"/><!--JDBC數(shù)據(jù)源配置為POOLED連接池--><dataSource

type="POOLED"><!--配置連接信息--><property

name="driver"

value="com.mysql.jdbc.Driver"/><property

name="url"

value="jdbc:mysql://:3306/test"/><property

name="username"

value="root"/><property

name="password"

value="ctopwd#01"/></dataSource></environment></environments><!--MyBatis映射文件(EmployeeMapper.xml文件)--><mappers><mapper

resource="com/chinasofti/chapter030101/mapper/EmployeeMapper.xml"/></mappers></configuration>16.4第一個MyBatis實例:步驟五:編寫測試類Test。第16章JMayvBaEtEisW快eb速開入發(fā)門概述import

org.apache.ibatis.io.Resources;import

org.apache.ibatis.session.SqlSession;import

org.apache.ibatis.session.SqlSessionFactoryBuilder;public

class

Test

{public

static

void

main(String[]

args)

throws

IOException

{//讀取MyBatis配置文件,得到SqlSession對象實例sessionSqlSession

session

=

new

SqlSessionFactoryBuilder().build(Resources.getResourceAsStream("mybatis-config.xml")).openSession();//創(chuàng)建實體類,并給參數(shù)賦值EmployeeEntity

emp=new

EmployeeEntity();emp.setLoginname("wxh");emp.setEmpPwd("1111");emp.setEmpname("wangxiaohua");//執(zhí)行用EmployeeMapper.xml中id為save的insert標準的SQL語句,emp的類型對應EmployeeMapper.xml中的parameterType屬性值session.insert("com.chinasofti.chapter030101.mapper.EmployeeMapper.save",emp);mit();session.close();}}17.1

SqlSession接口:在第一個MyBatis實例的代碼中,SqlSessionFactoryBuilder通過build()方法得到SqlSessionFactory的對象實例,

SqlSessionFactory通過openSession()方法得到SqlSession對象實例,SqlSession接口是MyBatis的核心接口。

SqlSession接口如圖所示。第17章章J核av心a

E接E口We及b開配發(fā)置概文述件17.1

SqlSession接口:SqlSession接口涉及如下常用方法。(1)insert:插入方法。int

insert(String

statement):參數(shù)是配置文件(mapper)<insert>標簽元素的id屬性值,返回執(zhí)行插入操作所應用的行數(shù)。int

insert(String

statement,Object

parameter):第一個參數(shù)是配置文件(mapper)<insert>標簽元素的id屬性值,第二個參數(shù)是SQL語句對應輸入?yún)?shù)。(2)update:更新方法。int

update(String

statement):與“int

insert(String

statement)”方法參數(shù)基本一致,只不過獲取的是<update>標簽元素的id屬性值。int

update(String

statement,Object

parameter):與“int

insert(String

statement,Object

parameter)”方法參數(shù)基本一致,只不過獲取的是<update>標簽元素的id屬性值。第17章J核av心a

E接E口We及b開配發(fā)置概文述件17.1

SqlSession接口:(3)delete:刪除方法。int

delete(String

statement):與“int

insert(String

statement)”方法參數(shù)基本一致,只不過獲取的是<delete>標簽元素的id屬性值。int

delete(String

statement,Object

parameter):與“int

insert(String

statement)”方法參數(shù)基本一致,只不過獲取的是<delete>標簽元素的id屬性值。(4)selectOne:結(jié)果只有一條數(shù)據(jù)的查詢方法。<T>T

selectOne(string

statement):參數(shù)是配置文件(mapper)<select>標簽元素的id屬性值,返回的是包含查詢結(jié)果的泛型對象。<T>T

selectOne(String

statement,Object

parameter):第一個參數(shù)同上,第二個參數(shù)是SQL語句對應輸入?yún)?shù)。(5)selectList:返回泛型對象集合(List)的查詢結(jié)果。<E>List<E>selectList(String

statement):參數(shù)是配置文件(mapper)<select>標簽元素的id屬性值,返回的是包含查詢結(jié)果的泛型對象集合(List)。<E>List<E>selectList(String

statement,Object

parameter):第一個參數(shù)同上,第二個參數(shù)是SQL語句對應輸入?yún)?shù)。<E>List<E>selectList(String

statement,Object

parameter,RowBounds

rowBounds):前兩個參數(shù)同上,第三個參數(shù)是用于分頁。第17章章J核av心a

E接E口We及b開配發(fā)置概文述件17.1

SqlSession接口:(6)selectMap:將查詢結(jié)果封裝成Map返回。<K,V>Map<K,V>selectMap(String

statement,String

mapKey):第一個參數(shù)是配置文件(mapper)<select>標簽元素的id屬性值,返回查詢結(jié)果被封裝成Map;第二個參數(shù)是一個要查詢表的列名,這個列的數(shù)據(jù)將成為Map的key。需要注意的是,這個列的數(shù)據(jù)一般是唯一的,否則不會報錯,但是相同的key之后保存最后一個數(shù)據(jù)。<K,V>Map<K,V>selectMap(String

statement,Object

parameter,String

mapKey):第一個、第三個參數(shù)同上,第二個參數(shù)是SQL語句對應輸入?yún)?shù)。<K,V>Map<K,V>selectMap(String

statement,Object

parameter,String

mapKey,RowBounds

rowBounds):第一個、第二個、第三個參數(shù)同上,第四個參數(shù)用于分頁。(7)select:通過實現(xiàn)ResultHandler接口得到查詢結(jié)果(無返回值,結(jié)果在ResultHandler接口實現(xiàn)中直接處理)。void

select(String

statement,ResultHandler

handler):第一個參數(shù)同上,ResultHandler接口用于處理返回的查詢結(jié)果。void

select(String

statement,Object

parameter,ResultHandler

handler):參數(shù)同上。void

select(String

statement,Object

parameter,RowBounds

rowBounds,ResultHandler

handler):參數(shù)同上。(8)其他。void

commit():事務提交。void

rollback():事務回滾。void

close():關閉SqlSession。第17章章J核av心a

E接E口We及b開配發(fā)置概文述件17.2配置文件:MyBatis的配置文件為mybatis-config.xml文件第17章J核av心a

E接E口We及b開配發(fā)置概文述件<?xml

version="1.0"

encoding="UTF-8"?><!DOCTYPE

configuration

PUBLIC

"-////DTD

Config

3.0//EN"

"/dtd/mybatis-3-config.dtd"><configuration><properties></properties><settings><setting></setting></settings><typeAliases><typeAliases></typeAliases><package></package></typeAliases><typeHandlers><typeHandler></typeHandler></typeHandlers><environments><environment><transactionManager></transactionManager><dataSource

><property></property></dataSource></environment></environments><mappers><mapper></mapper></mappers></configuration>17.2配置文件:(1)configuration為頂層的配置,其他配置都在configuration中進行。第17章章J核av心a

E接E口We及b開配發(fā)置概文述件<?xml

version="1.0"

encoding="UTF-8"?><!DOCTYPE

configuration

PUBLIC

"-////DTD

Config

3.0//EN"

"/dtd/

mybatis-3-config.dtd"><configuration></configuration>第1章Java

EE

Web開發(fā)概述17.2配置文件:(2)settings標簽中包含多個setting設置,這些設置的屬性會改變MyBatis的運行方式。在上面的兩個配置中,第一個setting配置的name是/view29/M01/2A/1E/wKh2EmTT4TiAVDIYACFCQhlveCI35

261626|0

c43b98220df01b26d2f4bf8第17章核心接口及配置文件第17章章J核av心a

E接E口We及b開配發(fā)置概文述件17.2配置文件:(3)typeAliases可以給Java類型起別名。如果一個類名比較長,則可以給它起一個短的別名;如果在其他配置中用到這個類,則也可以用別名代替。<configuration><typeAliases><typeAliases

alias="emp"

type="com.chinasofti.chapter030304.entity.EmployeeEntity"></typeAliases></typeAliases></configuration>在上面的配置中,如果需要使用com.chinasofti.chapter030304.entity.EmployeeEntity則可以用emp代替。<configuration><typeAliases><package

name="com.chinasofti.chapter030306.entity"></package></typeAliases></configuration>在上述代碼中,為com.chinasofti.chapter030306.entity包里的類自動起別名,別名的規(guī)則是首字母小寫的類名。MyBatis內(nèi)置了多個Java常見類型的別名,如java.util.Map,MyBatis中的別名為map,在需要的配置文件中可以直接使用。所有別名可以查閱MyBatis官網(wǎng)。MyBatis內(nèi)置了一些常用的類型轉(zhuǎn)換器,對此可以參閱MyBatis官網(wǎng)。第17章章J核av心a

E接E口We及b開配發(fā)置概文述件17.2配置文件:(4)無論是MyBatis在預處理語句(PreparedStatement)中設置一個參數(shù)時,還是從結(jié)果集中取出一個值時,都會用類型處理器TypeHandler將獲取的值以合適的方式轉(zhuǎn)換成Java類型。在開發(fā)過程中,通常使用自定義類型轉(zhuǎn)換。例如Date的Java類型,存入數(shù)據(jù)庫的數(shù)據(jù)是一個時間,如果想要存放的是一個毫秒數(shù),取出來時是一個Date類型,則可以自定義一個類實現(xiàn)TypeHandler接口或者繼承BaseTypeHandler,對Date進行處理,之后再在配置文件中進行配置。<configuration><typeHandlers><typeHandler

handler="XXX.XXX.MyDateTypeHandler"/></typeHandlers></configuration>也可以把typeHandler標簽換成package,以便統(tǒng)一配置包里的所有自定義類型轉(zhuǎn)換。<configuration><typeHandlers><package

handler="XXX.XXX

"/></typeHandlers></configuration>第17章章J核av心a

E接E口We及b開配發(fā)置概文述件17.2配置文件:(5)properties用來導入外部配置,典型的應用是數(shù)據(jù)庫的配置文件,創(chuàng)建數(shù)據(jù)庫的配置文件perties,內(nèi)容如下:driverClass=com.mysql.jdbc.DriverjdbcUrl=jdbc:mysql://localhost:3306/testuser=rootpassword=123使用properties對文件進行如下配置:<configuration><properties

resource="perties"></properties></configuration>在其他配置中,可以使用perties配置文件中“=”前面的key,對內(nèi)容進行動態(tài)配置,例如:<dataSource

type="POOLED"><!--配置連接信息--><property

name="driver"

value="${driverClass}"/><property

name="url"

value="${jdbcUrl}"/><property

name="username"

value="${user}"/><property

name="password"

value="${password}"/></dataSource>在上面配置中,${}中的內(nèi)容就是perties配置文件中“=”前面的key。17.2配置文件:(6)environments用來進行數(shù)據(jù)源的配置,在第16章16.4節(jié)“第一個MyBatis實例”中曾使用過。第17章章J核av心a

E接E口We及b開配發(fā)置概文述件<configuration><!--配置環(huán)境(連接的數(shù)據(jù)庫):可以配置多個數(shù)據(jù)庫,default:配置某一個數(shù)據(jù)庫的唯一標識,表示默認使用的數(shù)據(jù)庫--><environments

default="mysql"><environment

id="mysql"><!--事務處理類型為簡單的JDBC--><transactionManager

type="JDBC"/><!--JDBC數(shù)據(jù)源配置為POOLED連接池--><dataSource

type="POOLED"><!--配置連接信息--><property

name="driver"value="com.mysql.jdbc.Driver"/><property

name="url"value="jdbc:mysql://:3306/test"/><property

name="username"

value="root"/><property

name="password"

value="ctopwd#01"/></dataSource></environment></environments>17.2配置文件:(7)mapper是映射器,匹配自定義SQL語句映射文件的路徑。上面的配置文件是在第16章16.4節(jié)“第一個MyBatis實例”中配置的,映射器路徑是

“com/chinasofti/chapter030101/mapper/EmployeeMapper.xml”。第17章J核av心a

E接E口We及b開配發(fā)置概文述件<configuration><mappers><mapperresource="com/chinasofti/chapter030101/mapper/EmployeeMapper.xml"/></mappers></configuration>17.2配置文件:(8)映射文件。插入方法SQL語句的配置如下:第17章J核av心a

E接E口We及b開配發(fā)置概文述件<?xml

version="1.0"

encoding="UTF-8"?><!DOCTYPE

mapper

PUBLIC

"-////DTD

Mapper

3.0//EN"

"/dtd/mybatis-3-mapper.dtd"><mapper

namespace="com.chinasofti.chapter030101.mapper.EmployeeMapper"><insert

id="save"

parameterType="com.chinasofti.chapter030101.entity.EmployeeEntity"

useGeneratedKeys="true">INSERT

INTO

employee(loginName,empPwd,empname)

VALUES(#{loginName},#{empPwd},#{empname})</insert></mapper>更新方法SQL語句的配置如下:<?xml

version="1.0"

encoding="UTF-8"?><!DOCTYPE

mapper

PUBLIC

"-////DTD

Mapper

3.0//EN"

"/dtd/mybatis-3-mapper.dtd"><mapper

namespace="com.chinasofti.chapter030301.mapper.EmployeeMapper"><update

id="change"

parameterType="com.chinasofti.chapter030301.entity.EmployeeEntity"

useGeneratedKeys="true">UPDATE

employee

set

loginName=#{loginName},empPwd=#{empPwd},empname=#{empname}

WHERE

id=#{id}</update></mapper>17.2配置文件:刪除方法SQL語句的配置如下:第17章J核av心a

E接E口We及b開配發(fā)置概文述件<mapper

namespace="com.chinasofti.chapter030302.mapper.EmployeeMapper"><delete

id="remove"

parameterType="com.chinasofti.chapter030302.entity.EmployeeEntity">DELETE

FROM

employee

WHERE

id=#{id}</delete></mapper>查詢方法SQL語句的配置如下:<?xml

version="1.0"

encoding="UTF-8"?><!DOCTYPE

mapper

PUBLIC

"-////DTD

Mapper

3.0//EN"

"/dtd/mybatis-3-mapper.dtd"><mapper

namespace="com.chinasofti.chapter030303.mapper.EmployeeMapper"><select

id="getInfo"parameterType="com.chinasofti.chapter030303.entity.EmployeeEntity"

resultType="com.chinasofti.chapter

030303.entity.EmployeeEntity">SELECT

*

FROM

employee

WHERE

id=#{id}</select></mapper>注:parameterType代表參數(shù)類型(${}占位符中的內(nèi)容會在此類型中尋找),resultType代表返回類型(返回值自動封裝成此類型)。18.1

insert插入方法:已在第16章16.4節(jié)“第一個MyBatis實例”中使用過“int

insert(String

statement,Object

parameter)”方法,該方法的使用與“int

insert(String

statement)”方法的使用類似。第18章章JMayvBaaEtEisW框eb架開的發(fā)增概刪述改查18.2

update更新方法:下面通過更改Employee表的數(shù)據(jù)介紹update更新方法。(1)創(chuàng)建實體類(同上述實例)。(2)創(chuàng)建mapper映射文件EmployeeMapper.xml。第18章JMayvBaEtEisW框eb架開的發(fā)增概刪述改查<update

id="change"

parameterType="com.chinasofti.chapter030301.entity.EmployeeEntity"

useGeneratedKeys="true">UPDATE

employee

set

loginName=#{loginName},

empPwd=#{empPwd},empname=#{empname}

WHERE

id=#{id}</update>第18章JMayvBaEtEisW框eb架開的發(fā)增概刪述改查18.2

update更新方法:(3)配置文件mybatis-config.xml(同上述實例)。(4)調(diào)用int

update(String

statement,Object

parameter)方法完成表數(shù)據(jù)修改。public

static

void

main(String[]

args)

throws

IOException

{//讀取mybatis配置文件,得到SqlSession對象實例sessionSqlSession

session

=

new

SqlSessionFactoryBuilder().build(Resources.getResourceAsStream

("mybatis-config.xml")).openSession();//創(chuàng)建實體類,并給參數(shù)賦值

EmployeeEntity

emp=new

EmployeeEntity();emp.setId(54);emp.setLoginname("wxh01");emp.setEmpPwd("2222");emp.setEmpname("wangxiaohua01");//執(zhí)行用EmployeeMapper.xml中id為“change”的update語句,emp的類型對應EmployeeMapper.xml中的parameterType屬性值session.update("com.chinasofti.chapter030301.mapper.EmployeeMapper.change",emp);mit();session.close();}修改id為54的數(shù)據(jù),原數(shù)據(jù)如圖所示。執(zhí)行更新之后的表數(shù)據(jù)如圖所示。18.3

delete刪除方法:下面通過刪除Employee表中的指定數(shù)據(jù)介紹delete刪除方法。(1)創(chuàng)建實體類(同上述實例)。(2)創(chuàng)建mapper映射文件EmployeeMapper.xml。第18章章JMayvBaaEtEisW框eb架開的發(fā)增概刪述改查<mapper

namespace="com.chinasofti.chapter030302.mapper.EmployeeMapper"><delete

id="remove"

parameterType="com.chinasofti.chapter030302.entity.EmployeeEntity">DELETE

FROM

employee

WHERE

id=#{id}</delete></mapper>18.3

delete刪除方法:(3)配置文件mybatis-config.xml(同上述實例)。(4)調(diào)用int

delete(String

statement,Object

parameter)方法進行表數(shù)據(jù)刪除。第18章JMayvBaEtEisW框eb架開的發(fā)增概刪述改查public

static

void

main(String[]

args)

throws

IOException

{//讀取mybatis配置文件,得到SqlSession對象實例sessionSqlSession

session

=

new

SqlSessionFactoryBuilder().build(Resources.getResourceAsStream

("mybatis-config.xml")).openSession();//創(chuàng)建實體類,并給參數(shù)賦值EmployeeEntity

emp=new

EmployeeEntity();emp.setId(54);//執(zhí)行用EmployeeMapper.xml中id為remove的delete語句,emp的類型對應EmployeeMapper.xml中的parameterType屬性值session.delete("com.chinasofti.chapter030302.mapper.EmployeeMapper.remove",emp);mit();session.close();}刪除id為54的數(shù)據(jù),原數(shù)據(jù)如圖所示。執(zhí)行之后的數(shù)據(jù)如圖所示18.4selectOne查詢一條記錄:查詢Employee中id=42的數(shù)據(jù)。(1)創(chuàng)建實體類(同上述實例)。(2)創(chuàng)建mapper映射文件EmployeeMapper.xml。第18章JMayvBaEtEisW框eb架開的發(fā)增概刪述改查<?xml

version="1.0"

encoding="UTF-8"?><!DOCTYPE

mapper

PUBLIC

"-////DTD

Mapper

3.0//EN""/dtd/mybatis-3-mapper.dtd"><mapper

namespace="com.chinasofti.chapter030303.mapper.EmployeeMapper"><select

id="getInfo"

parameterType="com.chinasofti.chapter030303.entity.EmployeeEntity"

resultType="com.chinasofti.chapter030303.entity.EmployeeEntity">SELECT

*

FROM

employee

WHERE

id=#{id}</select></mapper>第18章JMayvBaEtEisW框eb架開的發(fā)增概刪述改查18.4selectOne查詢一條記錄:<select>的id屬性值是getInfo,用parameterType指明參數(shù)的類型,用resultType指明返回值的類型,此處返回

EmployeeEntity實體類對象。(3)配置文件mybatis-config.xml(同上述實例)。(4)調(diào)用<T>T

selectOne(String

statement,Object

parameter)方法完成查詢。public

static

void

main(String[]

args)

throws

IOException

{//讀取mybatis配置文件,得到SqlSession對象實例sessionSqlSession

session

=

new

SqlSessionFactoryBuilder()

.build(Resources.getResourceAsStream("mybatis-config.xml")).openSession();//創(chuàng)建實體類,并給參數(shù)賦值EmployeeEntity

emp=new

EmployeeEntity();emp.setId(42);//執(zhí)行EmployeeMapper.xml中id為“getInfo”的select語句,emp的類型對應EmployeeMapper.xml中的parameterType屬性值emp=session.selectOne("com.chinasofti.chapter030303.mapper.EmployeeMapper.getInfo",emp);mit();session.close();System.out.println("id="+emp.getId());System.out.println("longname="+emp.getLoginname());System.out.println("empPwd="+emp.getEmpPwd());System.out.println("empname="+emp.getEmpname());}18.5

selectList查詢返回泛型對象集合:查詢Employee表中l(wèi)evel等于1且舍棄前兩條數(shù)據(jù)后,取三條數(shù)據(jù)。(1)創(chuàng)建實體類(同上述實例)。(2)創(chuàng)建mapper映射文件EmployeeMapper.xml,返回實體類的集合,因此resultType屬性設定為創(chuàng)建的實體類。第18章JMayvBaEtEisW框eb架開的發(fā)增概刪述改查<?xml

version="1.0"

encoding="UTF-8"?><!DOCTYPE

mapper

PUBLIC

"-////DTD

Mapper

3.0//EN""/dtd/mybatis-3-mapper.dtd"><mapper

namespace="com.chinasofti.chapter030304.mapper.EmployeeMapper"><select

id="returnListSelect"parameterType="com.chinasofti.chapter030304.entity.EmployeeEntity"

resultType="com.chinasofti.chapter

030304.entity.EmployeeEntity">select

*

FROM

employee

WHERE

level=#{level}</select></mapper>18.5

selectList查詢返回泛型對象集合:(3)配置文件mybatis-config.xml(同上述實例)。(4)調(diào)用<E>List<E>selectList(String

statement,Object

parameter,RowBounds

rowBounds)方法完成查詢。第18章JMayvBaEtEisW框eb架開的發(fā)增概刪述改查public

static

void

main(String[]

args)

throws

IOException

{//讀取mybatis配置文件,得到SqlSession對象實例sessionSqlSession

session

=

new

SqlSessionFactoryBuilder().build(Resources.getResourceAsStream("mybatis-config.xml")).openSession();//創(chuàng)建實體類,并給參數(shù)賦值

EmployeeEntity

emp=new

EmployeeEntity();emp.setLevel(1);//執(zhí)行用EmployeeMapper.xml中id為“returnListSelect”的select語句,emp的類型對應EmployeeMapper.xml中的parameterType屬性值List<EmployeeEntity>list=session.selectList("com.chinasofti.chapter030304.mapper.EmployeeMapper.returnListSelect",

emp,

new

RowBounds(2,

3));mit();session.close();for

(EmployeeEntity

employeeEntity

:

list)

{System.out.println("id="

+

employeeEntity.getId()

+

";lognname="

+

employeeEntity.

getLoginname()+";empPwd="+employeeEntity.getEmpPwd()+";empname="+employeeEntity.getEmpname()+";level="+employeeEntity.getLevel());}}18.5

selectList查詢返回泛型對象集合:(3)配置文件mybatis-config.xml(同上述實例)。(4)調(diào)用<E>List<E>selectList(String

statement,Object

parameter,RowBounds

rowBounds)方法完成查詢。第18章JMayvBaEtEisW框eb架開的發(fā)增概刪述改查public

static

void

main(String[]

args)

throws

IOException

{//讀取mybatis配置文件,得到SqlSession對象實例sessionSqlSession

session

=

new

SqlSessionFactoryBuilder().build(Resources.getResourceAsStream("mybatis-config.xml")).openSession();//創(chuàng)建實體類,并給參數(shù)賦值

EmployeeEntity

emp=new

EmployeeEntity();emp.setLevel(1);//執(zhí)行用EmployeeMapper.xml中id為“returnListSelect”的select語句,emp的類型對應EmployeeMapper.xml中的parameterType屬性值List<EmployeeEntity>list=session.selectList("com.chinasofti.chapter030304.mapper.EmployeeMapper.returnListSelect",

emp,

new

RowBounds(2,

3));mit();session.close();for

(EmployeeEntity

employeeEntity

:

list)

{System.out.println("id="

+

employeeEntity.getId()

+

";lognname="

+

employeeEntity.

getLoginname()+";empPwd="+employeeEntity.getEmpPwd()+";empname="+employeeEntity.getEmpname()+";level="+employeeEntity.getLevel());}}18.5

selectList查詢返回泛型對象集合:(3)配置文件mybatis-config.xml(同上述實例)。(4)調(diào)用<E>List<E>selectList(String

statement,Object

parameter,RowBounds

rowBounds)方法完成查詢。舍棄前兩條數(shù)據(jù),取出的三條數(shù)據(jù)的id應為23、24、25,執(zhí)行結(jié)果如圖第18章JMayvBaEtEisW框eb架開的發(fā)增概刪述改查18.6

selectMap查詢封裝Map返回:查詢Employee表中l(wèi)evel等于1且舍棄前兩條數(shù)據(jù)后,取三條數(shù)據(jù),得到id作為Map的key。(1)創(chuàng)建實體類(同上述實例)。(2)創(chuàng)建mapper映射文件EmployeeMapper.xml,返回的數(shù)據(jù)需要封裝成Map,因此resultType的屬性設置為map。第18章JMayvBaEtEisW框eb架開的發(fā)增概刪述改查<?xml

version="1.0"

encoding="UTF-8"?><!DOCTYPE

mapper

PUBLIC

"-////DTD

Mapper

3.0//EN""/dtd/mybatis-3-mapper.dtd"><mapper

namespace="com.chinasofti.chapter030305.mapper.EmployeeMapper"><select

id="returnListSelect"

parameterType="com.chinasofti.chapter030305.entity.EmployeeEntity"

resultType="map">select

*

FROM

employee

WHERE

level=#{level}</select></mapper>18.6

selectMap查詢封裝Map返回:(3)配置文件mybatis-config.xml(同上述實例)。(4)調(diào)用<K,V>Map<K,V>selectMap(String

statement,Object

parameter,String

mapKey,RowBoundsrowBounds)方法進行查詢。第18章JMayvBaEtEisW框eb架開的發(fā)增概刪述改查public

static

void

main(String[]

args)

throws

IOException

{//讀取mybatis配置文件,得到SqlSession對象實例sessionSqlSession

session

=

new

SqlSessionFactoryBuilder().build(Resources.getResourceAsStream("mybatis-config.xml")).openSession();//創(chuàng)建實體類,并給參數(shù)賦值

EmployeeEntity

emp=new

EmployeeEntity();emp.setLevel(1);//執(zhí)行用EmployeeMapper.xml中id為“returnListSelect”的select語句,emp的類型對應EmployeeMapper.xml中的parameterType屬性值Map<Integer,EmployeeEntity>map=session.selectMap("com.chinasofti.chapter030305.mapper.EmployeeMapper.returnListSelect",emp,"id",newRowBounds(2,3));mit();session.close();System.out.println(map);Set<Integer>

set

=

map.keySet();for

(Integer

k

:

set)

{System.out.println(map.get(k));}}第18章JMayvBaEtEisW框eb架開的發(fā)增概刪述改查18.6

selectMap查詢封裝Map返回:運行結(jié)果如圖18.7

select實現(xiàn)ResultHandler接口:通過實現(xiàn)ResultHandler接口得到查詢結(jié)果(無返回值,結(jié)果在ResultHandler接口實現(xiàn)中直接處理)。查詢Employee表中l(wèi)evel等于1且舍棄前兩條數(shù)據(jù)后,取三條數(shù)據(jù),每條數(shù)據(jù)都封裝成實體類,放入List中。(1)創(chuàng)建實體類,這里不再贅述。(2)創(chuàng)建mapper映射文件EmployeeMapper.xml。第18章JMayvBaEtEisW框eb架開的發(fā)增概刪述改查<?xml

version="1.0"

encoding="UTF-8"?><!DOCTYPE

mapper

PUBLIC

"-////DTD

Mapper

3.0//EN""/dtd/mybatis-3-mapper.dtd"><mapper

namespace="com.chinasofti.chapter030306.mapper.EmployeeMapper"><select

id="resultHandlerSelect"parameterType="com.chinasofti.chapter030306.entity.EmployeeEntity"

resultType="com.chinasofti.chapter

030306.entity.EmployeeEntity">select

*

FROM

employee

WHERE

level=#{level}</select></mapper>18.7

select實現(xiàn)ResultHandler接口:第18章JMayvBaEtEisW框eb架開的發(fā)增概刪述改查public

static

void

main(String[]

args)

throws

IOException

{//存放從ResultHandler中獲取的查詢結(jié)果List<EmployeeEntity>

list

=

new

ArrayList<EmployeeEntity>();(3)配置文件mybatis-config.xml(與之前相同)。//讀取mybatis配置文件,得到SqlSession對象實例session(4)調(diào)用void

selectS(qSltSresisnigonssteasstieomne=nnte,w

SOqbljSeescstiopnFaarcatomreytBeuirl,deRro()wBounds

rowBounds,Res

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經(jīng)權益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
  • 6. 下載文件中如有侵權或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論