MyBatis的注解使用、ORM層優(yōu)化方式(懶加載和緩存)
Mybatis注解
- 查找
@Select( "SELECT * FROM tt_user WHERE username Like #{id};") User findUserByName(String name); <!--以map為輸入?yún)?shù)查找--> @Select("select * from tt_user where username= #{name} and password=#{pass}") User findUserByUsernameAndPassword(HashMap map);
- 插入
@Insert("insert into tt_user values (#{id},#{username},#{password},#{email},#{age})") int AddUser(User user) throws IOException;
- 更改
@Update("update tt_user set username = #{username} where id = #{id}") void updateUserById(User user);
- 刪除
@Delete("delete from tt_user where id =#{id}") void deleteUserById(String id);
動(dòng)態(tài)SQL語(yǔ)句
@SelectProvider(type = UserDaoSqlProvider.class,method = "findUserByName") List<User> findUserByName(String username) throws IOException;
public String findUserByName(String username){ //return "select * from tt_user where username like '" +username+"'"; String sql = new SQL() {{ SELECT("*"); FROM("tt_user"); if (username!=null&&!username.isEmpty()){ WHERE("username like "+username ); } }}.toString(); System.out.println("sql="+sql); return sql; }
Mybatis提供了一個(gè)匿名內(nèi)部類
另一種寫(xiě)法:
public String getxxx(){ return new SQL().UPDATE("PERSON") .SET("FULL_NAME = #{fullName}", "DATE_OF_BIRTH = #{dateOfBirth}") .WHERE("ID = #{id}") .toString(); } }
Mybatis對(duì)ORM層的優(yōu)化
緩存
查了一次,結(jié)果保存在本地,下次查相同內(nèi)容的時(shí)候就不用再去訪問(wèn)數(shù)據(jù)庫(kù)了。
懶加載
Lazyloading:先加載主信息,在需要的時(shí)候再去加載關(guān)聯(lián)數(shù)據(jù)
Mybatis中ResultMap中的association和Collection標(biāo)簽具有懶加載的功能
- 默認(rèn)情況沒(méi)有懶加載
- 如何開(kāi)啟懶加載呢?
在主配置文件中的configuration標(biāo)簽下配置
<!--全局懶加載--> <settings> <!--開(kāi)關(guān)--> <setting name="lazyLoadingEnabled" value="true"/> </settings>
- 局部懶加載配置
在從配置文件中的association或者collection里邊添加fetchType字段(fetch翻譯是拿、?。?/p>
<resultMap id="studentAndCourses" type="com.bamzhy.bean.Student"> <id column="id" property="id"></id> <collection property="courses" javaType="list" select="com.bamzhy.dao.UserDao.findcourseBySid" column="id" fetchType="eager"> <id column="cid" property="cid"></id> </collection> </resultMap>
- 全局懶加載和局部懶加載同時(shí)出現(xiàn)時(shí),以局部懶加載優(yōu)先
MyBatis緩存機(jī)制
- 一級(jí)緩存指的就是sqlsession,在sqlsession中有一個(gè)數(shù)據(jù)區(qū)域,是map結(jié)構(gòu),這個(gè)區(qū)域就是一級(jí)緩存區(qū)域。
- 查詢同一個(gè)對(duì)象(使用同一個(gè)session)時(shí),第二次查詢并不會(huì)調(diào)用sql語(yǔ)句,而是從sqlsession中取數(shù)據(jù)。
- 開(kāi)啟一級(jí)緩存:默認(rèn)開(kāi)啟
- 驗(yàn)證一級(jí)緩存存在
我查了兩次,但是只執(zhí)行了一次sql語(yǔ)句
現(xiàn)在在第一次查詢結(jié)束后關(guān)閉sqlSession,再重新new一個(gè)session出來(lái),
執(zhí)行查詢
果然,sql語(yǔ)句被執(zhí)行了兩次,可以證明一級(jí)緩存的確存在
二級(jí)緩存
二級(jí)緩存指的就是同一個(gè)namespace下的mapper,二級(jí)緩存中,也有一個(gè)map結(jié)構(gòu),這個(gè)區(qū)域就是二級(jí)緩存區(qū)域。
- 開(kāi)啟二級(jí)緩存
主配置文件里邊:
從配置文件:
注意點(diǎn) cache對(duì)象需要實(shí)現(xiàn)序列化接口,否則會(huì)報(bào)Error serializing object
- 測(cè)試二級(jí)緩存
雖然我關(guān)閉了sqlsession,但仍然沒(méi)有執(zhí)行兩次sql。
說(shuō)明二級(jí)緩存的確存在
- 如果不關(guān)閉一級(jí)緩存,那么二級(jí)緩存就不生效。
比如我創(chuàng)建了一個(gè)sqlsession,不關(guān)閉,再創(chuàng)建一個(gè)sqlsession,那么二級(jí)緩存看見(jiàn)第一個(gè)sqlsession沒(méi)有關(guān)閉(一級(jí)緩存生效了),二級(jí)緩存他就不生效了。事實(shí)上這倆session不是同一個(gè)session,二級(jí)緩存也沒(méi)生效,這樣要執(zhí)行兩次sql語(yǔ)句。
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
POI導(dǎo)出Excel報(bào)錯(cuò)No such file or directory的解決方法
這篇文章主要為大家詳細(xì)介紹了POI導(dǎo)出Excel報(bào)錯(cuò)No such file or directory的解決方法,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-11-11Java中String字符串常量池和intern方法源碼分析
在之前的文章中,小編給大家介紹了String字符串的不可變性及其實(shí)現(xiàn)原理,其中給大家提到了字符串常量池的概念,那么什么是常量池,String字符串與常量池有什么關(guān)系,本文給大家嘮嘮字符串常量池及String#intern()方法的作用,需要的朋友可以參考下2023-05-05Java多態(tài)(動(dòng)力節(jié)點(diǎn)Java學(xué)院整理)
多態(tài)是指允許不同類的對(duì)象對(duì)同一消息做出響應(yīng)。即同一消息可以根據(jù)發(fā)送對(duì)象的不同而采用多種不同的行為方式。接下來(lái)通過(guò)本文給大家介紹java多態(tài)相關(guān)知識(shí),感興趣的朋友一起學(xué)習(xí)吧2017-04-04Java(JDK/Tomcat/Maven)運(yùn)行環(huán)境配置及工具(idea/eclipse)安裝詳細(xì)教程
這篇文章主要介紹了Java(JDK/Tomcat/Maven)運(yùn)行環(huán)境配置及工具(idea/eclipse)安裝,本文給大家介紹的非常想詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2021-03-03java poi導(dǎo)出excel時(shí)如何設(shè)置手動(dòng)換行
這篇文章主要介紹了java poi導(dǎo)出excel時(shí)如何設(shè)置手動(dòng)換行,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-06-06使用spring框架實(shí)現(xiàn)數(shù)據(jù)庫(kù)事務(wù)處理方式
這篇文章主要介紹了使用spring框架實(shí)現(xiàn)數(shù)據(jù)庫(kù)事務(wù)處理方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-10-10java獲取版本號(hào)及字節(jié)碼編譯版本方法示例
這篇文章主要給大家介紹了關(guān)于java獲得版本號(hào)及字節(jié)碼編譯版本的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家學(xué)習(xí)或使用java具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧。2017-10-10學(xué)會(huì)Java字節(jié)碼指令,成為技術(shù)大佬
Java 字節(jié)碼指令是 JVM 體系中非常難啃的一塊硬骨頭,我估計(jì)有些讀者會(huì)有這樣的疑惑,“Java 字節(jié)碼難學(xué)嗎?我能不能學(xué)會(huì)???”本文帶領(lǐng)大家一探究竟,幫助大家搞懂java底層代碼如何執(zhí)行2021-08-08