本文旨在用最通俗的語(yǔ)言講述最枯燥的基本知識(shí)
西湖網(wǎng)站建設(shè)公司創(chuàng)新互聯(lián)公司,西湖網(wǎng)站設(shè)計(jì)制作,有大型網(wǎng)站制作公司豐富經(jīng)驗(yàn)。已為西湖成百上千提供企業(yè)網(wǎng)站建設(shè)服務(wù)。企業(yè)網(wǎng)站搭建\成都外貿(mào)網(wǎng)站制作要多少錢,請(qǐng)找那個(gè)售后服務(wù)好的西湖做網(wǎng)站的公司定做!
當(dāng)項(xiàng)目框架SSH(spring、Struts、Hibernate)日落西山時(shí),SSM(spring、SpringMVC、MyBatis)就大行其道,大部分項(xiàng)目都漸漸轉(zhuǎn)至SSM,因此 MyBatis 也成了Java程序員的必學(xué)知識(shí),本文就mybatis的語(yǔ)法做一次小小的總結(jié),旨在讓讀者用最少的時(shí)間學(xué)會(huì)使用MyBatis。
文章提綱:
什么是MyBatis
MyBatis的引入
MyBatis的配置
MyBatis的SQL語(yǔ)法
運(yùn)行原理和實(shí)操一波
MyBatis的前身是Apache的一個(gè)開源項(xiàng)目ibatis,后來遷移到Google code就改名為MyBatis。
用網(wǎng)上已經(jīng)說爛了的話來說就是:
MyBatis是一款優(yōu)秀的持久層框架,它支持定制化 SQL、存儲(chǔ)過程以及高級(jí)映射。MyBatis 避免了幾乎所有的 JDBC 代碼和手動(dòng)設(shè)置參數(shù)以及獲取結(jié)果集。MyBatis 可以使用簡(jiǎn)單的 XML 或注解來配置和映射原生信息,將接口和 Java 的 POJOs(Plain Ordinary Java Object,普通的 Java對(duì)象)映射成數(shù)據(jù)庫(kù)中的記錄。
如果是傳統(tǒng)的的項(xiàng)目,則直接下載相應(yīng)jar包引入到項(xiàng)目中即可,下載地址為:
1
http://central.maven.org/maven2/org/mybatis/mybatis/3.4.6/mybatis-3.4.6.jar
如果為maven構(gòu)建的項(xiàng)目,則只需要在pom.xml中加入以下依賴然后reimport一下即可:
1
<
dependency
>
2
<
groupId
>
org.mybatis
groupId
>
3
<
artifactId
>
mybatis
artifactId
>
4
<
version
>
x.x.x
version
>
5
dependency
>
如果是gradle構(gòu)建的項(xiàng)目,則只需要在配置中添加以下代碼:
1
// https://mvnrepository.com/artifact/org.mybatis/mybatis
2
compile group: 'org.mybatis', name: 'mybatis', version: '3.4.6'
在引入mybatis之后,接下來需要學(xué)習(xí)的mybatis的配置,雖然現(xiàn)在流行的框架像springboot等已經(jīng)不需要用XML方式進(jìn)行配置,但作為一名新手,我們還是需要學(xué)習(xí)一些關(guān)于mybatis的配置的解釋,這樣有助于我們理解mybatis的原理。
mybatis的基本配置:
1
2
3
PUBLIC "-//mybatis.org//DTD Config 3.0//EN" "http://mybatis.org/dtd/mybatis-3-config.dtd">
4
<
configuration
>
5
6
<
properties
>
7
8
<
property
name
=
"driver"
value
=
"com.MySQL.cj.jdbc.Driver"
>
property
>
9
<
property
name
=
"url"
value
=
"jdbc:mysql://rm-wz9b714vle01fg8ijmo.mysql.rds.aliyuncs.com/change_hair"
>
property
>
10
properties
>
11
12
<
environments
default
=
"development"
>
13
14
<
environment
id
=
"development"
>
15
<
transactionManager
type
=
"JDBC"
/>
16
<
dataSource
type
=
"POOLED"
>
17
<
property
name
=
"driver"
value
=
"${driver}"
/>
18
<
property
name
=
"url"
value
=
"${url}"
/>
19
<
property
name
=
"username"
value
=
"root"
/>
20
<
property
name
=
"password"
value
=
"Blackeye100"
/>
21
dataSource
>
22
environment
>
23
environments
>
24
25
<
mappers
>
26
27
<
mapper
resource
=
"mapper/UserMapper.xml"
/>
28
mappers
>
29
configuration
>
這是一個(gè)標(biāo)準(zhǔn)的mybatis的配置文件,很多情況下,這個(gè)配置已經(jīng)足夠,但是為了在以后的使用有更好的認(rèn)識(shí),下面講解配置文件中configuration標(biāo)簽下的常用子標(biāo)簽:
properties標(biāo)簽:用于定義一些通用屬性,便于配置文件中使用
settings標(biāo)簽:用于設(shè)置一些改變MyBatis運(yùn)行時(shí)行為的配置
environments標(biāo)簽:用于配置成適應(yīng)多種環(huán)境
mappers標(biāo)簽:用于mapper映射器的設(shè)置
下面分別對(duì)每個(gè)標(biāo)簽做簡(jiǎn)單講解:
1.properties標(biāo)簽
當(dāng)我們需要把一些值作為一個(gè)變量被配置中使用時(shí),就可以在properties標(biāo)簽下增加一個(gè)property標(biāo)簽,其中屬性name是指變量名稱,屬性value是值,如:
1
<
properties
>
2
<
property
name
=
"driver"
value
=
"com.mysql.cj.jdbc.Driver"
>
property
>
3
property
>
定義好之后,就可以在配置文件中使用了,如:
1
<
dataSource
type
=
"POOLED"
>
2
<
property
name
=
"driver"
value
=
"${driver}"
/>
3
dataSource
>
2.settings標(biāo)簽
settings標(biāo)簽中的每一個(gè)setting都是用于調(diào)整mybatis的運(yùn)行行為,我們?cè)谛枰褂闷渲心承﹕etting時(shí)加入即可,其常用的配置以及各個(gè)setting的解釋如下:
1
<
settings
>
2
#設(shè)置配置文件中的所有映射器已經(jīng)配置的任何緩存,默認(rèn)false。
3
<
setting
name
=
"cacheEnabled"
value
=
"true"
/>
4
#延遲加載的全局開關(guān)。當(dāng)開啟時(shí),所有關(guān)聯(lián)對(duì)象都會(huì)延遲加載,默認(rèn)為false
5
<
setting
name
=
"lazyLoadingEnabled"
value
=
"true"
/>
6
#是否允許單一語(yǔ)句返回多結(jié)果集,默認(rèn)為true
7
<
setting
name
=
"multipleResultSetsEnabled"
value
=
"true"
/>
8
#是否使用列標(biāo)簽代替列名,默認(rèn)為true
9
<
setting
name
=
"useColumnLabel"
value
=
"true"
/>
10
#是否允許JDBC支持自動(dòng)生成主鍵,默認(rèn)為false
11
<
setting
name
=
"useGeneratedKeys"
value
=
"false"
/>
12
#指定 MyBatis 應(yīng)如何自動(dòng)映射列到字段或?qū)傩?br/>13
<
setting
name
=
"autoMappingBehavior"
value
=
"PARTIAL"
/>
14
#指定發(fā)現(xiàn)自動(dòng)映射目標(biāo)未知列(或者未知屬性類型)的行為,默認(rèn)NONE
15
#NONE: 不做任何反應(yīng)
16
#WARNING: 輸出提醒日志
17
#FAILING: 映射失敗 (拋出 SqlSessionException)
18
<
setting
name
=
"autoMappingUnknownColumnBehavior"
value
=
"WARNING"
/>
19
#配置默認(rèn)的執(zhí)行器。默認(rèn)為SIMPLE
20
#SIMPLE 就是普通的執(zhí)行器;
21
#REUSE 執(zhí)行器會(huì)重用預(yù)處理語(yǔ)句;
22
#BATCH 執(zhí)行器將重用語(yǔ)句并執(zhí)行批量更新
23
<
setting
name
=
"defaultExecutorType"
value
=
"SIMPLE"
/>
24
#設(shè)置超時(shí)時(shí)間,它決定驅(qū)動(dòng)等待數(shù)據(jù)庫(kù)響應(yīng)的秒數(shù)。
25
<
setting
name
=
"defaultStatementTimeout"
value
=
"25"
/>
26
#為驅(qū)動(dòng)的結(jié)果集獲取數(shù)量(fetchSize)設(shè)置一個(gè)提示值
27
<
setting
name
=
"defaultFetchSize"
value
=
"100"
/>
28
#是否允許在嵌套語(yǔ)句中使用分頁(yè)。如果允許使用則設(shè)置為false。
29
<
setting
name
=
"safeRowBoundsEnabled"
value
=
"false"
/>
30
#是否開啟自動(dòng)駝峰命名規(guī)則(camel case)映射,默認(rèn)為false
31
<
setting
name
=
"mapUnderscoreToCamelCase"
value
=
"false"
/>
32
settings
>
3. environments
environments是為了配置多環(huán)境數(shù)據(jù)源而生,在我們定義好了各種環(huán)境之后,只需要在代碼中設(shè)置從哪個(gè)環(huán)境中加載數(shù)據(jù)源即可,或者修改environments標(biāo)簽中的default也可以達(dá)到切換環(huán)境的效果。
environments的基本配置如下:
1
<
environments
default
=
"development"
>
2
#定義一個(gè)名稱為development的環(huán)境配置
3
<
environment
id
=
"development"
>
4
#設(shè)置事務(wù)管理器的類型,有JDBC和MANAGED梁總
5
<
transactionManager
type
=
"JDBC"
>
6
<
property
name
=
"..."
value
=
"..."
/>
7
transactionManager
>
8
#數(shù)據(jù)源設(shè)置
9
<
dataSource
type
=
"POOLED"
>
10
<
property
name
=
"driver"
value
=
"${driver}"
/>
11
<
property
name
=
"url"
value
=
"${url}"
/>
12
<
property
name
=
"username"
value
=
"${username}"
/>
13
<
property
name
=
"password"
value
=
"${password}"
/>
14
dataSource
>
15
environment
>
16
environments
>
當(dāng)我們需要增加一個(gè)環(huán)境配置時(shí),只需要復(fù)制粘貼一份environment,修改其中屬性的值即可。
4.mappers
mappers標(biāo)簽實(shí)際上是用于高速mybatis從哪找到我們寫好的SQL語(yǔ)句,也就是映射文件。當(dāng)我們寫好一個(gè)表對(duì)應(yīng)的mapper.xml時(shí),我們只需要在mappers下增加一個(gè)mapper即可。
mappers查找mapper的方式有多種:
這些mapper.xml在resources中的某個(gè)文件夾xxx中,則用resource屬性設(shè)置
1
<
mappers
>
2
<
mapper
resource
=
"xxx/AMapper.xml"
/>
3
<
mapper
resource
=
"xxx/BMapper.xml"
/>
4
mappers
>
當(dāng)我們?cè)谶@些mapper.xml設(shè)置好了namespace之后,我們可以通過映射器接口實(shí)現(xiàn)類的全路徑類來設(shè)置,如在AMapper.xml設(shè)置namespace為com.xxx.dao.AMapper類之后,我們?cè)谶@里可以使用class屬性指定查找的mapper,但前提是:
AMapper.xml和AMapper.java必須在同一個(gè)包下。
1
<
mappers
>
2
<
mapper
class
=
"com.xxx.dao.AMapper"
/>
3
<
mapper
class
=
"com.xxx.dao.BMapper"
/>
4
mappers
>
有人會(huì)說,如果我們表有很多,這樣一行一行的寫不是很費(fèi)勁嗎,mybatis為了便于使用,提供了package的方式引入映射器,但前提
所有的mapper.xml和mapper.java必須在同一個(gè)包下。
1
<
mappers
>
2
<
package
name
=
"org.xxx.dao"
/>
3
mappers
>
如果你的mapper不在項(xiàng)目中,而是放到了其他文件內(nèi),mybatis提供了通過URL的方式引入mapper.xml。
1
<
mappers
>
2
<
mapper
url
=
"C:///test/mappers/AMapper.xml"
/>
3
<
mapper
url
=
"C:///test/mappers/BMapper.xml"
/>
4
mappers
>
在現(xiàn)有的框架下編寫代碼,多數(shù)情況下都不需要理會(huì)mybatis底層的東西,而大量的工作都集中在編寫mapper文件上。因此學(xué)會(huì)在mybatis下編寫SQL語(yǔ)句是非常有必要的,我們首先來看一個(gè)標(biāo)準(zhǔn)的mapper文件的格式:
1
2
3
<
mapper
namespace
=
"com.xxx.dao.XxxMapper"
>
4
mapper
>
可以看出,一個(gè)mapper文件的根結(jié)構(gòu)是mapper標(biāo)簽開始,而mapper標(biāo)簽中的namespace有什么用呢?他應(yīng)該怎么寫?
我們知道,有一種編程思想叫做面向接口編程,就是把業(yè)務(wù)需求中具體邏輯實(shí)現(xiàn)和接口分開,對(duì)外只暴露接口,通過接口實(shí)現(xiàn)業(yè)務(wù)。而在業(yè)務(wù)需求變化時(shí),僅需要修改實(shí)現(xiàn)類,而不需要變動(dòng)現(xiàn)有的對(duì)接代碼,降低對(duì)系統(tǒng)的影響。
而mybatis正是基于這樣的思想,在namespace中指定該mapper對(duì)應(yīng)的接口之后,不需要編寫接口實(shí)現(xiàn)類,mybatis會(huì)通過該綁定自動(dòng)幫你找到對(duì)應(yīng)要執(zhí)行的SQL語(yǔ)句。
如:在com.xxx.dao中創(chuàng)建一個(gè)XxxMapper.java的接口,需要編寫一根據(jù)用戶查詢用戶信息的方法。
1
package
com.xxx.dao;
2
public
interface
XxxMapper
{
3
//根據(jù)姓名查詢一條用戶信息
4
Map
selectUserByName
(@Param(
"name"
)
String name)
;
5
}
此時(shí)我們就可以在mapper.xml中設(shè)置namespace對(duì)應(yīng)到上面的接口來:
1
2
3
<
mapper
namespace
=
"com.xxx.dao.XxxMapper"
>
4
<
select
id
=
"selectUserByName"
parameterType
=
"String"
resultType
=
"hashmap"
>
5
select * from user where name = #{name}
6
select
>
7
mapper
>
而在具體的業(yè)務(wù)實(shí)現(xiàn)類中,則是這樣使用的:
1
@Service
2
public
class
XxxServiceImpl
implements
CustomerInfoService
{
3
@Resource
4
private
XxxMapper xxxMapper=
null
;
5
@Override
6
public
Map
getUser
(String name)
{
7
return
xxxMapper.selectUserByName(name);
8
}
9
}
可以看出,從編寫SQL語(yǔ)句到最終業(yè)務(wù)調(diào)用SQL語(yǔ)句的過程中,我們并沒有給XxxMapper接口編寫任何的實(shí)現(xiàn)類,這就是基于接口編程的思想,mybatis已經(jīng)把這些事情都處理好了,我們只需要在namespace中把SQL映射文件和接口類對(duì)應(yīng)起來,就可以使用了。
知道根節(jié)點(diǎn)mapper怎么設(shè)置之后,接下來我們需要學(xué)習(xí)如何在mapper節(jié)點(diǎn)里編寫SQL語(yǔ)句,在mapper標(biāo)簽后,mybatis提供了很多語(yǔ)義化的標(biāo)簽以便于我們編寫SQL語(yǔ)句和配置映射文件,下面是幾個(gè)非常常用子標(biāo)簽:
1. select:用于編寫查詢語(yǔ)句的標(biāo)簽
2. update:用于編寫update語(yǔ)句的標(biāo)簽
3. insert:用于編寫insert語(yǔ)句的標(biāo)簽
4. delete:用于編寫delete語(yǔ)句的標(biāo)簽
5. sql:編寫語(yǔ)句塊的標(biāo)簽,可被其它語(yǔ)句引用
6. resultMap:定義數(shù)據(jù)庫(kù)結(jié)果和實(shí)體屬性的映射關(guān)系
這些標(biāo)簽都是我們?cè)诰帉慡QL語(yǔ)句中的必備標(biāo)簽,下面一一描述他們的使用。
1. select標(biāo)簽
在一個(gè)項(xiàng)目中,大部分功能都涉及到查詢,因此mybatis也為select元素配備了非常多的屬性,一下僅列出最常用的幾個(gè)屬性以及作用解釋:
1
<
select
2
#必填,唯一標(biāo)識(shí)符,和
mapper
接口中的方法一一對(duì)應(yīng)
3
id
=
"selectUser"
4
#選填,默認(rèn)值為
unset
,用于傳入?yún)?shù)的類型設(shè)置
5
parameterType
=
"String"
6
#選填,語(yǔ)句查詢結(jié)果返回的期望類型,
resultType
和
resultMap
不能同時(shí)使用
7
resultType
=
"HashMap"
8
#選填,語(yǔ)句查詢結(jié)果返回的數(shù)據(jù)集,可以對(duì)應(yīng)實(shí)體類和和
resultMap
定義的
ID
。
9
resultMap
=
"com.xxx.entity.User"
10
#是否清除緩存,為
true
時(shí)本地緩存和二級(jí)緩存都會(huì)被清除
11
flushCache
=
"false"
12
#是否啟用緩存,為
true
時(shí)查詢結(jié)果會(huì)被放入二級(jí)緩存
13
useCache
=
"true"
>
14
15
#SQL語(yǔ)句編寫....
16
17
select
>
2. update標(biāo)簽
1
<
update
2
#必填,唯一標(biāo)識(shí)符,和
mapper
接口中的方法一一對(duì)應(yīng)
3
id
=
"updateUser"
4
#選填,默認(rèn)值為
unset
,用于傳入?yún)?shù)的類型設(shè)置
5
parameterType
=
"com.xxx.entity.User"
6
#是否清除緩存,為
true
時(shí)本地緩存和二級(jí)緩存都會(huì)被清除
7
flushCache
=
"true"
>
8
9
#編寫update的SQL語(yǔ)句...
10
11
update
>
3. insert標(biāo)簽
1
<
insert
2
#必填,唯一標(biāo)識(shí)符,和
mapper
接口中的方法一一對(duì)應(yīng)
3
id
=
"updateUser"
4
#選填,默認(rèn)值為
unset
,用于傳入?yún)?shù)的類型設(shè)置
5
parameterType
=
"com.xxx.entity.User"
6
#是否清除緩存,為
true
時(shí)本地緩存和二級(jí)緩存都會(huì)被清除
7
flushCache
=
"true"
8
#是否取出由數(shù)據(jù)庫(kù)內(nèi)部生成的主鍵,默認(rèn)為
false
9
useGeneratedKeys
=
"false"
10
#選填,設(shè)置了之后,會(huì)通過
getGeneratedKeys
的返回值或者通過
insert
語(yǔ)句的
selectKey
子元素設(shè)置它的鍵值。
11
keyProperty
=
"id"
12
>
13
14
#編寫insert的SQL語(yǔ)句...
15
16
insert
>
4. delete標(biāo)簽
1
<
delete
2
#必填,唯一標(biāo)識(shí)符,和
mapper
接口中的方法一一對(duì)應(yīng)
3
id
=
"updateUser"
4
#選填,默認(rèn)值為
unset
,用于傳入?yún)?shù)的類型設(shè)置
5
parameterType
=
"com.xxx.entity.User"
6
#是否清除緩存,為
true
時(shí)本地緩存和二級(jí)緩存都會(huì)被清除
7
flushCache
=
"true"
>
8
9
#編寫delete的SQL語(yǔ)句...
10
11
delete
>
5. sql標(biāo)簽
SQL節(jié)點(diǎn)用來編寫那些可以被重用的SQL代碼段,當(dāng)我們用SQL編寫好一個(gè)代碼段之后,就可以在其他語(yǔ)句使用。
我們都知道,在寫滿了SQL之后,如果要修改表名,是一件很痛苦的事情,因?yàn)楸砻紝懙搅薙QL語(yǔ)句中了,但是在mybatis中,我們可以利用sql標(biāo)簽來定義好表名,如果在所有的SQL中引入這個(gè)代碼塊即可:
1
<
sql
id
=
"TABLE_NAME"
>
user
sql
>
2
3
#在語(yǔ)句中用include的方式把表名動(dòng)態(tài)化
4
<
select
id
=
"selectUserByName"
>
5
select * from
6
<
include
refid
=
"TABLE_NAME"
/>
7
where name = #{name}
8
select
>
類似的用法還有非常多,比如把查詢字段一致的可以用sql塊統(tǒng)一定義,然后在需要的地方調(diào)用…需要我們?cè)趯?shí)際使用過程,靈活運(yùn)用這些標(biāo)簽來減輕SQL的代碼量和降低復(fù)雜度。
6. resultMap標(biāo)簽
resultMap標(biāo)簽用于表示數(shù)據(jù)庫(kù)查詢結(jié)果和實(shí)體對(duì)象的映射關(guān)系,它是映射文件中中所復(fù)雜的一個(gè)標(biāo)簽,常用的屬性有兩個(gè):
1
<
resultMap
2
#定義這個(gè)
resultMap
的唯一標(biāo)識(shí)
3
id
=
"XXXResult"
4
#返回值的全限定類名,或類型別名
5
type
=
"com.xxx.entity.User"
>
6
7
#子節(jié)點(diǎn)....
8
9
resultMap
>
而它的子節(jié)點(diǎn)則就非常多了:
1
<
resultMap
id
=
"XXXResult"
type
=
"java.util.HashMap"
>
2
#constructor:類在實(shí)例化時(shí),用來注入結(jié)果到構(gòu)造方法中
3
<
constructor
>
4
#idArg:ID參數(shù);標(biāo)記結(jié)果作為ID可以幫助提高整體效能
5
<
idArg
/>
6
#arg:注入到構(gòu)造方法的一個(gè)普通結(jié)果
7
<
arg
/>
8
constructor
>
9
#一個(gè) ID 結(jié)果;標(biāo)記出作為 ID 的結(jié)果可以幫助提高整體性能
10
<
id
/>
11
#注入到字段或 JavaBean 屬性的普通結(jié)果
12
<
result
/>
13
#一個(gè)復(fù)雜類型的關(guān)聯(lián);許多結(jié)果將包裝成這種類型
14
<
association
property
=
""
/>
15
#一個(gè)復(fù)雜類型的集合
16
<
collection
property
=
""
/>
17
# 使用結(jié)果值來決定使用哪個(gè) resultMap
18
<
discriminator
javaType
=
""
>
19
#基于某些值的結(jié)果映射
20
<
case
value
=
""
>
case
>
21
discriminator
>
!
22
resultMap
>
如查詢要把查詢結(jié)果的字段用駝峰的寫法映射,可以定義一個(gè)resultMap,吧對(duì)象和實(shí)體屬性一一對(duì)應(yīng)起來:
1
<
resultMap
id
=
"UserResultMap"
type
=
"java.util.HashMap"
>
2
<
id
column
=
"id"
property
=
"id"
/>
3
<
result
column
=
"nick_name"
property
=
"nickName"
/>
4
<
result
column
=
"gmt_created"
property
=
"gmtCreated"
/>
5
<
result
column
=
"gmt_modified"
property
=
"gmtModified"
/>
6
resultMap
>
在SQL用就可以直接使用這個(gè)resultMap作為返回類型:
1
<
select
id
=
"selectUserByName"
resultMap
=
"UserResultMap"
>
2
select id,nick_name,gmt_created,gmt_modified from user where name =#{name}
3
select
>
上面的例子只用到resultMap中最常用的兩個(gè)子標(biāo)簽:
看完一波語(yǔ)法之后,腦子處于似懂非懂的狀態(tài),好像都是在講配置文件和mapper的使用。當(dāng)我們學(xué)會(huì)了編寫這些mapper之后,究竟應(yīng)該怎么使用它?
到這里我們就不得不提一下mybatis的運(yùn)行過程了,先了解幾個(gè)mybatis提供的接口/類:
SqlSessionFactoryBuilder : SqlSessionFactory的構(gòu)造器,用于創(chuàng)建SqlSessionFactory,采用了Builder設(shè)計(jì)模式。
SqlSessionFactory:SqlSession工廠類,以工廠形式創(chuàng)建SqlSession對(duì)象,采用了Factory工廠設(shè)計(jì)模式。
SqlSession:執(zhí)行SQL的接口
由于mybatis的運(yùn)行原理非常復(fù)雜,遠(yuǎn)遠(yuǎn)不是30分鐘能掌握的,因此在此只是概括為最大的四個(gè)過程:
加載配置創(chuàng)建SqlSessionFacotry
通過sqlSessionFactory獲取SqlSession
SqlSession查找和轉(zhuǎn)化Mapper
SqlSession執(zhí)行mapper中的SQL語(yǔ)句
知道了運(yùn)行流程之后,我們就可以實(shí)操一波了,雖然主流的開發(fā)框架都已經(jīng)看不見這些東西了,但作者還是決定拋棄一切框架,只用maven構(gòu)建一個(gè)空白項(xiàng)目進(jìn)行實(shí)操:
在idea上創(chuàng)建一個(gè)maven項(xiàng)目,并且在pom中引入mybatis和mysql依賴
這個(gè)簡(jiǎn)單,不多描述。
其中pom中的依賴為:
1
<
dependencies
>
2
<
dependency
>
3
<
groupId
>
org.mybatis
groupId
>
4
<
artifactId
>
mybatis
artifactId
>
5
<
version
>
3.2.7
version
>
6
dependency
>
7
<
dependency
>
8
<
groupId
>
mysql
groupId
>
9
<
artifactId
>
mysql-connector-java
artifactId
>
10
<
version
>
6.0.6
version
>
11
dependency
>
12
dependencies
>
在resources中創(chuàng)建一個(gè)名為mybatis-config.xml的配置文件,內(nèi)容為:
1
2
3
PUBLIC "-//mybatis.org//DTD Config 3.0//EN" "http://mybatis.org/dtd/mybatis-3-config.dtd">
4
<
configuration
>
5
6
<
properties
>
7
8
<
property
name
=
"driver"
value
=
"com.mysql.cj.jdbc.Driver"
>
property
>
9
<
property
name
=
"url"
value
=
"jdbc:mysql://10.9.0.111/test"
>
property
>
10
properties
>
11
12
<
environments
default
=
"development"
>
13
14
<
environment
id
=
"development"
>
15
<
transactionManager
type
=
"JDBC"
/>
16
<
dataSource
type
=
"POOLED"
>
17
<
property
name
=
"driver"
value
=
"${driver}"
/>
18
<
property
name
=
"url"
value
=
"${url}"
/>
19
<
property
name
=
"username"
value
=
"root"
/>
20
<
property
name
=
"password"
value
=
"test100"
/>
21
dataSource
>
22
environment
>
23
environments
>
24
25
<
mappers
>
26
27
<
mapper
resource
=
"mapper/UserMapper.xml"
/>
28
mappers
>
29
configuration
>
創(chuàng)建表結(jié)構(gòu):
1
DROP
TABLE
IF
EXISTS
`user`
;
2
CREATE
TABLE
`user`
(
3
`id`
int
(
11
)
NOT
NULL
AUTO_INCREMENT,
4
`name`
varchar
(
255
)
DEFAULT
NULL
,
5
`gmt_created`
varchar
(
255
)
DEFAULT
NULL
,
6
`gmt_modified`
varchar
(
255
)
DEFAULT
NULL
,
7
PRIMARY
KEY
(
`id`
)
8
)
ENGINE
=
InnoDB
AUTO_INCREMENT=
2
DEFAULT
CHARSET
=utf8mb4;
9
-- 插入一條數(shù)
10
INSERT
INTO
`user`
VALUES
(
'1'
,
'hello mybatis'
,
null
,
null
);
在java下創(chuàng)建User.java的實(shí)體類(注意:為了簡(jiǎn)化代碼,getter和serter已經(jīng)去掉,實(shí)操時(shí)自行補(bǔ)上):
1
public
class
User
{
2
private
Integer id;
3
private
String name;
4
private
String gmtCreated;
5
private
String gmtModified;
6
//getter 和 setter...
7
}
在java下創(chuàng)建UserMapper.java的映射類:
1
public
interface
UserMapper
{
2
User
getUserByName
(@Param(
"name"
)
String name)
;
3
}
在resources下創(chuàng)建mapper文件夾,在mapper下創(chuàng)建UserMapper的xml文件:
1
2
3
<
mapper
namespace
=
"UserMapper"
>
4
<
select
id
=
"getUserByName"
resultType
=
"User"
>
5
select * from user where name =#{name}
6
select
>
7
mapper
>
啟動(dòng)mybatis執(zhí)行SQL
根據(jù)上面的運(yùn)行流程,就可以編寫一個(gè)測(cè)試類:
1
public
static
void
main
(String args[])
{
2
try
{
3
String resource =
"mybatis-config.xml"
;
4
// 1. 獲取配置文件的輸入流
5
InputStream inputStream = Resources.getResourceAsStream(resource);
6
// 2. 讀取配置文件并用SqlSessionFactoryBuilder創(chuàng)建一個(gè)SqlSessionFactory
7
SqlSessionFactory sqlSessionFactory =
new
SqlSessionFactoryBuilder().build(inputStream);
8
// 3. 從SqlSessionFactory中獲取一個(gè)SqlSession
9
SqlSession s= sqlSessionFactory.openSession();
10
// 4. 查找映射SQL文件
11
UserMapper mapper=s.getMapper(UserMapper.class);
12
// 5.執(zhí)行CURD操作
13
User user=mapper.getUserByName(
"hello mybatis"
);
14
15
if
(user!=
null
){
16
System.out.print(
"查詢成功,我的名次是:"
+user.getName());
17
}
18
19
}
catch
(Exception e){
20
e.printStackTrace();
21
}
22
}
查看輸出:
1
查詢成功,我的名次是:hello mybatis
大功告成!有興趣的讀者可以根據(jù)上面的過程,編寫屬于自己的原生態(tài)mybatis的測(cè)試項(xiàng)目,如果有問題或者需要源碼請(qǐng)關(guān)注公眾號(hào)留言或加微信:sisi-ceo,我們一起來征服寫代碼這做大山~