mybatis 复习笔记02
1. 一對一查詢:? ??
? ? 1). 實體類:
? ? ? ? ??
? ??2).?定義resultMap
<!-- 訂單查詢關聯用戶的resultMap將整個查詢的結果映射到cn.itcast.mybatis.po.Orders中--><resultMap type="cn.itcast.mybatis.po.Orders" id="OrdersUserResultMap"> <!-- 配置映射的訂單信息 --><!-- id:指定查詢列中的唯 一標識,訂單信息的中的唯 一標識,如果有多個列組成唯一標識,配置多個idcolumn:訂單信息的唯 一標識 列property:訂單信息的唯 一標識 列所映射到Orders中哪個屬性--><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/> <!-- 配置映射的關聯的用戶信息 --><!-- association:用于映射關聯查詢單個對象的信息property:要將關聯查詢的用戶信息映射到Orders中哪個屬性--><association property="user" javaType="cn.itcast.mybatis.po.User"><!-- id:關聯查詢用戶的唯 一標識column:指定唯 一標識用戶信息的列javaType:映射到user的哪個屬性--><id column="user_id" property="id"/><result column="username" property="username"/><result column="sex" property="sex"/><result column="address" property="address"/></association></resultMap>? ? ?3). mapper.xml?
? ? ? ? ??
? ? ?4). mapper.java
? ? ? ? ??? ? ? ? ??
? ? ?5).?resultType和resultMap實現一對一查詢小結:
? ? ? ? ? resultType:使用resultType實現較為簡單,如果pojo中沒有包括查詢出來的列名,需要增加列名對應的屬性,即可完成映射。如果沒有查詢結果的特殊要求建議使用resultType。
? ? ? ? ? resultMap:需要單獨定義resultMap,實現有點麻煩,如果對查詢結果有特殊的要求,使用resultMap可以完成將關聯查詢映射pojo的屬性中。resultMap可以實現延遲加載,
? ? ? ? ? ? ? ? ? ? ? ? ? ?resultType無法實現延遲加載。
2. 一對多查詢
? ? 1). 實體類:
? ? ? ? ?
? ? ?2). resultMap定義? ? ? ? ? ?
<!-- 訂單及訂單明細的resultMap使用extends繼承,不用在中配置訂單信息和用戶信息的映射--><resultMap type="cn.itcast.mybatis.po.Orders" id="OrdersAndOrderDetailResultMap" extends="OrdersUserResultMap"><!-- 訂單信息 --><!-- 用戶信息 --><!-- 使用extends繼承,不用在中配置訂單信息和用戶信息的映射 --> <!-- 訂單明細信息一個訂單關聯查詢出了多條明細,要使用collection進行映射collection:對關聯查詢到多條記錄映射到集合對象中property:將關聯查詢到多條記錄映射到cn.itcast.mybatis.po.Orders哪個屬性ofType:指定映射到list集合屬性中pojo的類型--><collection property="orderdetails" ofType="cn.itcast.mybatis.po.Orderdetail"><!-- id:訂單明細唯 一標識property:要將訂單明細的唯 一標識 映射到cn.itcast.mybatis.po.Orderdetail的哪個屬性--><id column="orderdetail_id" property="id"/><result column="items_id" property="itemsId"/><result column="items_num" property="itemsNum"/><result column="orders_id" property="ordersId"/></collection></resultMap>? ? ?3). mapper.xml?
? ? ? ? ??
? ? 4). mapper.java?
? ? ? ? ?
3. 多對多查詢 ? ?
? ? 1). mapper.xml
? ? ? ? ?
? ? ?2). resultMap定義? ? ? ? ??
<!-- 查詢用戶及購買的商品 --><resultMap type="cn.itcast.mybatis.po.User" id="UserAndItemsResultMap"><!-- 用戶信息 --><id column="user_id" property="id"/><result column="username" property="username"/><result column="sex" property="sex"/><result column="address" property="address"/><!-- 訂單信息一個用戶對應多個訂單,使用collection映射--> <collection property="ordersList" ofType="cn.itcast.mybatis.po.Orders"><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"/><!-- 訂單明細一個訂單包括 多個明細--><collection property="orderdetails" ofType="cn.itcast.mybatis.po.Orderdetail"><id column="orderdetail_id" property="id"/><result column="items_id" property="itemsId"/><result column="items_num" property="itemsNum"/><result column="orders_id" property="ordersId"/><!-- 商品信息一個訂單明細對應一個商品--><association property="items" javaType="cn.itcast.mybatis.po.Items"><id column="items_id" property="id"/><result column="items_name" property="name"/><result column="items_detail" property="detail"/><result column="items_price" property="price"/></association></collection></collection> </resultMap>? ? ?3). mapper.java
? ? ? ? ??
4. resultMap總結:
? ??resultType:作用:將查詢結果按照sql列名pojo屬性名一致性映射到pojo中。
? ? ? ? ? ? ? ? ? ? ? ? ?場合:常見一些明細記錄的展示,比如用戶購買商品明細,將關聯查詢信息全部展示在頁面時,此時可直接使用resultType將每一條記錄映射到pojo中,在前端頁面遍歷list(list中是pojo)即可。
? ? resultMap:使用association和collection完成一對一和一對多高級映射(對結果有特殊的映射要求)。
? ? association:作用:將關聯查詢信息映射到一個pojo對象中。(javaType ?)
? ? ? ? ? ? ? ? ? ? ? ? ? 場合:為了方便查詢關聯信息可以使用association將關聯訂單信息映射為用戶對象的pojo屬性中,比如:查詢訂單及關聯用戶信息。
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 使用resultType無法將查詢結果映射到pojo對象的pojo屬性中,根據對結果集查詢遍歷的需要選擇使用resultType還是resultMap。
? ? ?collection:作用:將關聯查詢信息映射到一個list集合中。(ofType ? )
? ? ? ? ? ? ? ? ? ? ? ? ?場合:為了方便查詢遍歷關聯信息可以使用collection將關聯信息映射到list集合中,比如:查詢用戶權限范圍模塊及模塊下的菜單,可使用collection將模塊映射到模塊list中,將菜單
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?列表映射到模塊對象的菜單list屬性中,這樣的作的目的也是方便對查詢結果集進行遍歷查詢。?如果使用resultType無法將查詢結果映射到list集合中。
5. 延遲加載:
? ? resultMap可以實現高級映射(使用association、collection實現一對一及一對多映射),association、collection具備延遲加載功能。
? ??延遲加載:先從單表查詢、需要時再從關聯表去關聯查詢,大大提高數據庫性能,因為查詢單表要比關聯查詢多張表速度要快。
? ? 1). mapper.xml
? ? ? ? ?
? ? ? ? ?
? ? ? ? ?上邊先去執行findOrdersUserLazyLoading,當需要去查詢用戶的時候再去執行findUserById,通過resultMap的定義將延遲加載執行配置起來。
? ? 2). resultMap定義,使用association中的select指定延遲加載去執行的statement的id。? ? ? ? ?
<!-- 延遲加載的resultMap --><resultMap type="cn.itcast.mybatis.po.Orders" id="OrdersUserLazyLoadingResultMap"><!--對訂單信息進行映射配置 --><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"/><!-- 實現對用戶信息進行延遲加載select:指定延遲加載需要執行的statement的id(是根據user_id查詢用戶信息的statement)要使用userMapper.xml中findUserById完成根據用戶id(user_id)用戶信息的查詢,如果findUserById不在本mapper中需要前邊加namespacecolumn:訂單信息中關聯用戶信息查詢的列,是user_id關聯查詢的sql理解為:SELECT orders.*,(SELECT username FROM USER WHERE orders.user_id = user.id)username,(SELECT sex FROM USER WHERE orders.user_id = user.id)sexFROM orders--><association property="user" javaType="cn.itcast.mybatis.po.User"select="cn.itcast.mybatis.mapper.UserMapper.findUserById" column="user_id"><!-- 實現對用戶信息進行延遲加載 --></association></resultMap>? ? ? 3). mapper.java
? ? ? ? ? ?
? ? ? 4). 延遲加載配置:
? ? ? ? ? ? mybatis默認沒有開啟延遲加載,需要在SqlMapConfig.xml中setting配置。
? ? ? ? ? ?
| 設置項 | 描述 | 允許值 | 默認值 |
| lazyLoadingEnabled | 全局性設置懶加載。如果設為‘false’,則所有相關聯的都會被初始化加載。 | true | false | false |
| aggressiveLazyLoading | 當設置為‘true’的時候,懶加載的對象可能被任何懶屬性全部加載。否則,每個屬性都按需加載。 | true | false | true |
? ? ? ? ? ??
7. 查詢緩存:mybatis提供查詢緩存,用于減輕數據壓力,提高數據庫性能。
? ? 1). 一級緩存是SqlSession級別的緩存。在操作數據庫時需要構造 sqlSession對象,在對象中有一個數據結構(HashMap)用于存儲緩存數據。不同的sqlSession之間的緩存數據區域
? ? ? ? (HashMap)是互相不影響的。
? ? 2). 二級緩存是mapper級別的緩存,多個SqlSession去操作同一個Mapper的sql語句,多個SqlSession可以共用二級緩存,二級緩存是跨SqlSession的。二級緩存與一級緩存區別,二級
? ? ? ? ?緩存的范圍更大,多個sqlSession可以共享一個UserMapper的二級緩存區域。UserMapper有一個二級緩存區域(按namespace分) ,其它mapper也有自己的二級緩存區域(按namespace分)。
? ? ? ? ?每一個namespace的mapper都有一個二緩存區域,兩個mapper的namespace如果相同,這兩個mapper執行sql查詢到數據將存在相同 的二級緩存區域中。
? ? 3). 開啟二級緩存:
? ? ? ? ?mybaits的二級緩存是mapper范圍級別,除了在SqlMapConfig.xml設置二級緩存的總開關,還要在具體的mapper.xml中開啟二級緩存。在核心配置文件SqlMapConfig.xml中加入:
? ? ? ? ?
? ? ? ??在UserMapper.xml中開啟二緩存,UserMapper.xml下的sql執行完成會存儲到它的緩存區域(HashMap):
? ? ? ??
? ? ?4). 調用pojo類實現序列化接口:
? ? ? ??
? ? ? ? ?為了將緩存數據取出執行反序列化操作,因為二級緩存數據存儲介質多種多樣,不一樣在內存。
? ? 5).?useCache配置:
? ? ? ? ?在statement中設置useCache=false可以禁用當前select語句的二級緩存,即每次查詢都會發出sql去查詢,默認情況是true,即該sql使用二級緩存。
? ? ? ? ?<select id="findOrderListResultMap" resultMap="ordersUserMap" useCache="false">
? ? ? ? ?總結:針對每次查詢都需要最新的數據sql,要設置成useCache=false,禁用二級緩存。
? ? 6).?在mapper的同一個namespace中,如果有其它insert、update、delete操作數據后需要刷新緩存,如果不執行刷新緩存會出現臟讀。
? ? ? ? ?設置statement配置中的flushCache="true"?屬性,默認情況下為true即刷新緩存,如果改成false則不會刷新。使用緩存時如果手動修改數據庫表中的查詢數據會出現臟讀。
? ? ? ? ?如下:
? ? ? ? ? ? ? ? <insert id="insertUser" parameterType="cn.itcast.mybatis.po.User" flushCache="true">
? ? ? ? ?總結:一般下執行完commit操作都需要刷新緩存,flushCache=true表示刷新緩存,這樣可以避免數據庫臟讀。
? ? 7). 二級緩存的應用場景:
? ? ? ? ?對于訪問多的查詢請求且用戶對查詢結果實時性要求不高,此時可采用mybatis二級緩存技術降低數據庫訪問量,提高訪問速度,業務場景比如:耗時較高的統計分析sql、電話賬單查詢sql等。
? ? ? ? ?實現方法如下:通過設置刷新間隔時間,由mybatis每隔一段時間自動清空緩存,根據數據變化頻率設置緩存刷新間隔flushInterval,比如設置為30分鐘、60分鐘、24小時等,根據需求而定。
? ? 8). 二級緩存的局限性:
? ? ? ? ?mybatis二級緩存對細粒度的數據級別的緩存實現不好,比如如下需求:對商品信息進行緩存,由于商品信息查詢訪問量大,但是要求用戶每次都能查詢最新的商品信息,此時如果使用mybatis
? ? ? ? ?的二級緩存就無法實現當一個商品變化時只刷新該商品的緩存信息而不刷新其它商品的信息,因為mybaits的二級緩存區域以mapper為單位劃分,當一個商品信息變化會將所有商品信息的緩存
? ? ? ? 數據全部清空。解決此類問題需要在業務層根據需求對數據有針對性緩存。
8. mybatis 整合ehcache
? ? 1).?不使用分布緩存,緩存的數據在各各服務單獨存儲,不方便系統 開發。所以要使用分布式緩存對緩存數據進行集中管理。mybatis無法實現分布式緩存,需要和其它分布式緩存框架進行整合。
? ? ? ? ?ehcache是一個分布式緩存框架。
? ? 2).?mybatis提供了一個cache接口,如果要實現自己的緩存邏輯,實現cache接口開發即可。mybatis和ehcache整合,mybatis和ehcache整合包中提供了一個cache接口的實現類。
? ? ? ? ?
? ? 3).?mybatis默認實現cache類是:
? ? ? ? ?
? ? 4).??加入ehcache包:
? ? ? ? ?
? ?5).?整合ehcache:配置mapper中cache中的type為ehcache對cache接口的實現類型。
? ? ? ??
? ?6).?加入ehcache的配置文件,在classpath下配置ehcache.xml
? ? ? ? ?
9.?spring和mybatis整合
? ? 1). 整合思路:需要spring通過單例方式管理SqlSessionFactory。spring和mybatis整合生成代理對象,使用SqlSessionFactory創建SqlSession。(spring和mybatis整合自動完成)
? ? ? ? ? ? ? ? ? ? ? ? ? 持久層的mapper都需要由spring進行管理。
? ? 2). 整合所需的jar包:mybatis,spring,spring和mybatis的關聯包
? ? 3). sqlSessionFactory,在applicationContext.xml配置sqlSessionFactory和數據源。sqlSessionFactory在mybatis和spring的整合包下。? ? ? ??
<!-- 加載配置文件 --><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>? ? ?4).?通過MapperScannerConfigurer進行mapper掃描(建議使用)
? ? ? ? ?
轉載于:https://www.cnblogs.com/Jtianlin/p/5097077.html
總結
以上是生活随笔為你收集整理的mybatis 复习笔记02的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 假装写年终总结
- 下一篇: 希尔排序(Shell's Sort)的C