如何使用mybatisL2緩存?
了解更多關於MyBatisL2緩存的信息首先,創建緩存的整個過程
我們從SqlSessionFactoryBuilder解析mybatis-config.xml配置文件開始:
readerreader=resources.getresourceasreader(mybatis-config.XML);
SqlSessionFactorySqlSessionFactory=newSqlSessionFactorybuilder()。構建(閱讀器);
然後:
XMLConfigBuilderparser=newXMLConfigBuilder(inputStream,environment,properties);
返回build(parser.parse());
看看parser.parse()方法:
parseconfiguration(parser.evalnode(/配置
查看處理Mapper.xml文件的位置:
mapperelement(root.evalnode(地圖繪制者
看看處理Mapper.xml的XMLMapperBuilder:
XMLmapperbuildermapperparser=newXMLmapperbuilder(inputStream,configuration,
resource,configuration.getsqlfragments());
mapperparser.parse();
繼續看看解析方法:
configurationelement(parser.evalnode/mapper));
轉到此處:
stringnamespace=context.getstringattribute(命名空間
if(namespace.equals(映射器的命名空間不能為空);
}
builderassistant.setcurrentnamespace(命名空間);
cacheRefElement(context.evalnode(cache-ref));
cacheElement(context.evalnode(緩存
看這裏,名稱空間是
看看我的巴蒂斯如何處理
私有voidcacheElement(XNode上下文)引發異常{
如果(上下文!=null){
stringtype=context.getstringattribute(鍵入
Class
stringeviction=context.getstringattribute(驅逐);
Class
longflushinterval=context.getlongattribute(flushInterval
integersize=context.getintattribute(尺寸
布爾讀寫=!context.getbooleanattribute(只讀,假);
booleanblocking=context.getbooleanattribute(阻止
propertiesprops=context.getchildrenaspproperties();
builderasistant.usenewcache(typeclass,evictionClass,
flushInterval、size、readWrite、blocking、props);
}
}
從源代碼中可以看到MyBatis已經讀取了那些屬性,很容易就可以得到這些屬性的默認值。
Java的cache對象方法是builderAssistant.useNewCache我們來看看這段代碼:
公***緩存useNewCache(Class馬鞭延伸緩存
evictionclass=valueOrDefault(evictionclass,lrucache.class);
Cachecache=新的CacheBuilder(當前命名空間)
.實現(類型類)
.addDecorator(evictionClass)
.清除時間間隔
.尺寸(大小)
.讀寫(讀寫)
.阻斷(阻斷)
.屬性(道具)
.build();
configuration.addCache(緩存);
currentCache=cache
返回緩存;
}
從調用這個方法的地方我們可以看到,並沒有使用返回值緩存,而是在後面的過程中創建MappedStatement時使用了currentCache。
第二,使用緩存過程
在系統中,使用緩存的地方是在CachingExecutor中:
@覆蓋
公***
獲取緩存後,先確定是否有二級緩存。
僅通過,
然後根據xml配置的屬性useCache判斷是否使用緩存(resultHandler常用的默認值很少為null)。
if(ms.isusecache()
如果沒有問題,將根據鍵從緩存中獲取值:
@suppresswarnings(未選中E
如果沒有緩存,將執行查詢,並將查詢結果放入緩存中。
if(list==null){
列表=委托。
tcm.putObject(緩存、鍵、列表);//問題#578和#116
}
返回結果
退貨單;
}
}
沒有緩存時,直接執行查詢。
返回委托。
}
在上面的代碼中,tcm.putObject(cache,key,list);這段代碼緩存結果。但實際上,直到sqlsession關閉,MyBatis才以序列化的形式保存在Map(默認緩存配置)中。
三、使用緩存時的註意事項
1.緩存只能用於具有單表操作的表。
只需要保證這個表在整個系統中只有壹個表操作,所有和這個表相關的操作都必須在壹個命名空間中。
2.當您可以保證查詢遠遠大於插入、更新和刪除操作時,請使用緩存。
這不用我說,大家應該都知道。記住,這需要在1的前提下保證!
第四,避免使用L2緩存。
這裏可能有很多人不理解。L2緩存帶來的好處遠遠小於隱患。
緩存在命名空間中,不同命名空間中的操作互不影響。
插入、更新和刪除操作將清除空所在的名稱空間中的所有緩存。
通常在MyBatisGenerator生成的代碼中,每個表都是獨立的,每個表都有自己的命名空間。
為什麽避免使用L2緩存?
符合緩存使用註意事項
mybatiscollection的三種用法?
mybatis使用foreach中collection的三種用法
foreach的主要用在構建in條件中,它可以在SQL語句中進行叠代壹個集合。
foreach元素的屬性主要有item,index,collection,open,separator,close。
item表示集合中每壹個元素進行叠代時的別名,
index指定壹個名字,用於表示在叠代過程中,每次叠代到的位置,
open表示該語句以什麽開始,
separator表示在每次進行叠代之間以什麽符號作為分隔符,
close表示以什麽結束。
在使用foreach的時候最關鍵的也是最容易出錯的就是collection屬性,該屬性是必須指定的,但是在不同情況下,該屬性的值是不壹樣的,主要有壹下3種情況:
1.如果傳入的是單參數且參數類型是壹個List的時候,collection屬性值為list
2.如果傳入的是單參數且參數類型是壹個array數組的時候,collection的屬性值為array
3.如果傳入的參數是多個的時候,我們就需要把它們封裝成壹個Map了,當然單參數也可
以封裝成map,實際上如果妳在傳入參數的時候,在breast裏面也是會把它封裝成壹個Map的,map的key就是參數名,所以這個時候collection屬性值就是傳入的List或array對象在自己封裝的map裏面的key下面分別來看看上述三種情況的示例代碼
mybatis怎麽將壹個表中符合查詢條件的多條記錄,返回為壹個list+map的形式?
xml中配置好pojo對象然後將properties和數據庫字段匹配即可