ORM大概的意思就是「對象關聯映射」,Hibernate徹底能夠經過對象關係模型實現對數據庫的操做,擁有完整的JavaBean對象與數據庫的映射結構來自動生成sql。spring
而Mybatis僅有基本的字段映射,對象數據以及對象實際關係任然須要經過手動編寫sql來實現和管理。sql
Hibernate經過它強大的映射結構和hql語言,大大下降了對象與數據庫的耦合性,因爲Mybatis須要手動編寫sql語句,就致使它的移植性比較差。數據庫
hibernate日誌系統很是健全,涉及普遍,包括:sql記錄、關係異常、優化警告、緩存提示、髒數據警告等;數組
而mybatis則除了基本記錄功能外,功能薄弱不少。緩存
因爲Mybatis的sql都是寫在mapper.xml裏,全部sql優化比Hibernate方便的多。mybatis
而Hibernate的sql大多都是自動生成的,沒法直接維護。雖然有hql,可是hql的功能不及sql強大,遇到一些複雜的統計時hql會有侷限性。app
雖然Hibernate也支持原生的sql,但開發模式卻與ORM不一樣,使用起來不是很方便。框架
注意:接口中有多個傳參的時候,可使用@Param註解ide
注意:@Param註解導入的是Mybatis的jar包,不是springframework的jar包學習
接下來,看下Mybatis的mapper.xml配置文件
1:未使用@Param註解時,用數組的方式取值
2:這裏獲取表名稱的值是使用$符號獲取,而不是#符號獲取
1:接口參數包含多個,且有對象類型的參數時的調用方式
2:if條件判斷須要使用對象參數的調用方式
#{}:佔位符號,好處是防止sql注入
${}:sql拼接符號,只是簡單的字符串替換
動態sql是mybatis的強大特性之一,mybatis在對sql語句進行預編譯以前,會對sql進行動態解析,在動態解析時,#{}和${}所表現的形式會有所不一樣。
例如:#{}
動態解析以後:
一個#{}被解析成一個參數佔位符?。
而${}則僅僅是一個純粹的字符串的替換,在動態sql解析階段將會進行變量替換。
例如:${}
當咱們傳遞的參數爲「test」時,則解析成:
在預編譯以前的sql語句已經不包含變量了,完成已是常量數據了。綜上所述:
${}變量的替換是在動態sql解析階段,#{}變量的替換是在DBMS中。
一、在使用過程當中,咱們應該使用哪一種方式呢?
答案是:優先使用#{},由於${}的方式會存在sql注入的問題。例如:
假如,咱們的參數table_name的值是user;delete user; --,
那麼sql動態解析階段,預編譯以前的sql語句就將變成:
-- 以後的的語句將做爲註釋,不起做用。所以原本一條查詢語句,結果偷偷的包含了一個刪除表數據的sql。
二、表名做爲變量時,必須使用${},
這是由於,表名是字符串,使用sql佔位符替換字符串時會帶上引號’’,這會致使sql語法錯誤。
例如:
預編譯以後的sql語句變成:
假如咱們傳入的參數table_name的值是」user」,operator_name的值爲」test」,
那麼佔位符進行變量替換以後的sql語句爲:
上述的sql語句存在語法錯誤,表名不能加上單引號’’
聲明:
引用:
在映射文件中parameterType或者resultType時須要寫類名的全路徑,能夠指定別名簡化書寫。
mybatis中還有許多內置別名:
Alias |
Mapped Type |
_byte |
byte |
_long |
long |
_short |
short |
_int |
int |
_integer |
int |
_double |
double |
_float |
float |
_boolean |
boolean |
string |
String |
byte |
Byte |
long |
Long |
short |
Short |
int |
Integer |
integer |
Integer |
double |
Double |
float |
Float |
boolean |
Boolean |
date |
Date |
decimal |
BigDecimal |
bigdecimal |
BigDecimal |
object |
Object |
map |
Map |
hashmap |
HashMap |
list |
List |
arraylist |
ArrayList |
collection |
Collection |
iterator |
Iterator |
1)自定義別名:
在Mybatis的核心配置文件中配置別名
使用:
2)自定義別名:
3)自定義別名:
在spring-mybatis.xml配置文件中加入以上配置,而後新增mybatis-config.xml配置文件
注意:typeAliases標籤要放在settings標籤下面,由於configuration標籤下的字標籤是須要按照固定的順序
1) 日誌打印:
2) 日誌打印:
當進行數據庫修改的時候 ,有時只須要修改表中的某幾個字段 , 其餘字段保持不變 , 這是就須要用到動態更新 , 否則會出現其餘值爲null的問題
1) 方式一:
注意: 字段後的「,」 ,若是age爲空 ,set標籤會自動把name屬性後的「,」去掉
1) 方式二:
trim標籤有4個屬性:
prefix:在trim標籤內sql語句加上前綴
suffix:在trim標籤內sql語句加上後綴
suffixOverrides:去除多餘的後綴內容
prefixOverrides:去除多餘的前綴內容
注意:and加在字段前,當name字段爲null時,where標籤會自動去掉age前的and
useGeneratedKeys設置爲"true"代表要MyBatis獲取由數據庫自動生成的主鍵
keyProperty="customer_id"指定把獲取到的主鍵值注入到CustomerInfo的customer_id屬性
foreach屬性:
屬性 |
描述 |
item |
循環體中的具體對象。支持屬性的點路徑訪問,如item.age,item.info.details。 具體說明:在list和數組中是其中的對象,在map中是value。 該參數爲必選。 |
collection |
要作foreach的對象,做爲入參時,List<?>對象默認用list代替做爲鍵,數組對象有array代替做爲鍵,Map對象用map代替做爲鍵。 固然在做爲入參時可使用@Param("keyName")來設置鍵,設置keyName後,list,array,map將會失效。 除了入參這種狀況外,還有一種做爲參數對象的某個字段的時候。舉個例子: 若是User有屬性List ids。入參是User對象,那麼這個collection = "ids" 若是User有屬性Ids ids;其中Ids是個對象,Ids有個屬性List id;入參是User對象,那麼collection = "ids.id" 上面只是舉例,具體collection等於什麼,就看你想對那個元素作循環。 該參數爲必選。 |
separator |
元素之間的分隔符,例如在in()的時候,separator=","會自動在元素中間用「,「隔開,避免手動輸入逗號致使sql錯誤,如in(1,2,)這樣。該參數可選。 |
open |
foreach代碼的開始符號,通常是(和close=")"合用。經常使用在in(),values()時。該參數可選。 |
close |
foreach代碼的關閉符號,通常是)和open="("合用。經常使用在in(),values()時。該參數可選。 |
index |
在list和數組中,index是元素的序號,在map中,index是元素的key,該參數可選。 |