1. 程式人生 > >mybatis學習(一)基礎入門

mybatis學習(一)基礎入門

Mybatis架構

這裡寫圖片描述

SqlMapConfig.xml 核心配置檔案。
mapper.xml 實體的對映配置檔案,書寫sql。
SqlSessionFactory session的工廠。
SqlSession 核心操作物件。

一、使用方法

1、匯入jar包,依賴包和核心包都匯入。並且需要匯入mysql驅動jar包connection。
這裡寫圖片描述
2、配置核心配置檔案SqlMapConfig.xml
寫入頭(約束)後Configuration–environments(與sping整合後將廢除,用於連線資料庫)

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Config 3.0//EN" "http://mybatis.org/dtd/mybatis-3-config.dtd">

這裡寫圖片描述

3、pojo對映檔案,catalog.xml
寫入頭,mapper中寫入sql語句。在主配置中告知位置。可以在mapper配置名稱空間區分其他xml。
這裡寫圖片描述
這裡寫圖片描述

4、建立工廠 任意名稱
1、載入核心配置檔案
2、建立工廠
3、建立session
這裡寫圖片描述

  • 根據使用者名稱模糊查詢
    這裡寫圖片描述

  • 新增使用者 必須讓sqlSession.commit
    這裡寫圖片描述


    這裡寫圖片描述

  • 新增並且同時返回ID(SQL是先儲存資料後生成ID)

  • 這裡寫圖片描述
  • 修改
    這裡寫圖片描述
  • 刪除
    這裡寫圖片描述

(二)Mybatis的優點

1、在xml配置了連線池,使用連線池管理連線。
2、傳參,自動對映實體,獲得實體裡的值。(動態sql,不用想怎麼拼接)
3、Sql語句寫在配置檔案xml中,易維護。
4、自動將執行結果對映到java物件(pojo),通過resultType指定返回型別。
(jdbc寫在程式碼中,通過statement.query方法傳入sql語句以及返回型別,且解析前需要遍歷)

(三)Mybatis和Hibernate的區別

不同:

MyBatis需要程式設計師自己編寫Sql語句,通過xml或註解靈活執行。通過實體物件和sql合成成最終的sql。執行結果再對映成java物件。


不完全是一個ORM框架,mybatis需要程式設計師自己寫SQL語句。mybatis可以通過XML或註解的方式靈活配置要執行的SQL語句。

Mybatis優點:

門檻低,容易學,靈活sql,適合對關係資料模型要求不高的軟體開發。
注意:無法做到資料庫無關性,變換資料庫則需要定義多套sql對映。

Hibernate優點:

物件/關係對映能力強,資料庫無關性好,適用關係模型要求高的軟體。節省程式碼,提高效率。但門檻高,如何設計對映麻煩。不好維護。

(四)框架開發設計的方法

使用mybatis通常有兩種方法,原始Dao或者mapper動態代理。

原始Dao設計方法

弊端:冗餘太多,硬編碼。
Dao層
這裡寫圖片描述
Junit模擬service層
這裡寫圖片描述

Mapper動態代理:寫介面,自動幫我生成好物件並執行。

原則1:mapper介面的方法名與XML定義的statement的id相同。
原則2:輸出,返回型別相同。
原則3:輸入,引數型別相同。
原則4:XML的namespace與mapper介面的類路徑相同。
優點:節省程式碼,防止硬編碼。冗餘少
寫catalog mapper介面如下,滿足4個原則
這裡寫圖片描述
並於原catalog(mapper).xml配置
這裡寫圖片描述
便可以直接呼叫方法。
這裡寫圖片描述

(五)其他注意事項

核心SqlMapConfig.xml的其他配置

SqlMapConfig.xml中配置的內容和順序如下:

properties(屬性) 可以載入其他配置資訊檔案
settings(全域性配置引數)
typeAliases(類型別名)(給某個類取別名,甚至可以直接別名一個包)
這裡寫圖片描述
typeHandlers(型別處理器)
objectFactory(物件工廠)
plugins(外掛)
environments(環境集合屬性物件)
—environment(環境子屬性物件)
transactionManager(事務管理)
dataSource(資料來源)
mappers(對映器)
這裡寫圖片描述

其他注意事項:

1、在xml寫sql語句的時候
#{vv} 相當於變數並且兩邊加單引號。
${value}不加單引號
#{}表示一個佔位符號,通過#{}可以實現preparedStatement向佔位符中設定值,自動進行java型別和jdbc型別轉換。#{}可以有效防止sql注入。 #{}可以接收簡單型別值或pojo屬性值。 如果parameterType傳輸單個簡單型別值,#{}括號中可以是value或其它名稱。

2、resultType 自動對映,resultMap 手動對映
3、selectOne查詢一條記錄,如果使用selectOne查詢多條記錄則丟擲異常
動態代理物件呼叫sqlSession.selectOne()和sqlSession.selectList()是根據mapper介面方法的返回值決定,如果返回list則呼叫selectList方法,如果返回單個物件則呼叫selectOne方法。