1. 程式人生 > >初次學習Mybatis框架總結

初次學習Mybatis框架總結

一、基礎知識:重點內容
1. 首先為什麼要使用持久層框架:
原生態的jdbc開發存在許多弊端,頻繁的連線關閉資料庫,效能低;還有許多重複的程式碼模組,開發效率低下;把sql語句,引數,和輸出結果集等硬編碼在程式中,不利於後期維護擴充套件。

2.  Mybatis是什麼:
    Mybatis是一個不完全的持久層框架(ORM框架,物件關係對映),因為它與hibernate不同,mybatis的核心就是編寫sql語句,這樣可以很方便的進行sql優化,sql的判斷等。
    Mybatis,可以用資料庫連線池來管理資料庫連線,就不需要頻繁的對資料庫進行連線、關閉等操作了。還可以完成輸入對映、輸出對映、這就可以讓程式設計師把精力放在sql語句的編寫上。

使用Mybatis就需要匯入Mybatis的jar包,包括核心jar包以及其依賴jar包。log4j,ognl,代理jar包等

二、Mybatis的兩個配置檔案(SqlMapConfig.xml、mapper.xml)重點內容
1. SqlMapConfig.xml:這是一個全域性的配置檔案:可以配置一下內容
properties: 該元素用來載入屬性檔案,配置屬性。
settings:該元素用來配置mybatis的全域性設定,例如快取等。
typeAliases:該元素用來配置別名,可以單獨對某個類配置,也可以掃描整個包下面的類,(預設掃描的別名為類首字母小寫)
tyepHandlers:該元素用來配置型別轉換器,mybatis提供了常用的型別轉換(包括基本型別和常用的物件型別)
objectFactory:沒什麼用
plugins:外掛,不用
enviroments:用來配置環境
—environment:環境變數,裡面包括資料來源和事務
—transactionManager:配置事務管理器
—dataSource:配置資料來源,資料來源對應一個數據庫,在資料來源中可以配置連線池屬性,連線池相當於一個代理:如果有人索要資料庫連線,連線池會給客戶資料庫連線。
databaseIdProvider:資料庫廠商標識
mappers:該元素是最重要的元素,用來配置對映器,可以單獨配置某個對映器,也可以使用包掃描:
重點內容

注意 :在使用包掃描時,需要遵循如下規範:(mapper.xml和mapper.java名稱相同且在同一目錄)`

<resultMap type="orders" id="findOrdersUserOrderdetailMap">
        <!-- 對映商品、使用者資訊,同一對一多表查詢 -->
        <!-- 對order中的欄位進行對映 -->
        <id column="id" property="id"/>
        <result column="user_id" property="userId"
/>
<result column="number" property="number"/> <result column="createtime" property="createtime"/> <result column="note" property="note"/> <!-- 對orders中的user進行關聯對映,一對一 property:將查詢出的資訊對映到orders的哪個屬性,在此為user屬性 javaType:指定該屬性的型別,在此為user型別,使用了別名 --> <association property="user" javaType="user"> <!-- 唯一標識的對映,將查詢出的user_id與user的主鍵id進行對映 user_id是sql語句查詢的別名,如果不一致則為空--> <id column="user_id" property="id"/> <result column="username" property="username"/> <result column="sex" property="sex"/> <result column="address" property="address"/> </association> <!-- 進行集合對映 --> <collection property="orderdetails" ofType="orderdetail"> <!-- 對映主鍵,colunm指定的是資料庫表中欄位的名稱,property指定pojo類的屬性名 --> <id column="d_id" property="id"/> <result column="orders_id" property="ordersId"/> <result column="items_id" property="itemsId"/> </collection> </resultMap>

輸出對映總結:
如果查詢出的列名和屬性不一致,無法完成對映,需要使用sql別名,或者在resultMap中進行表字段與po屬性的對映
記住如下規則:colunm指明的是sql中查出來的欄位名,property指明的是po的屬性名,
在不適用延遲載入的情況下進行關聯對映是,需要指明兩個屬性,一個是property:指明的是將查詢的結果對映到該po的哪個屬性中;一個是型別一對一為javaType,一對多是ofType。
當使用延遲載入時,還需要指明其他兩個屬性,一個是colunm:指明的是在延遲載入的時候根據哪個屬性去查詢,還有一個是select:指明的是statement的id,如果該statement不在本mapper.xml中,需要在前面指明namespace。

還有一個重點是動態sql,sql片段:
1。sql片段,指明一個id的sql片段,為了提高效率,防止太多重複的sql語句,
在使用時,使用該元素引入即可,
2。動態sql:常用元素:where,if,choose(when,otherwise),foreach
where元素,可以自動省去第一個and,
if:用來判斷,test屬性用來判斷表示式是否為真
choose:選擇標籤,子標籤when用來選擇,otherwise用來指其他情況
foreach:用來遍歷,屬性比較多,具體用的是時候查資料:

二、高階知識:
1。資料模型分析思路
# 分析每個模組中每張表記錄的大概內容,主要是用來存什麼資料
# 詳細分析每章表的欄位,重要欄位(非空欄位,外來鍵欄位)
# 資料庫級別的表與表之間的關係,通過主鍵外來鍵關聯關係
# 表與表之間的業務關係,一定要建立在某種業務基礎上分析,一對多,還是一對一,多對多等。

2。延遲載入:使用延遲載入可以提高資料庫效能,原理,先從單表查詢,當需要關聯表的時候在去進行關聯查詢,將引數傳入到statement中去,因此sql語句應改為單表查詢,而不是同時查詢許多表欄位。
注意:引數應該是查詢資料庫的表的欄位名,而不是po屬性名!!!!

理解延遲載入:先查單表,當需要關聯表的時候去執行statement查詢資料庫,需要的時候指的是,呼叫了該代理物件的get,set,toString,clone等方法是,這就算需要了,會在執行這些方法之前,去查詢資料庫,這種技術可以用代理來實現,所以在需要之前返回的是一個代理物件。

Mybatis如何開啟延遲載入:預設情況下沒有開啟延遲載入
    在SqlMapConfig.xml中的settings元素中指明延遲載入配置:
        <settings>
            <!--開啟延遲載入開關 -->
            <setting name="lazyLoadingEnable" value="true"/>
            <setting name="aggressiveLazyLoading" value="false"/>
        </settings>

3。Mybatis的查詢快取:一級快取(sqlSession級別的,不能跨sqlSession),二級快取(mapper級別的,對應一個mapper.xml,可以跨sqlSession,多個sqlSession可以共享快取資料,每個sqlSession都可以影響二級快取)
對快取的理解:快取,顧名思義就是把資料快取在記憶體中,或硬碟等介質上,方便下次使用,提高系統性能,減少資料庫壓力。

1。一級快取:sqlSession級別的快取,mybatis預設支援一級快取,所以不需要設定
    # 每一個sqlSession物件在建立後,都會有一塊記憶體區域,存放一個HashMap的資料結構,用於儲存快取資料,(在資料庫查詢出來的資料,會有一個key作為唯一標識),不同的sqlSession不會相互影響,
    # 一級快取通常用在事務中,即service方法中,每個service方法會使用同一個sqlSession,service方法執行結束,sqlSession關閉,快取清空,
    # 一級快取原理:
                * 第一次:查詢id為1的使用者資訊,首先會去一級快取中查詢,沒有的話,就會去查資料庫,然後放到一級快取中。
                * 第二次:查詢id為1的使用者資訊,首先會去一級快取中查詢,找到了,直接使用。
                * 注意:如果期間sqlSession執行了insert,update,delete等方法,且執行了commit(),那麼就會清空快取,這樣可以保證資料及時更新,防止髒讀。



        2。二級快取:mapper級別的快取,對應一個mapper.xml,按照namespace區分,如果namespace相同,那麼就是同一個二級快取
             # 二級快取可以跨sqlSession,多個sqlSession可以共享資料,但也可以影響快取,
             # 二級快取原理:
                 sqlSession1,執行一個mapper中的查詢,然後會把資料存放到二級快取中
                 sqlSession2,如果查詢同樣的資料,則會從快取中獲取,不會查詢資料庫,
                 sqlSession3,如果執行了插入、刪除、更新等操作,那麼就會清空二級快取,這樣的話,老子辛辛苦苦快取的東西就付之一炬了,所以還是慎用。
            # 二級快取的開啟:因為是mapper級別的快取,所以除了在SqlMapConfig中開啟,還需要在mapper.xml中配置:
                * 在SqlMapConfig中加入:
                        * <setting name="cacheEnabled" value="true"/>
                * 在mapper.xml中開啟
                        * <cache/> 直接在mapper元素下加入這個元素即可
                * 並且pojo類需要實現序列化介面:用來反序列化,
                *  可以在statement中設定 useCache=“false”來關閉二級快取。

4。使用分散式管理快取,mybatis整合ehcache,這是一個分散式快取框架,
分散式顧名思義就是好多伺服器的意思,因為實際中,需要提高效能,高併發等,就需要多臺伺服器,mybatis無法實現分散式快取共享,所以就需要使用群集管理(初步瞭解,日後詳談),
所以mybatis提供了一個分散式管理快取介面 Eache,開發者需要實現該介面,用來分散式管理

5。最後就是mybatis和spirng的整合了:將SqlSessionFactory,dataSource,mapper都交給spring來管理。
需要spring通過單例方式管理SqlSessionFactory:因為sqlSessionFactory依賴dataSource,和configuration,所以需要將這兩個bean注入進來,
dataSource,資料來源對應一個數據庫,需要連線資料庫的密碼,驅動等資訊,其中還包括了資料庫連線池的資訊,所以也需要將連線池引數注入到dataSource物件中,

1。整合環境:加入spring的jar包,mybatis的jar包,還需要加入spring-mybatis的整合包。

在applicationContext_dao.xml中配置sqlSessionFactory

<!-- 載入配置檔案 -->
    <context:property-placeholder location="classpath:db.properties" />

    <!-- 資料來源,使用dbcp -->
    <bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource"
        destroy-method="close">
        <property name="driverClassName" value="${jdbc.driver}" />
        <property name="url" value="${jdbc.url}" />
        <property name="username" value="${jdbc.username}" />
        <property name="password" value="${jdbc.password}" />
        <property name="maxActive" value="10" />
        <property name="maxIdle" value="5" />
    </bean>


    <!-- sqlSessinFactory -->
    <bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
        <!-- 載入mybatis的配置檔案 -->
        <property name="configLocation" value="mybatis/SqlMapConfig.xml" />
        <!-- 資料來源 -->
        <property name="dataSource" ref="dataSource" />
    </bean>

還需要配置掃描mapper的包,建議使用掃描包,而不是單獨的對每個mapper進行配置。

這樣就可以通過spring容器來獲取mapper代理物件。
在普通專案中得到spring容器的方法:
ApplicationContext appContext = new ClassPathXmlApplicationContext(”beans.xml”);//在類路徑下載入配置檔案,
還可以在檔案路徑下載入配置檔案

如果在web專案中,可以在web.xml中配置監聽器:


contextConfigLocation
classpath:config/applicationContext.xml


org.springframework.web.context.ContextLoaderListener

用如下程式碼獲取:
context=WebApplicationContextUtils.getRequiredWebApplicationContext(this.getServletContext());