? 首先,推薦一個(gè)免費(fèi)的云服務(wù)器提供商宋彼,三豐云弄砍,有了云服務(wù)器,我們使用ssh連接linux系統(tǒng)的云服務(wù)器输涕。
?? Mybatis框架的開(kāi)發(fā)模式有兩種:1音婶,基于XML文件配置的方式;2莱坎,基于注解方式的項(xiàng)目開(kāi)發(fā)衣式。一個(gè)項(xiàng)目的開(kāi)發(fā)通常不會(huì)混合使用兩種方式的。
同樣檐什,對(duì)應(yīng)的項(xiàng)目源碼倉(cāng)庫(kù)地在:https://github.com/Jesselinux/Java_Web
一碴卧,延遲加載:mybatis_test04_mysql_lazy
二,緩存:mybatis_test05_mysql_cache
首先操作MySQL數(shù)據(jù)庫(kù)厢汹,添加項(xiàng)目所需要的數(shù)據(jù)表格:
DROPTABLEIFEXISTS`user`;?CREATETABLE`user`(`id`int(11)NOTNULLauto_increment,`username`varchar(32)NOTNULLCOMMENT'用戶名稱',`birthday`datetimedefaultNULLCOMMENT'生日',`sex`char(1)defaultNULLCOMMENT'性別',`address`varchar(256)defaultNULLCOMMENT'地址',PRIMARYKEY(`id`))ENGINE=InnoDBDEFAULTCHARSET=utf8;???insertinto`user`(`id`,`username`,`birthday`,`sex`,`address`)values(41,'Jesse001','2018-02-27 17:47:08','男','北京'),(42,'Jesse002','2018-03-02 15:09:37','女','浙江 杭州'),(43,'Jesse508','2018-03-04 11:34:34','女','浙江 杭州'),(45,'jesse888','2018-03-04 12:04:06','男','浙江 杭州'),(46,'小明','2018-03-07 17:37:26','男','北京'),(48,'曉麗','2018-03-08 11:44:00','女','上海 楊浦');?????DROPTABLEIFEXISTS`account`;?CREATETABLE`account`(`ID`int(11)NOTNULLCOMMENT'編號(hào)',`UID`int(11)defaultNULLCOMMENT'用戶編號(hào)',`MONEY`doubledefaultNULLCOMMENT'金額',PRIMARYKEY(`ID`),KEY`FK_Reference_8`(`UID`),CONSTRAINT`FK_Reference_8`FOREIGNKEY(`UID`)REFERENCES`user`(`id`))ENGINE=InnoDBDEFAULTCHARSET=utf8;???insertinto`account`(`ID`,`UID`,`MONEY`)values(1,41,1000),(2,45,1000),(3,41,2000);???DROPTABLEIFEXISTS`role`;?CREATETABLE`role`(`ID`int(11)NOTNULLCOMMENT'編號(hào)',`ROLE_NAME`varchar(30)defaultNULLCOMMENT'角色名稱',`ROLE_DESC`varchar(60)defaultNULLCOMMENT'角色描述',PRIMARYKEY(`ID`))ENGINE=InnoDBDEFAULTCHARSET=utf8;???insertinto`role`(`ID`,`ROLE_NAME`,`ROLE_DESC`)values(1,'院長(zhǎng)','管理整個(gè)學(xué)院'),(2,'總裁','管理整個(gè)公司'),(3,'校長(zhǎng)','管理整個(gè)學(xué)校');?????DROPTABLEIFEXISTS`user_role`;?CREATETABLE`user_role`(`UID`int(11)NOTNULLCOMMENT'用戶編號(hào)',`RID`int(11)NOTNULLCOMMENT'角色編號(hào)',PRIMARYKEY(`UID`,`RID`),KEY`FK_Reference_10`(`RID`),CONSTRAINT`FK_Reference_10`FOREIGNKEY(`RID`)REFERENCES`role`(`ID`),CONSTRAINT`FK_Reference_9`FOREIGNKEY(`UID`)REFERENCES`user`(`id`))ENGINE=InnoDBDEFAULTCHARSET=utf8;?insertinto`user_role`(`UID`,`RID`)values(41,1),(45,1),(41,2);???
一螟深,延遲加載
? 即在需要用到數(shù)據(jù)時(shí)才進(jìn)行加載谐宙,不需要用到數(shù)據(jù)時(shí)就不加載數(shù)據(jù)烫葬。延遲加載也稱懶加載.
? 優(yōu)點(diǎn):先從單表查詢,需要時(shí)再?gòu)年P(guān)聯(lián)表去關(guān)聯(lián)查詢凡蜻,大大提高數(shù)據(jù)庫(kù)性能搭综,因?yàn)椴樵儐伪硪汝P(guān)聯(lián)查詢多張表速
度要快。
1划栓,配置SqlMapConfig.xml
<!-- 配置參數(shù) --><!-- 開(kāi)啟mybatis延遲加載 -->
? 本次只是將 Account 對(duì)象查詢出來(lái)放入 List 集合中兑巾,并沒(méi)有涉及到 User 對(duì)象,所以就沒(méi)有 發(fā)出 SQL 語(yǔ)句查詢賬戶所關(guān)聯(lián)的 User 對(duì)象的查詢忠荞。實(shí)現(xiàn)了延遲加載蒋歌。
二,緩存
? 一級(jí)緩存是 SqlSession 級(jí)別的緩存委煤,只要 SqlSession 沒(méi)有 flush 或 close堂油,它就存在。
二級(jí)緩存是 mapper 映射級(jí)別的緩存碧绞,多個(gè) SqlSession 去操作同一個(gè) Mapper 映射的 sql 語(yǔ)句府框,多個(gè)SqlSession 可以共用二級(jí)緩存,二級(jí)緩存是跨 SqlSession 的讥邻。
1迫靖,一級(jí)緩存:
配置IUserDao.xml院峡,useCache="true"
<!-- 根據(jù)id查詢賬戶列表 -->? ? ? ? select * from user where id = #{uid}?
? 我們可以發(fā)現(xiàn),雖然在上面的代碼中我們查詢了兩次系宜,但最后只執(zhí)行了一次數(shù)據(jù)庫(kù)操作照激,這就是 Mybatis 提 供給我們的一級(jí)緩存在起作用了。因?yàn)橐患?jí)緩存的存在盹牧,導(dǎo)致第二次查詢 id 為 50 的記錄時(shí)实抡,并沒(méi)有發(fā)出 sql 語(yǔ)句,從數(shù)據(jù)庫(kù)中查詢數(shù)據(jù)欢策,而是從一級(jí)緩存中查詢吆寨。
2,二級(jí)緩存
配置SqlMapConfig.xml
<!-- 配置開(kāi)啟二級(jí)緩存 -->?
? ?查看測(cè)試結(jié)果踩寇,我們發(fā)現(xiàn)執(zhí)行了兩次查詢啄清,并且在執(zhí)行第一次查詢后,我們關(guān)閉了一級(jí)緩存俺孙,再去執(zhí)行第二 次查詢時(shí)辣卒,我們發(fā)現(xiàn)并沒(méi)有對(duì)數(shù)據(jù)庫(kù)發(fā)出 sql 語(yǔ)句,所以此時(shí)的數(shù)據(jù)就只能是來(lái)自于我們所說(shuō)的二級(jí)緩存睛榄。
參考鏈接:https://mp.weixin.qq.com/s/KIP_67sAcXemOvQ6PA4Kag