最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Java面試題沖刺第九天--MyBatis

 更新時間:2021年07月13日 17:16:41   作者:_陳哈哈  
這篇文章主要為大家分享了最有價值的三道MyBatis框架面試題,涵蓋內(nèi)容全面,包括數(shù)據(jù)結(jié)構(gòu)和算法相關(guān)的題目、經(jīng)典面試編程題等,感興趣的小伙伴們可以參考一下

面試題1:你怎么理解ORM框架,常見的ORM框架都有哪些?

正經(jīng)回答:

對象關(guān)系映射(Object Relational Mapping,簡稱ORM),主要實現(xiàn)程序?qū)ο蟮疥P(guān)系數(shù)據(jù)庫數(shù)據(jù)的映射。

在這里插入圖片描述

JAVA編程免不了和數(shù)據(jù)庫打交道,那么如何高效便捷地操作數(shù)據(jù)庫,也是一個需要應(yīng)對的問題,原生的基于JDBC的方式非常低效,而且要寫一大堆無用的模板代碼,不值得選取。ORM是對JDBC的封裝,讓我們不需要重復(fù)的造輪子,目前已經(jīng)有很多優(yōu)秀的ORM框架可供使用了,常見的比如Mybatis(batis)、Hibernate、Jpa、Jdo等。

優(yōu)點:

  • ORM是對JDBC的封裝,從而解決了JDBC的各種存在問題,提高效率
  • 使開發(fā)更加對象化
  • 可移植性強
  • 可以很方便地引入數(shù)據(jù)緩存之類的附加功能

缺點:

  • 自動化進(jìn)行關(guān)系數(shù)據(jù)庫的映射需要消耗少量系統(tǒng)性能。
  • 在處理多表聯(lián)查、where條件復(fù)雜之類的查詢時,ORM的語法會變得復(fù)雜。

市面上主流ORM框架:

  • EJB:重量級、高花費的ORM技術(shù),支持JPA,尤其是EJB3低侵入式 的設(shè)·計,增加了Annotation
  • Hibernate:開源,支持JPA ,被選作JBoss的持久層解決方案
  • iBatis:”SQL Mapping”框架,Apache軟件基金組織的子項目,后 轉(zhuǎn)Google Code旗下,ibatis3.x正式更名為Mybatis
  • Spring Data JPA:Spring框架中的子模塊
  • TopLink:Oracle公司的產(chǎn)品
  • Open JPA:Apache軟件基金組織的開源項目

追問1:大家都在用Mybatis,Mybatis都有哪些優(yōu)勢?

  • Mybatis入門簡單;在使用上,對于熟悉編寫SQL的同學(xué)來說,基本上是即學(xué)即用。
  • Mybatis對jdbc的抽象封裝程度更高,spring jdbc要想實現(xiàn)的細(xì)節(jié)很多,例如Mybatis封裝了更多的對象映射。
  • 支持注解,面對接口開發(fā),效率高,分分鐘解決一個sql。
  • 對于復(fù)雜的SQL,springJDBC編寫麻煩,動態(tài)SQL語句設(shè)計也麻煩,相比之下,Mybatis更加靈活且人性化。
  • mybatis的高度封裝,使得程序員可專注與業(yè)務(wù)層,開發(fā)效率高。所以選擇mybatis的開發(fā)公司多。

面試題2:相比較Hibernate與Mybatis,你有哪些看法?

正經(jīng)回答:

Hibernate與MyBatis都可以是通過SessionFactoryBuider由XML配置文件生成SessionFactory,然后由SessionFactory 生成Session,最后由Session來開啟執(zhí)行事務(wù)和SQL語句。其中SessionFactoryBuider,SessionFactory,Session的生命周期都是差不多的。

Hibernate和MyBatis都支持JDBC和JTA事務(wù)處理。

Mybatis優(yōu)勢

  • MyBatis可以進(jìn)行更為細(xì)致的SQL優(yōu)化,可以減少查詢字段。
  • MyBatis容易掌握,而Hibernate門檻較高。

Hibernate優(yōu)勢

  • Hibernate的DAO層開發(fā)比MyBatis簡單,Mybatis需要維護(hù)SQL和結(jié)果映射。
  • Hibernate對對象的維護(hù)和緩存要比MyBatis好,對增刪改查的對象的維護(hù)要方便。
  • Hibernate數(shù)據(jù)庫移植性很好,MyBatis的數(shù)據(jù)庫移植性不好,不同的數(shù)據(jù)庫需要寫不同SQL。
  • Hibernate有更好的二級緩存機制,可以使用第三方緩存。MyBatis本身提供的緩存機制不佳。

在這里插入圖片描述

摘自某乎上的經(jīng)典總結(jié):

Hibernate

  • Hibernate功能強大,數(shù)據(jù)庫無關(guān)性好,O/R映射能力強,如果你對Hibernate相當(dāng)精通,而且對Hibernate進(jìn)行了適當(dāng)?shù)姆庋b,那么你的項目整個持久層代碼會相當(dāng)簡單,需要寫的代碼很少,開發(fā)速度很快,非常爽。
  • Hibernate的缺點就是學(xué)習(xí)門檻不低,要精通門檻更高,而且怎么設(shè)計O/R映射,在性能和對象模型之間如何權(quán)衡取得平衡,以及怎樣用好Hibernate方面需要你的經(jīng)驗和能力都很強才行。

MyBatis

  • MyBatis入門簡單,即學(xué)即用,提供了數(shù)據(jù)庫查詢的自動對象綁定功能,而且延續(xù)了很好的SQL使用經(jīng)驗,對于沒有那么高的對象模型要求的項目來說,相當(dāng)完美。
  • MyBatis的缺點就是框架還是比較簡陋,功能尚有缺失,雖然簡化了數(shù)據(jù)綁定代碼,但是整個底層數(shù)據(jù)庫查詢實際還是要自己寫的,工作量也比較大,而且不太容易適應(yīng)快速數(shù)據(jù)庫修改。 深入追問: 追問1:Hibernate與Mybatis 的緩存機制都有哪些區(qū)別?

相同點:

Hibernate和Mybatis的二級緩存除了采用系統(tǒng)默認(rèn)的緩存機制外,都可以通過實現(xiàn)你自己的緩存或為其他第三方緩存方案,創(chuàng)建適配器來完全覆蓋緩存行為。

不同點:

Hibernate的二級緩存配置在SessionFactory生成的配置文件中進(jìn)行詳細(xì)配置,然后再在具體的表-對象映射中配置是那種緩存。

MyBatis的二級緩存配置都是在每個具體的表-對象映射中進(jìn)行詳細(xì)配置,這樣針對不同的表可以自定義不同的緩存機制。并且Mybatis可以在命名空間中共享相同的緩存配置和實例,通過Cache-ref來實現(xiàn)。

兩者比較:   因為Hibernate對查詢對象有著良好的管理機制,用戶無需關(guān)心SQL。所以在使用二級緩存時如果出現(xiàn)臟數(shù)據(jù),系統(tǒng)會報出錯誤并提示。

而MyBatis在這一方面,使用二級緩存時需要特別小心。如果不能完全確定數(shù)據(jù)更新操作的波及范圍,避免Cache的盲目使用。否則,臟數(shù)據(jù)的出現(xiàn)會給系統(tǒng)的正常運行帶來很大的隱患。

面試題3:Mybatis中的#{}和${}有哪些區(qū)別

正經(jīng)回答:

-- #{}
<select id="userLogin" parameterType="java.util.Map" resultMap="userResMap">
select id, username, password, role
from user
where username = #{username}
and password = #{password}
</select>
-- ${}
<select id="userLogin" parameterType="java.util.Map" resultMap="userResMap">
select id, username, password, role
from user
where username = ${username}
and password = ${password}
</select>

1.#將傳入的數(shù)據(jù)都當(dāng)成一個字符串,會對自動傳入的數(shù)據(jù)加一個雙引號。

如:where username=#{username},如果傳入的值是111,那么解析成sql時的值為where username=“111”, 如果傳入的值是id,則解析成的sql為where username=“id”.

2.$將傳入的數(shù)據(jù)直接顯示生成在sql中。

如:where username=${username},如果傳入的值是111,那么解析成sql時的值為where username=111;

那么,如果傳入的值是:;drop table user;會怎么樣?解析后的sql為:

select id, username, password, role from user where username=;drop table user;

#方式能夠很大程度防止sql注入,$方式無法防止Sql注入。

$方式一般用于傳入數(shù)據(jù)庫對象,例如傳入表名;

一般能用#的就別用$,若不得不使用 “${xxx}” 這樣的參數(shù),要手工地做好過濾工作,來防止sql注入攻擊。

在MyBatis中,“${xxx}”這樣格式的參數(shù)會直接參與SQL編譯,從而不能避免注入攻擊。但涉及到動態(tài)表名和列名時,只能使用“${xxx}”這樣的參數(shù)格式。所以,這樣的參數(shù)需要我們在代碼中手工進(jìn)行處理來防止注入。

綜上,我們在編寫MyBatis的映射語句時,盡量采用“#{xxx}”這樣的格式。若不得不使用“${xxx}”這樣的參數(shù),要手工地做好過濾工作,來防止SQL注入攻擊。

深入追問:

追問1:什么是sql注入?

sql注入是一種代碼注入技術(shù),用于攻擊數(shù)據(jù)驅(qū)動的應(yīng)用,惡意的SQL語句被插入到執(zhí)行的實體字段中(例如,為了轉(zhuǎn)儲數(shù)據(jù)庫內(nèi)容給攻擊者)

在這里插入圖片描述

說到SQL注入,相信大家都不陌生,這是黑客同學(xué)常用的一種攻擊方式。攻擊者在界面的表單信息或URL上輸入一些奇怪的SQL片段(例如“or ‘1'='1'”這樣的語句),有可能入侵參數(shù)檢驗不足的應(yīng)用程序。

所以,在我們的應(yīng)用中需要做一些工作,來防備這樣的攻擊方式。在一些安全性要求很高的應(yīng)用中(比如銀行軟件),經(jīng)常使用將SQL語句全部替換為存儲過程這樣的方式,來防止SQL注入。這當(dāng)然是一種很安全的方式,但我們平時開發(fā)中,可能不需要這種死板的方式。

追問2:mybatis是如何做到防止sql注入的?

MyBatis框架作為一款半自動化的持久層框架,其SQL語句都要我們自己手動編寫,這個時候當(dāng)然需要防止SQL注入。其實,MyBatis的SQL是一個具有“輸入+輸出”的功能,類似于函數(shù)的結(jié)構(gòu),參考上面的兩個例子。

其中,parameterType表示了輸入的參數(shù)類型,resultType表示了輸出的參數(shù)類型?;貞?yīng)上文,如果我們想防止SQL注入,理所當(dāng)然地要在輸入?yún)?shù)上下功夫。上面代碼中使用#的即輸入?yún)?shù)在SQL中拼接的部分,傳入?yún)?shù)后,打印出執(zhí)行的SQL語句,會看到SQL是這樣的:

select id, username, password, role from user where username=? and password=?

不管輸入什么參數(shù),打印出的SQL都是這樣的。這是因為MyBatis啟用了預(yù)編譯功能,在SQL執(zhí)行前,會先將上面的SQL發(fā)送給數(shù)據(jù)庫進(jìn)行編譯;執(zhí)行時,直接使用編譯好的SQL,替換占位符“?”就可以了。因為SQL注入只能對編譯過程起作用,所以這樣的方式就很好地避免了SQL注入的問題。

總結(jié)

本篇文章就到這里了,希望能給你帶來幫助,也希望您能夠多多關(guān)注腳本之家的更多內(nèi)容!

相關(guān)文章

  • Spring Security使用單點登錄的權(quán)限功能

    Spring Security使用單點登錄的權(quán)限功能

    本文主要介紹了Spring Security使用單點登錄的權(quán)限功能,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2022-04-04
  • 使用XSD校驗Mybatis的SqlMapper配置文件的方法(1)

    使用XSD校驗Mybatis的SqlMapper配置文件的方法(1)

    這篇文章以前面對SqlSessionFactoryBean的重構(gòu)為基礎(chǔ),簡單的介紹了相關(guān)操作知識,然后在給大家分享使用XSD校驗Mybatis的SqlMapper配置文件的方法,感興趣的朋友參考下吧
    2016-11-11
  • Java簡單從文件讀取和輸出的實例

    Java簡單從文件讀取和輸出的實例

    下面小編就為大家?guī)硪黄狫ava簡單從文件讀取和輸出的實例。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-09-09
  • 解決Jenkins集成SonarQube遇到的報錯問題

    解決Jenkins集成SonarQube遇到的報錯問題

    本文給大家分享Jenkins集成SonarQube遇到的報錯問題及解決方法,本文通過圖文并茂的形式給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友參考下吧
    2021-07-07
  • 基于Spring@Autowired注解與自動裝配詳談

    基于Spring@Autowired注解與自動裝配詳談

    下面小編就為大家?guī)硪黄赟pring@Autowired注解與自動裝配詳談。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-10-10
  • jenkins安裝及其配置筆記

    jenkins安裝及其配置筆記

    這篇文章主要介紹了jenkins安裝及其配置筆記,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2019-01-01
  • Java 自定義動態(tài)數(shù)組方式

    Java 自定義動態(tài)數(shù)組方式

    這篇文章主要介紹了Java自定義動態(tài)數(shù)組方式,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2021-03-03
  • Spring中@PostConstruct注解的使用講解

    Spring中@PostConstruct注解的使用講解

    這篇文章主要介紹了Spring中@PostConstruct注解的使用講解,被@PostConstruct修飾的方法會在服務(wù)器加載Servlet的時候運行,并且只會被服務(wù)器執(zhí)行一次,PostConstruct在構(gòu)造函數(shù)之后執(zhí)行,init()方法之前執(zhí)行,PreDestroy()方法在destroy()方法之后執(zhí)行,需要的朋友可以參考下
    2023-11-11
  • Java使用jacob將微軟office中word、excel、ppt轉(zhuǎn)成pdf

    Java使用jacob將微軟office中word、excel、ppt轉(zhuǎn)成pdf

    這篇文章主要為大家詳細(xì)介紹了Java使用jacob將微軟office中word、excel、ppt轉(zhuǎn)成pdf,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2018-12-12
  • MyBatisPlus條件構(gòu)造器圖文實例詳解

    MyBatisPlus條件構(gòu)造器圖文實例詳解

    這篇文章主要介紹了MyBatisPlus條件構(gòu)造器,了解內(nèi)部原理是為了幫助我們做擴(kuò)展,同時也是驗證了一個人的學(xué)習(xí)能力,如果你想讓自己的職業(yè)道路更上一層樓,這些底層的東西你是必須要會的
    2023-01-01

最新評論

民和| 喀什市| 八宿县| 汉中市| 东山县| 青阳县| 建水县| 平和县| 偃师市| 株洲市| 山丹县| 黔西| 孝义市| 阿巴嘎旗| 孟津县| 临猗县| 甘肃省| 丹凤县| 洞口县| 土默特右旗| 慈利县| 海城市| 尚志市| 合作市| 合江县| 江门市| 沐川县| 嘉善县| 汽车| 达尔| 裕民县| 攀枝花市| 甘孜| 从江县| 晋城| 化德县| 威远县| 阿城市| 叙永县| 彰化县| 长葛市|