MyBatis 入门到精通(二) SQL语句映射XML文件
MyBatis 真正強(qiáng)大之處就在這些映射語句,也就是它的魔力所在。對于它的強(qiáng)大功能,SQL 映射文件的配置卻非常簡單。
如果您比較SQL 映射文件配置與JDBC 代碼,您很快可以發(fā)現(xiàn),使用SQL 映射文件配置可以節(jié)省95%的代碼量。MyBatis 被創(chuàng)建來專注于SQL,但又給您自己的實(shí)現(xiàn)極大的空間。
?
需要配置的基本元素
1. cache – 配置給定模式的緩存
2. cache-ref – 從別的模式中引用一個(gè)緩存
3. resultMap – 這是最復(fù)雜而卻強(qiáng)大的一個(gè)元素了,它描述如何從結(jié)果集中加載對象
4. sql – 一個(gè)可以被其他語句復(fù)用的SQL 塊
5. insert – 映射INSERT 語句
6. update – 映射UPDATE 語句
7. delete – 映射DELEETE 語句
8. select - 映射SELECT語句
?
?
配置注意
SQL 映射XML 文件只有一些基本的元素需要配置,并且要按照下面的順序來定義 寫好SQL語句映射文件后,需要在MyBAtis主配置文件mappers標(biāo)簽中引用! 例如: [html]?view plaincopy?
當(dāng)Java接口與XML文件在一個(gè)相對路徑下時(shí),可以不在myBatis配置文件的mappers中聲明。
?
?
?
SQL?
這個(gè)元素可以被用來定義可重用的SQL代碼段,可以包含在其他語句中。?
例子請看下面select中例子
?
?
SELECT
mybatis select是mybatis 中最常用的元素之一。 對簡單的查詢,select 元素的配置是相當(dāng)簡單的: [html]?view plaincopy?這個(gè)語句被稱作selectBlog_as_map,使用一個(gè)int (或Integer)類型的參數(shù),并返回一個(gè)HashMap類型的對象
?
#{id}告訴mybatis創(chuàng)建了一個(gè)PreparedStatement(預(yù)處理語句)參數(shù)。
在JDBC中,類似的代碼如下:
?
[java]?view plaincopy?
| id | 在這個(gè)模式下唯一的標(biāo)識(shí)符,可被其它語句引用 | ? | ? |
| parameterType | 傳給此語句的參數(shù)的完整類名或別名 | ? | ? |
| resultType | 語句返回值類型的整類名或別名。注意,如果是集合, 那么這里填寫的是集合的項(xiàng)的整類名或別名,而不是集合本身的類名。 (resultType 與resultMap 不能并用) | ? | ? |
| resultMap | 引用的外部resultMap 名。結(jié)果集映射是MyBatis 中最強(qiáng)大的特性。 許多復(fù)雜的映射都可以輕松解決。(resultType 與resultMap 不能并用) | ? | ? |
| flushCache | 如果設(shè)為true,則會(huì)在每次語句調(diào)用的時(shí)候就會(huì)清空緩存。select 語句默認(rèn)設(shè)為false | true|false | false |
| useCache | 如果設(shè)為true,則語句的結(jié)果集將被緩存。select 語句默認(rèn)設(shè)為false true|false false timeout 設(shè)置驅(qū)動(dòng)器在拋出異常前等待回應(yīng)的最長時(shí)間,默認(rèn)為不設(shè)值,由驅(qū)動(dòng)器自己決定 | true|false | false |
| timeout | 設(shè)置驅(qū)動(dòng)器在拋出異常前等待回應(yīng)的最長時(shí)間,默認(rèn)為不設(shè)值,由驅(qū)動(dòng)器自己決定 | 正整數(shù) | 未設(shè)置 |
| fetchSize | 設(shè)置一個(gè)值后,驅(qū)動(dòng)器會(huì)在結(jié)果集數(shù)目達(dá)到此數(shù)值后, 激發(fā)返回,默認(rèn)為不設(shè)值,由驅(qū)動(dòng)器自己決定 | 正整數(shù) | 驅(qū)動(dòng)器決定 |
| statementType | statement,preparedstatement,callablestatement。 預(yù)準(zhǔn)備語句、可調(diào)用語句 | STATEMENT PREPARED CALLABLE | PREPARED |
| resultSetType | forward_only,scroll_sensitive,scroll_insensitive 只轉(zhuǎn)發(fā),滾動(dòng)敏感,不區(qū)分大小寫的滾動(dòng) | FORWARD_ONLY SCROLL_SENSITIVE SCROLL_INSENSITIVE | 驅(qū)動(dòng)器決定 |
?
INSERT
簡單的insert語句: [html]?view plaincopy對于insert如果你的數(shù)據(jù)庫支持自動(dòng)生成主鍵的字段(比如 MySQL 和 SQL Server),那么你可以設(shè)置 useGeneratedKeys=”true”,然后把keyProperty 設(shè)成對應(yīng)的列,就搞定了。
例如Blog表已經(jīng)對 id 使用了自動(dòng)生成的列類型,那么語句如下:
?
[html]?view plaincopy
還可以使用selectKey元素。下面例子,使用mysql數(shù)據(jù)庫nextval('student')為自定義函數(shù),用來生成一個(gè)key。
?
例如:
?
[html]?view plaincopy
?
insert語句屬性配置細(xì)節(jié):
| 屬性 | 描述 | 取值 | 默認(rèn) |
| id | 在這個(gè)模式下唯一的標(biāo)識(shí)符,可被其它語句引用 | ? | ? |
| parameterType | 傳給此語句的參數(shù)的完整類名或別名 | ? | ? |
| flushCache | 如果設(shè)為true,則會(huì)在每次語句調(diào)用的時(shí)候就會(huì)清空緩存。select 語句默認(rèn)設(shè)為false | true|false | false |
| useCache | 如果設(shè)為true,則語句的結(jié)果集將被緩存。select 語句默認(rèn)設(shè)為false true|false false timeout 設(shè)置驅(qū)動(dòng)器在拋出異常前等待回應(yīng)的最長時(shí)間,默認(rèn)為不設(shè)值,由驅(qū)動(dòng)器自己決定 | true|false | false |
| timeout | 設(shè)置驅(qū)動(dòng)器在拋出異常前等待回應(yīng)的最長時(shí)間,默認(rèn)為不設(shè)值,由驅(qū)動(dòng)器自己決定 | 正整數(shù) | 未設(shè)置 |
| fetchSize | 設(shè)置一個(gè)值后,驅(qū)動(dòng)器會(huì)在結(jié)果集數(shù)目達(dá)到此數(shù)值后,激發(fā)返回,默認(rèn)為不設(shè)值,由驅(qū)動(dòng)器自己決定 | 正整數(shù) | 驅(qū)動(dòng)器決定 |
| statementType | statement,preparedstatement,callablestatement。 預(yù)準(zhǔn)備語句、可調(diào)用語句 | STATEMENT PREPARED CALLABLE | PREPARED |
| useGeneratedKeys | 告訴MyBatis 使用JDBC 的getGeneratedKeys 方法來獲取數(shù)據(jù)庫自己生成的主鍵(MySQL、SQLSERVER 等 關(guān)系型數(shù)據(jù)庫會(huì)有自動(dòng)生成的字段)。默認(rèn):false | true|false | false |
| keyProperty | 標(biāo)識(shí)一個(gè)將要被MyBatis 設(shè)置進(jìn)getGeneratedKeys 的key 所返回的值,或者為insert 語句使用一個(gè)selectKey 子元素。 | ? | ? |
?
?
selectKey語句屬性配置細(xì)節(jié):
?
| 屬性 | 描述 | 取值 |
| keyProperty | selectKey 語句生成結(jié)果需要設(shè)置的屬性。 | ? |
| resultType | 生成結(jié)果類型,MyBatis 允許使用基本的數(shù)據(jù)類型,包括String 、int類型。 | ? |
| order | 可以設(shè)成BEFORE 或者AFTER,如果設(shè)為BEFORE,那它會(huì)先選擇主鍵, 然后設(shè)置keyProperty,再執(zhí)行insert語句;如果設(shè)為AFTER,它就先運(yùn)行insert 語句再運(yùn)行selectKey 語句, 通常是insert 語句中內(nèi)部調(diào)用數(shù)據(jù)庫(像Oracle)內(nèi)嵌的序列機(jī)制。 | BEFORE AFTER |
| statementType | 像上面的那樣, MyBatis 支持STATEMENT,PREPARED和CALLABLE 的語句形式, ?對應(yīng)Statement ,PreparedStatement 和CallableStatement 響應(yīng) | STATEMENT PREPARED CALLABLE |
?
UPDATE,DELETE
update 簡單例子: [html]?view plaincopydelete 簡單例子: [html]?view plaincopy
update、delete語句屬性配置細(xì)節(jié):
?
| 屬性 | 描述 | 取值 | 默認(rèn) |
| id | 在這個(gè)模式下唯一的標(biāo)識(shí)符,可被其它語句引用 | ? | ? |
| parameterType | 傳給此語句的參數(shù)的完整類名或別名 | ? | ? |
| flushCache | 如果設(shè)為true,則會(huì)在每次語句調(diào)用的時(shí)候就會(huì)清空緩存。select 語句默認(rèn)設(shè)為false | true|false | false |
| useCache | 如果設(shè)為true,則語句的結(jié)果集將被緩存。select 語句默認(rèn)設(shè)為false true|false false timeout 設(shè)置驅(qū)動(dòng)器在拋出異常前等待回應(yīng)的最長時(shí)間,默認(rèn)為不設(shè)值,由驅(qū)動(dòng)器自己決定 | true|false | false |
| timeout | 設(shè)置驅(qū)動(dòng)器在拋出異常前等待回應(yīng)的最長時(shí)間,默認(rèn)為不設(shè)值,由驅(qū)動(dòng)器自己決定 | 正整數(shù) | 未設(shè)置 |
| fetchSize | 設(shè)置一個(gè)值后,驅(qū)動(dòng)器會(huì)在結(jié)果集數(shù)目達(dá)到此數(shù)值后,激發(fā)返回,默認(rèn)為不設(shè)值,由驅(qū)動(dòng)器自己決定 | 正整數(shù) | 驅(qū)動(dòng)器決定 |
| statementType | statement,preparedstatement,callablestatement。 預(yù)準(zhǔn)備語句、可調(diào)用語句 | STATEMENT PREPARED CALLABLE | PREPARED |
Parameters
這個(gè)元素說的直白點(diǎn)就是定義參數(shù)。注意一個(gè)語句中只能有一個(gè)參數(shù)。 所以參數(shù)類型在以后的使用中,可能需要復(fù)雜的類型,比如hashmap,一個(gè)復(fù)雜的對象等。例如: [html]?view plaincopy如果blog類型的參數(shù)對象傳遞到了語句中,id、title和author屬性將會(huì)被查找,然后它們的值就被傳遞到預(yù)處理語句的參數(shù)中。 這點(diǎn)對于傳遞參數(shù)到語句中非常好。但是對于參數(shù)映射也有一些其他的特性。
首先,像MyBatis的其他部分,參數(shù)可以指定一個(gè)確定的數(shù)據(jù)類型。 [html]?view plaincopy
注意:如果null被當(dāng)作值來傳遞,對于所有可能為空的列,JDBC Type是需要的。也可以通過閱讀PreparedStatement. setNull()方法的JavaDocs文檔來研究它。
為了以后自定義類型處理器,你可以指定一個(gè)確定的類型處理器類(或別名),比如: [html]?view plaincopy
對于數(shù)值類型,對于決定有多少數(shù)字是相關(guān)的,有一個(gè)數(shù)值范圍。 [html]?view plaincopy
默認(rèn)情況下,使用#{}格式的語法會(huì)導(dǎo)致MyBatis創(chuàng)建預(yù)處理語句屬性并以它為背景設(shè)置安全的值(比如?)。這樣做很安全,很迅速,也是首選的做法,有時(shí)你只是想直接在SQL語句中插入一個(gè)不改變的字符串。比如,像ORDER BY,你可以這樣來使用:
ORDER BY ${columnName}
這里MyBatis不會(huì)修改或轉(zhuǎn)義字符串。
重要:接受從用戶輸出的內(nèi)容并提供給語句中不變的字符串,這樣做是不安全的。這會(huì)導(dǎo)致潛在的SQL注入攻擊,因此你不應(yīng)該允許用戶輸入這些字段,或者通常自行轉(zhuǎn)義并檢查。
resultMap
resultMap 元素是MyBatis中最重要最強(qiáng)大的元素。它就是讓你遠(yuǎn)離90%的需要從結(jié)果集中取出數(shù)據(jù)的JDBC代碼的那東西,而且在一些情形下允許你做一些JDBC不支持的事情。事實(shí)上,編寫相似于對復(fù)雜語句聯(lián)合映射這些等同的代碼,也許可以跨過上千行的代碼。ResultMap的設(shè)計(jì)就是簡單語句不需要明確的結(jié)果映射,而很多復(fù)雜語句確實(shí)需要描述它們的關(guān)系。 [java]?view plaincopy基于JavaBean的規(guī)范,上面這個(gè)類有3個(gè)屬性:id,title和authorId。這些在select語句中會(huì)精確匹配到列名。
這樣的一個(gè)JavaBean可以被映射到結(jié)果集,就像映射到HashMap一樣簡單。 [html]?view plaincopy
這些情況下,MyBatis會(huì)在幕后自動(dòng)創(chuàng)建一個(gè)ResultMap,基于屬性名來映射列到JavaBean的屬性上。如果列名沒有精確匹配,你可以在列名上使用select字句的別名(一個(gè)標(biāo)準(zhǔn)的SQL特性)來匹配標(biāo)簽。
ResultMap最優(yōu)秀的地方你已經(jīng)了解了很多了,但是你還沒有真正的看到一個(gè)。只是出于示例的原因,讓我們來看看最后一個(gè)示例中外部的resultMap是什么樣子的,這也是解決列名不匹配的另外一種方式。 [html]?view plaincopy
引用它的語句使用resultMap屬性就行了(注意我們?nèi)サ袅藃esultType屬性)。比如: [html]?view plaincopy
轉(zhuǎn)載于:https://www.cnblogs.com/duanxz/p/4742168.html
總結(jié)
以上是生活随笔為你收集整理的MyBatis 入门到精通(二) SQL语句映射XML文件的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 心灵杀手2卡勒瓦拉骑士护身符怎么获得?
- 下一篇: C# char[]与string之间的相