Mybatis整理

 

一、首先,Mybatis與Hibernate的區別

  1.一、Mybatis不是一個完整的ORM框架

  ORM大概的意思就是「對象關聯映射」,Hibernate徹底能夠經過對象關係模型實現對數據庫的操做,擁有完整的JavaBean對象與數據庫的映射結構來自動生成sql。spring

  而Mybatis僅有基本的字段映射,對象數據以及對象實際關係任然須要經過手動編寫sql來實現和管理。sql

  1.二、Hibernate數據庫移植性遠大於Mybatis

  Hibernate經過它強大的映射結構和hql語言,大大下降了對象與數據庫的耦合性,因爲Mybatis須要手動編寫sql語句,就致使它的移植性比較差。數據庫

  1.三、Hibernate擁有完整的日誌系統,Mybatis欠缺一些

  hibernate日誌系統很是健全,涉及普遍,包括:sql記錄、關係異常、優化警告、緩存提示、髒數據警告等;數組

  而mybatis則除了基本記錄功能外,功能薄弱不少。緩存

  1.四、Mybatis簡單,易上手。Hibernate則配置比較複雜,學習成本高

  1.五、sql優化,Mybatis比Hibernate方便的多

  因爲Mybatis的sql都是寫在mapper.xml裏,全部sql優化比Hibernate方便的多。mybatis

  而Hibernate的sql大多都是自動生成的,沒法直接維護。雖然有hql,可是hql的功能不及sql強大,遇到一些複雜的統計時hql會有侷限性。app

  雖然Hibernate也支持原生的sql,但開發模式卻與ORM不一樣,使用起來不是很方便。框架

二、     Mybatis注意事項整理

  2.一、Mybatis映射文件參數傳遞

  

  注意:接口中有多個傳參的時候,可使用@Param註解ide

   

  注意:@Param註解導入的是Mybatis的jar包,不是springframework的jar包學習

  

  接下來,看下Mybatis的mapper.xml配置文件

  

  1:未使用@Param註解時,用數組的方式取值

   2:這裏獲取表名稱的值是使用$符號獲取,而不是#符號獲取

  

  1:接口參數包含多個,且有對象類型的參數時的調用方式

        2:if條件判斷須要使用對象參數的調用方式

  

  2.二、${}與#{}區別

    2.2.一、描述

    #{}:佔位符號,好處是防止sql注入

    ${}:sql拼接符號,只是簡單的字符串替換

 

    2.2.二、具體分析

    動態sql是mybatis的強大特性之一,mybatis在對sql語句進行預編譯以前,會對sql進行動態解析,在動態解析時,#{}和${}所表現的形式會有所不一樣。 

    例如:#{}

    

    動態解析以後:

    

    一個#{}被解析成一個參數佔位符?。

    而${}則僅僅是一個純粹的字符串的替換,在動態sql解析階段將會進行變量替換。

    例如:${}

    

    當咱們傳遞的參數爲「test」時,則解析成:

     

    在預編譯以前的sql語句已經不包含變量了,完成已是常量數據了。綜上所述:

    ${}變量的替換是在動態sql解析階段,#{}變量的替換是在DBMS中。

 

    2.2.三、使用

    一、在使用過程當中,咱們應該使用哪一種方式呢?

    答案是:優先使用#{},由於${}的方式會存在sql注入的問題。例如:

    

    假如,咱們的參數table_name的值是user;delete user; --,

    那麼sql動態解析階段,預編譯以前的sql語句就將變成:

     

    -- 以後的的語句將做爲註釋,不起做用。所以原本一條查詢語句,結果偷偷的包含了一個刪除表數據的sql。  

    二、表名做爲變量時,必須使用${},

     這是由於,表名是字符串,使用sql佔位符替換字符串時會帶上引號’’,這會致使sql語法錯誤。

    例如:

     

    預編譯以後的sql語句變成:

     

    假如咱們傳入的參數table_name的值是」user」,operator_name的值爲」test」,

    那麼佔位符進行變量替換以後的sql語句爲:

   

    上述的sql語句存在語法錯誤,表名不能加上單引號’’

  2.三、sql語句的複用

    聲明:

    

    引用:

    

  2.四、別名標籤

     在映射文件中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)自定義別名:

        

      

    2.五、日誌打印

 

在spring-mybatis.xml配置文件中加入以上配置,而後新增mybatis-config.xml配置文件

  

  注意:typeAliases標籤要放在settings標籤下面,由於configuration標籤下的字標籤是須要按照固定的順序

  1)  日誌打印:

  

  2)  日誌打印:

  

  

  2.六、動態更新

  當進行數據庫修改的時候 ,有時只須要修改表中的某幾個字段 , 其餘字段保持不變 , 這是就須要用到動態更新 , 否則會出現其餘值爲null的問題

  1)  方式一:

  

  注意: 字段後的「,」 ,若是age爲空 ,set標籤會自動把name屬性後的「,」去掉

  1)  方式二:

   

  trim標籤有4個屬性:

       prefix:在trim標籤內sql語句加上前綴

  suffix:在trim標籤內sql語句加上後綴
  suffixOverrides:去除多餘的後綴內容
  prefixOverrides:去除多餘的前綴內容

 

  2.七、動態查詢

  

  注意:and加在字段前,當name字段爲null時,where標籤會自動去掉age前的and

   

  2.八、動態插入

   

  useGeneratedKeys設置爲"true"代表要MyBatis獲取由數據庫自動生成的主鍵

  keyProperty="customer_id"指定把獲取到的主鍵值注入到CustomerInfocustomer_id屬性

   

  2.八、批量插入

  

  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,該參數可選。

 

  

 

  

 

 

 

 

 

 

 

 

 

  2.九、批量刪除

     

相關文章
相關標籤/搜索