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語句
@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)部類

另一種寫法:
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í)候就不用再去訪問數(shù)據(jù)庫了。
懶加載
Lazyloading:先加載主信息,在需要的時(shí)候再去加載關(guān)聯(lián)數(shù)據(jù)
Mybatis中ResultMap中的association和Collection標(biāo)簽具有懶加載的功能
- 默認(rèn)情況沒有懶加載
- 如何開啟懶加載呢?
在主配置文件中的configuration標(biāo)簽下配置
<!--全局懶加載-->
<settings>
<!--開關(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語句,而是從sqlsession中取數(shù)據(jù)。
- 開啟一級(jí)緩存:默認(rèn)開啟
- 驗(yàn)證一級(jí)緩存存在

我查了兩次,但是只執(zhí)行了一次sql語句

現(xiàn)在在第一次查詢結(jié)束后關(guān)閉sqlSession,再重新new一個(gè)session出來,

執(zhí)行查詢

果然,sql語句被執(zhí)行了兩次,可以證明一級(jí)緩存的確存在
二級(jí)緩存
二級(jí)緩存指的就是同一個(gè)namespace下的mapper,二級(jí)緩存中,也有一個(gè)map結(jié)構(gòu),這個(gè)區(qū)域就是二級(jí)緩存區(qū)域。
- 開啟二級(jí)緩存
主配置文件里邊:
從配置文件: 
注意點(diǎn) cache對(duì)象需要實(shí)現(xiàn)序列化接口,否則會(huì)報(bào)Error serializing object
- 測(cè)試二級(jí)緩存

雖然我關(guān)閉了sqlsession,但仍然沒有執(zhí)行兩次sql。

說明二級(jí)緩存的確存在
- 如果不關(guān)閉一級(jí)緩存,那么二級(jí)緩存就不生效。
比如我創(chuàng)建了一個(gè)sqlsession,不關(guān)閉,再創(chuàng)建一個(gè)sqlsession,那么二級(jí)緩存看見第一個(gè)sqlsession沒有關(guān)閉(一級(jí)緩存生效了),二級(jí)緩存他就不生效了。事實(shí)上這倆session不是同一個(gè)session,二級(jí)緩存也沒生效,這樣要執(zhí)行兩次sql語句。
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
SpringBoot使用Interceptor攔截器的實(shí)例
這篇文章主要介紹了SpringBoot使用Interceptor攔截器的相關(guān)知識(shí),本文通過實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2023-03-03
分享Spring Boot 3.x微服務(wù)升級(jí)歷程
Spring Boot 3.0.0 GA版已經(jīng)發(fā)布,好多人也開始嘗試升級(jí),有人測(cè)試升級(jí)后,啟動(dòng)速度確實(shí)快了不少,這篇文章主要介紹了Spring Boot 3.x微服務(wù)升級(jí)經(jīng)歷,需要的朋友可以參考下2022-12-12
java定時(shí)任務(wù)cron表達(dá)式每周執(zhí)行一次的坑及解決
這篇文章主要介紹了java定時(shí)任務(wù)cron表達(dá)式每周執(zhí)行一次的坑及解決,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-06-06
深入分析Spring Cloud 負(fù)載均衡器架構(gòu)選型
文章詳細(xì)介紹了OpenFeign的初始化和執(zhí)行流程,包括FeignClient注解、FeignClientsRegistrar類、FeignClientFactoryBean工廠類、Targeter接口及其實(shí)現(xiàn)等,感興趣的朋友一起看看吧2024-12-12
mysql+spring+mybatis實(shí)現(xiàn)數(shù)據(jù)庫讀寫分離的代碼配置
今天小編就為大家分享一篇關(guān)于mysql+spring+mybatis實(shí)現(xiàn)數(shù)據(jù)庫讀寫分離的代碼配置,小編覺得內(nèi)容挺不錯(cuò)的,現(xiàn)在分享給大家,具有很好的參考價(jià)值,需要的朋友一起跟隨小編來看看吧2019-03-03
SpringBoot Mybatis Plus公共字段自動(dòng)填充功能
這篇文章主要介紹了SpringBoot Mybatis Plus公共字段自動(dòng)填充功能的相關(guān)資料,需要的朋友可以參考下2017-04-04

