SpringBoot + Mybatis

SpringBoot整合Mybatis有兩種常用的方式,一種是我們常見的XML的方式荚板,還有一種是全注解的方式凤壁。兩種方式的區(qū)別是吩屹,一個將SQL語句寫在XML配置文件中,一個寫在Java代碼中拧抖。

artifactId:mybatis-spring-boot-starter

一煤搜、全注解方式

1.注解

@Mapper:用于接口mapper上。

@Select, @Insert, @Update, @Delete:用于接口mapper的方法上唧席。

@Results & @Result:注釋@Select返回的結(jié)果集擦盾,關聯(lián)實體類屬性和數(shù)據(jù)庫字段一一對應,如果實體類屬性和數(shù)據(jù)庫字段名保持一致淌哟,就不需要這個屬性來修飾迹卢。如果實體類中有另一個實體類屬性(一對一),可以在@Result里加one=@One(select="method in mapper")徒仓。如果實體類中有另一個實體類集合屬性(一對多)腐碱,可以在@Result里加many=@Many(select="method in mapper")。例:

@Select("select * from t_user")

@Results({

@Result(property="userSex", column="user_sex", javaType=UserSexEnum.class),

@Result(property="nickName", column="nick_name"),

@Result(property="departmentId", column="department_id", one=@One(select="com.test.DepartMapper.findById")),

@Result(property="cars", column="id", many=@Many(select="com.test.CarMapper.findById"))

})

List<UserEntity> getAll();

@One @Many的總結(jié):

共同點:無論是一對一還是一對多掉弛,都是通過附屬查詢來實現(xiàn)的症见,我們需要定義這個附屬方法;在主查詢方法中通過@One @Many指定附屬查詢方法的全路徑殃饿;都通過column來傳遞參數(shù)給附屬方法筒饰。

不同點:一對一,那么附屬方法返回的是一個單獨的對象壁晒;一對多瓷们,那么附屬方法返回的是一個對象集合。

@Transactional:用于Service層的方法上秒咐。

@MapperScan:可用于SpringBoot啟動類上谬晕,表示動態(tài)掃描mapper所在包,與@Mapper作用相同携取。建議使用這種攒钳,不然每個Mapper加注解也挺麻煩的。

2.傳參方式

1)使用@Param雷滋,例:

@Insert("insert into user(id, name) values(#{id}, #{name})")

int insert(@Param("id") int id, @Param("name") String name);

2)使用Map不撑,例:

@Insert("insert into user(id, name) values(#{id, jdbcType.INTEGER}, #{name, jdbcType.VARCHAR})")

int insertByMap(Map<String, Object> map);

3)使用對象,例:

@Insert("insert into user(id, name) values(#{id}, #{name})")

int insertByUser(User user);

二晤斩、XML方式

@Mapper:用于接口DAO上焕檬,接口DAO的方法不會有@Select, @Insert, @Update, @Delete注解。

xxxMapper.xml配置文件澳泵,有以下標簽元素:

mapper(nameSpace="全路徑Mapper接口")实愚。

resultMap(id="名字,可被select引用", type="全路徑實體類"):select標簽返回的結(jié)果集,有子元素id(column, property, jdbcType)腊敲,result(column, property, jdbcType/javaType), association(property, column, javaType), collection(property, ofType, column, select)

association(property, column, javaType, select):關聯(lián)其他查詢一個對象的映射击喂。

collection(property, ofType, column, select):關聯(lián)其他查詢的集合,select屬性表示該結(jié)果的其他查詢方法(子查詢)碰辅。

sql(id)懂昂,元素值可以是all columns,可以被include(refid)引用没宾,include(refid)可以被select引用凌彬。

select(id, resultMap/resultType, ParameterType)

insert(id, parameterType)

update(id, parameterType)

delete(id, parameterType)

application.properties配置文件加入:

mybatis.mapper-locations=classpath:Mapper/*.xml

也可以加入以下配置文件,其中添加一些Mybatis基礎的配置:

mybatis.config-location=classpath:mybatis-config.xml

三榕吼、表與實體類關聯(lián)方法

如果實體類屬性與表中字段名完全相同,不需要進行配置勉失,默認對應關聯(lián)羹蚣。如果兩者不相同,可以有以下方法:

方法一:修改SQL語句乱凿,給表中字段起別名一一對應實體類中的屬性顽素。

方法二:在Mybatis的配置文件中開啟自動駝峰命名規(guī)則的映射,即從數(shù)據(jù)庫列名到Java屬性名的類似映射(該屬性作用于實體類的屬性徒蟆,對返回結(jié)果為map的key無效):

XML中配置文件config.xml中setting元素的配置:name="mapUnderscoreToCameCase" value="true"

注解中配置文件application.properties的配置:mybatis.configuration.mapUnderscoreToCameCase=true

四胁出、Map返回結(jié)果

如果是單條數(shù)據(jù),返回Map<String, Object>段审。如果是多條數(shù)據(jù)全蝶,返回List<Map<String, Object>>。結(jié)果集中存儲是按照{(diào)字段名1:字段值1寺枉,字段名2:字段值2}

五抑淫、Mybatis動態(tài)構(gòu)建SQL

注解方式:

1)腳本sql

(1)用<script>標簽包圍,然后像xml語法一樣書寫姥闪。

(2)SQL的拼接可以使用+號始苇,也可以使用逗號。我這里使用的是逗號筐喳,要使用+號可以把<script>前后的大括號去掉催式。

(2)實現(xiàn)IN查詢中 > 符號需要轉(zhuǎn)義為 > ,其中foreach的collection直接寫成@param中的值即可避归。

(3)這是一種使用注解完全替代XML的方法荣月,稍微復雜的SQL語句推薦使用XML方式。例:

@Select("<script>select * from user <if test=\"id !=null \">where id = #{id} </if></script>")

public List<User> findUserById(User user);

2)在方法中構(gòu)建sql梳毙,拼接SQL語句

@InsertProvider,@UpdateProvider,@DeleteProvider 和@SelectProvider喉童,來幫助構(gòu)建動態(tài) SQL 語句,然后讓MyBatis 執(zhí)行這些 SQL 語句。

3)結(jié)構(gòu)化SQL

可以使用SQL工具類來動態(tài)拼接SQL:

org.apache.ibatis.jdbc.SQL

XML方式:

在XML mapper文件中使用if, where, set, foreach, choose, when, otherwise, bind, sql, trim動態(tài)sql標簽堂氯。

六蔑担、分頁

使用com.github.pagehelper分頁插件。

七咽白、Mybatis緩存

mybatis提供查詢緩存啤握,用于減輕數(shù)據(jù)壓力,提高數(shù)據(jù)庫性能晶框。

mybaits提供一級緩存排抬,和二級緩存。

一級緩存是SqlSession級別的緩存授段。在操作數(shù)據(jù)庫時需要構(gòu)造 sqlSession對象蹲蒲,在對象中有一個(內(nèi)存區(qū)域)數(shù)據(jù)結(jié)構(gòu)(HashMap)用于存儲緩存數(shù)據(jù)。不同的sqlSession之間的緩存數(shù)據(jù)區(qū)域(HashMap)是互相不影響的侵贵。

一級緩存的作用域是同一個SqlSession届搁,在同一個sqlSession中兩次執(zhí)行相同的sql語句,第一次執(zhí)行完畢會將數(shù)據(jù)庫中查詢的數(shù)據(jù)寫到緩存(內(nèi)存)窍育,第二次會從緩存中獲取數(shù)據(jù)將不再從數(shù)據(jù)庫查詢卡睦,從而提高查詢效率。當一個sqlSession結(jié)束后該sqlSession中的一級緩存也就不存在了漱抓。Mybatis默認開啟一級緩存表锻。

二級緩存是mapper級別的緩存,多個SqlSession去操作同一個Mapper的sql語句乞娄,多個SqlSession去操作數(shù)據(jù)庫得到數(shù)據(jù)會存在二級緩存區(qū)域瞬逊,多個SqlSession可以共用二級緩存,二級緩存是跨SqlSession的仪或。

二級緩存是多個SqlSession共享的码耐,其作用域是mapper的同一個namespace,不同的sqlSession兩次執(zhí)行相同namespace下的sql語句且向sql中傳遞參數(shù)也相同即最終執(zhí)行相同的sql語句溶其,第一次執(zhí)行完畢會將數(shù)據(jù)庫中查詢的數(shù)據(jù)寫到緩存(內(nèi)存)骚腥,第二次會從緩存中獲取數(shù)據(jù)將不再從數(shù)據(jù)庫查詢,從而提高查詢效率瓶逃。Mybatis默認沒有開啟二級緩存需要在setting全局參數(shù)中配置開啟二級緩存束铭。

Spring與MyBatis整合時,MyBatis的一級緩存在沒有事務存在的時候失效厢绝。

在未開啟事務的情況之下契沫,每次查詢,spring都會關閉舊的sqlSession而創(chuàng)建新的sqlSession,因此此時的一級緩存是沒有啟作用的;

在開啟事務的情況之下昔汉,spring使用threadLocal獲取當前資源綁定同一個sqlSession懈万,因此此時一級緩存是有效的。

SpringBoot中默認幫我們?nèi)珠_啟了二級緩存,如果想要使用二級緩存還需要在mapper上注明会通。

注解版使用@CacheNamespace注解(為給定的命名空間(比如類)配置緩存口予,對應xml<cache>)在該mapper上使用二級緩存。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末涕侈,一起剝皮案震驚了整個濱河市沪停,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌裳涛,老刑警劉巖木张,帶你破解...
    沈念sama閱讀 212,383評論 6 493
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異端三,居然都是意外死亡舷礼,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,522評論 3 385
  • 文/潘曉璐 我一進店門郊闯,熙熙樓的掌柜王于貴愁眉苦臉地迎上來妻献,“玉大人,你說我怎么就攤上這事虚婿⌒荩” “怎么了泳挥?”我有些...
    開封第一講書人閱讀 157,852評論 0 348
  • 文/不壞的土叔 我叫張陵然痊,是天一觀的道長。 經(jīng)常有香客問我屉符,道長剧浸,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,621評論 1 284
  • 正文 為了忘掉前任矗钟,我火速辦了婚禮唆香,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘吨艇。我一直安慰自己躬它,他們只是感情好,可當我...
    茶點故事閱讀 65,741評論 6 386
  • 文/花漫 我一把揭開白布东涡。 她就那樣靜靜地躺著冯吓,像睡著了一般。 火紅的嫁衣襯著肌膚如雪疮跑。 梳的紋絲不亂的頭發(fā)上组贺,一...
    開封第一講書人閱讀 49,929評論 1 290
  • 那天,我揣著相機與錄音祖娘,去河邊找鬼失尖。 笑死,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的掀潮。 我是一名探鬼主播菇夸,決...
    沈念sama閱讀 39,076評論 3 410
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼胧辽!你這毒婦竟也來了峻仇?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,803評論 0 268
  • 序言:老撾萬榮一對情侶失蹤邑商,失蹤者是張志新(化名)和其女友劉穎摄咆,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體人断,經(jīng)...
    沈念sama閱讀 44,265評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡吭从,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,582評論 2 327
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了恶迈。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片涩金。...
    茶點故事閱讀 38,716評論 1 341
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖暇仲,靈堂內(nèi)的尸體忽然破棺而出步做,到底是詐尸還是另有隱情,我是刑警寧澤奈附,帶...
    沈念sama閱讀 34,395評論 4 333
  • 正文 年R本政府宣布全度,位于F島的核電站,受9級特大地震影響斥滤,放射性物質(zhì)發(fā)生泄漏将鸵。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 40,039評論 3 316
  • 文/蒙蒙 一佑颇、第九天 我趴在偏房一處隱蔽的房頂上張望顶掉。 院中可真熱鬧,春花似錦挑胸、人聲如沸痒筒。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,798評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽簿透。三九已至,卻和暖如春闷沥,著一層夾襖步出監(jiān)牢的瞬間萎战,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,027評論 1 266
  • 我被黑心中介騙來泰國打工舆逃, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留蚂维,地道東北人戳粒。 一個月前我還...
    沈念sama閱讀 46,488評論 2 361
  • 正文 我出身青樓,卻偏偏與公主長得像虫啥,于是被迫代替她去往敵國和親蔚约。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 43,612評論 2 350

推薦閱讀更多精彩內(nèi)容

  • SpringBoot整合Mybatis有兩種常用的方式涂籽,一種是我們常見的XML的方式苹祟,還有一種是全注解的方式。兩種...
    VivianMQ閱讀 525評論 0 1
  • 1评雌、MyBatis簡介 MyBatis 是一款優(yōu)秀的持久層框架 中文官網(wǎng):https://mybatis.org/...
    CHeng_c0e9閱讀 398評論 0 0
  • MyBatis 1. 概述: MyBatis是一個基于Java持久層的框架树枫,內(nèi)部封裝了JDBC,簡化了開發(fā)時對數(shù)據(jù)...
    青丶空閱讀 207評論 0 0
  • 一景东、重點知識 git 監(jiān)視的是文件內(nèi)容的修改 $ git checkout -- abc.txt : 其實是用版本...
    一花一世界yu閱讀 881評論 0 2
  • 目錄1 JDBC2 Mybaits概述3 Mybatis擴展4 Mybatis的加載和緩存5 Mybatis注解開...
    小小千千閱讀 477評論 0 2