Java面試題 - 03前言:三、框架篇:

前言:

再接着Java面試題 - 02,說說剩下的內容。

三、框架篇:

(三)、mybatis

1. JDBC編程有什麼不足?mybatis是如何解決的? 答:主要有以下幾個方面:

  • JDBC中數據庫連接創建、釋放頻繁造成系統資源浪費從而影響系統性能 mybatis解決:在mybatis配置文件中配置數據連接池,使用連接池管理數據庫連接。
  • Sql語句寫在代碼中造成代碼不易維護,實際應用sql變化的可能較大,sql變動需要改變java代碼。 mybatis解決:將Sql語句配置在mapper.xml文件中,與java代碼分離。
  • 向 sql 語句傳參數麻煩,因爲 sql 語句的 where 條件不一定,可能多也可能少,佔位符需要和參數一一對應。 mybatis解決: Mybatis自動將java對象映射至sql語句。
  • 對結果集解析麻煩,sql變化導致解析代碼變化,且解析前需要遍歷。 mybatis解決:Mybatis自動將sql執行結果映射至java對象。

2. mybatis編程步驟是怎樣的? 答:步驟如下:

  • 創建SqlSessionFactory
  • 通過SqlSessionFactory創建 SqlSession
  • 通過sqlsession執行數據庫操作
  • 調用session.commit()提交事務
  • 調用session.close()關閉會話

3. Mybatis中#和$的區別? 答: 使用${參數}就是單純的字符串拼接,拼接完成後纔會對SQL進行編譯、執行,所以性能較低;#{參數名}在SQL中相當於一個參數佔位符“?”,用來補全預編譯語句,所有這種方式可以防止SQL注入,它補全預編譯語句時,會在此參數值兩端加了單引號。但是有些地方必須要用$,比如參數是表名的時候:${表名},因爲如果使用#,sql語句就會變成 '表名',會加上單引號,這樣就找不到該表。總之,能用#就不要用$。

4. 使用MyBatis的mapper接口調用時有哪些要求? 答:有以下規則:

  • Mapper接口方法名和mapper.xml中對應的sql的id相同 ;
  • Mapper接口方法的輸入參數類型和mapper.xml中對應的sql 的parameterType的類型相同 ;
  • Mapper接口方法的輸出參數類型和mapper.xml中對應的sql的resultType的類型相同 ;
  • Mapper.xml文件中的namespace即是mapper接口的類路徑。

5. 談談mybatis中的一級緩存和二級緩存。 答:

  • 一級緩存: 基於 PerpetualCache 的 HashMap 本地緩存,其存儲作用域爲 Session,當 Session flush 或 close 之後,該Session中的所有 Cache 就將清空。
  • 二級緩存與一級緩存其機制相同,默認也是採用 PerpetualCache,HashMap存儲,不同在於其存儲作用域爲 Mapper(Namespace),即對該namespance對應的配置文件中所有的select操作結果都緩存,這樣不同線程之間就可以共用二級緩存。並且可自定義存儲源,如 Ehcache。啓動二級緩存:在mapper配置文件中加上:<cache />。

6. 在進行插入操作時如何回傳ID? 答:在insert標籤中配置如下屬性即可:

<insert id="insert" parameterType="com.test.User" keyProperty="userId" useGeneratedKeys="true" > 
   ......
</insert>

用keyProperty指定Id屬性,把useGeneratedKeys設置爲true即可。

7. mapper接口工作原理是什麼? 答:mapper接口的工作原理是JDK動態代理,Mybatis運行時會使用JDK動態代理爲mapper接口生成代理對象,代理對象會攔截接口方法,轉而執行對應的sql,然後將sql執行結果返回。

8. mapper接口裏的方法可以重載嗎?爲什麼? 答:不能重載。對應的xml映射文件是根據方法名將方法與sql語句綁定的,如果重載,將無法區分綁定哪個方法。

9. 你瞭解mybatis的動態SQL嗎? 答:動態SQL可以完成邏輯判斷和動態拼接sql的功能。在mybatis的xml映射文件中,我們可以標籤的形式編寫動態sql。常用的動態sql標籤有<if>、<where>、<set>等。

10. Mybatis是否支持延遲加載?如果支持,它的實現原理是什麼? 答:Mybatis僅支持association關聯對象和collection關聯集合對象的延遲加載,association指的就是一對一,collection指的就是一對多查詢。在Mybatis配置文件中,可以配置lazyLoadingEnabled=true來啓用延遲加載。它的原理是使用CGLIB創建目標對象的代理對象,當調用目標方法時,進入攔截器方法,比如調用a.getB().getName(),攔截器invoke()方法發現a.getB()是null值,那麼就會單獨發送事先保存好的查詢B對象的sql,把B查詢上來,然後調用a.setB(b),於是a的對象b屬性就有值了,接着完成a.getB().getName()方法的調用。這就是延遲加載的基本原理。

(四)、hibernate

1. 簡單的說一下hibernate的開發流程。 答:步驟如下:

  • 加載 hibernate 的配置文件,讀取其他配置文件(jdbc.properties、表與對象關係映射文件);
  • 創建 SessionFactory 會話工廠;
  • 打開 session 獲取連接,構造 session 對象(一次會話維持一個數據連接,也是一級緩存)
  • 開啓事務;
  • 使用session進行操作 ;
  • 提交事務;
  • 關閉session;
  • 關閉SessionFactory 。

2. 說說hibernate中對象的三種狀態。 答:hibernate中,對象有以下3種狀態:

  • 臨時態:直接new出來的對象,不處於session的管理,數據庫中沒有對象的記錄;調用save方法後就變成持久態。
  • 持久態:當調用session的save/saveOrUpdate/get/load/list等方法的時候,對象就是持久化狀態。處於session的管理,數據庫中有對應的記錄;調用delete方法後變成臨時態,調用session.close()後就變成了遊離態。
  • 遊離態:Session關閉後,對象的狀態就是遊離態。不處於session的管理,數據庫中有對應的記錄;調用update方法後又變成持久態。

3. 你知道hibernate的緩存嗎? 答:使用緩存的目的就是減少對數據庫的訪問次數,以提高hibernate的執行效率。hibernate有一級緩存和二級緩存之分:

  • 一級緩存:也叫做session的緩存,它可以在session範圍內減少數據庫的訪問次數,只在session範圍有效,Session關閉,一級緩存失效,不同的session不會共享緩存數據。當調用session的 save/saveOrUpdate/get/load/list/iterator 方法的時候,都會把對象放入session的緩存中。 Session的緩存由hibernate維護, 用戶不能操作緩存內容; 如果想操作緩存內容,必須通過hibernate提供的evit/clear方法操作。
  • 二級緩存:Hibernate提供了基於應用程序級別的緩存, 可以跨多個session,即不同的session都可以訪問緩存數據。 這個緩存也叫二級緩存。Hibernate提供的二級緩存有默認的實現,且是一種可插配的緩存框架!如果用戶想用二級緩存,只需要在hibernate.cfg.xml中配置即可,不想用,直接移除配置即可。如果用戶覺得hibernate提供的緩存框架不好用,可以換其他的緩存框架或自己實現緩存框架都可以。

4. hibernate有幾種查詢方式? 答:hibernate有3種查詢方式:

  • HQL查詢:面向對象的查詢語言,提供了豐富靈活的查詢方式。例子:
String hql = "select userName from User"; // userName是實體類屬性名而非表的字段名,User是實體類名
Query query = session.createQuery(hql);
List<Object> nameList = query.list();
  • QBC(Query By Criteria)查詢:Criteria對象提供了一種面向對象的方式查詢數據庫。Criteria對象需要使用Session對象來獲得。例子:
Criteria c = session.createCriteria(User.class);
c.add(Restrictions.eq("userName", "James"));
List<User> userList = c.list();
  • 原生SQL查詢:就是使用原生的SQL語句進行查詢。例子:
String sql = "select id,username,userpwd from t_user";
List list = session.createSQLQuery(sql).list();

5. hibernate的ORM思想你瞭解多少? 答:ORM 指的是對象關係映射(Object RelationShip Mapping ),指的就是實體類對象和數據庫中的表關係進行一一對應,實現通過操作實體類對象來更改數據庫裏邊的數據信息。這就是對象關係映射。hibernate框架也是一個orm框架,主要是通過主配置文件和實體類對應的映射配置文件來實現對象關係映射。

6. 你知道hibernate的懶加載嗎? 答:通過設置lazy屬性開啓懶加載(hibernate3之後默認開啓)。當Hibernate在查詢數據的時候,數據並沒有存在與內存中,當程序真正對數據的操作時,對象才存在與內存中,就實現了延遲加載,節省了服務器的內存開銷,從而提高了服務器的性能。比如使用hibernate進行查詢,可以使用get方法,也可以使用load方法,get方法不支持懶加載,而load方法支持。get方法會先查一級緩存,再查二級緩存,然後查數據庫,如果沒有找到會返回null。load方法會先查一級緩存,如果沒有找到,就創建代理對象,等需要的時候去查詢二級緩存和數據庫。也就是說,使用load方法的時候,並不會立刻去數據庫查找,等你真的要用到該對象的時候,纔會去數據庫查找,這就是懶加載。

7. hibernate和mybatis有何異同? 答:異同如下: (1).相同點:

  • Hibernate與MyBatis都是由XML配置文件生成SessionFactory,然後由SessionFactory 生成 Session,最後由 Session 來開啓執行事務和 SQL 語句。其中兩者的SessionFactory,Session的生命週期都是差不多的。
  • Hibernate和MyBatis都支持JDBC和JTA事務處理。

(2).不同點:

  • hibernate是全自動,而mybatis是半自動。hibernate完全可以通過對象關係模型實現對數據庫的操作,會自動生成sql。而mybatis僅有基本的字段映射,對數據的操作還需要自己編寫sql來實現。
  • hibernate數據庫移植性遠大於mybatis。因爲hibernate不需要自己編寫sql語句,所有與數據庫解耦;而mybatis由於需要手寫sql,因此與數據庫的耦合性直接取決於程序員寫sql的方法,如果sql不具通用性,用了很多數據庫特性的sql語句的話,移植性也會隨之降低很多,成本很高。
  • hibernate擁有完整的日誌系統,mybatis則欠缺一些。hibernate日誌系統非常健全,涉及廣泛,而mybatis則除了基本記錄功能外,功能薄弱很多。
  • sql優化上,mybatis要比hibernate方便很多。由於mybatis的sql都是寫在xml裏,因此優化sql比hibernate方便很多。而hibernate的sql很多都是自動生成的,無法直接維護sql。

總的來說,mybatis小巧靈活,易於使用,而hibernate學習成本相對較高,數據庫移植性好。

8. 談談Hibernate中inverse的作用。 答:inverse屬性默認是false,就是說雙方都維護關聯關係。 比如Student和Teacher是多對多關係,用一箇中間表TeacherStudent維護。如果Student這邊inverse=”true”, 那麼關係就由Teacher維護,就是說當插入Student時,不會操作TeacherStudent表。只有Teacher插入或刪除時纔會觸發對中間表的操作。所以兩邊都inverse=”true”是不對的,會導致任何操作都不觸發對中間表的影響;當兩邊都inverse=”false”或默認時,會導致在中間表中插入兩次關係。

9. Hibernate有哪些核心接口? 答:有如下核心接口:

  • Configuration 接口:配置Hibernate,根據其啓動hibernate,創建SessionFactory 對象;
  • SessionFactory 接口:初始化Hibernate,充當數據存儲源的代理,創建session 對象,sessionFactory 是線程安全的,意味着它的同一個實例多個線程共享;
  • Session 接口:負責保存、更新、刪除、加載和查詢對象,是線程不安全的, 避免多個線程共享同一個session;
  • Transaction 接口:管理事務;
  • Query 和Criteria 接口:執行數據庫的查詢。

(五)、Redis

1. 什麼是redis? 答:redis是使用C語言編寫的典型的NoSQL數據庫,它是一個key-value存儲系統,數據存儲在內存中,所以存取速度非常快。

2. 爲什麼redis要把數據放到內存中? 答:Redis爲了達到最快的讀寫速度將數據都讀到內存中,並定期將數據寫入磁盤。如果不將數據放在磁盤中,會嚴重影響 redis 的性能。

3. redis支持哪些數據類型? 答:redis有5種基本數據類型,分別是String(字符串)、Hash(字典)、List(列表)、Set(集合)、Zset(有序集合)。

4. 說說redis的優缺點。 答:優缺點如下: (1). 優點:

  • 由於是基於內存的,所以性能極高。
  • 支持豐富的數據類型。
  • Redis 的所有操作都是原子性的。

(2). 缺點:

  • 由於是內存數據庫,所以單臺機器存儲的數據量,跟機器本身的內存大小。
  • 如果進行完整重同步,由於需要生成 rdb 文件並進行傳輸,會佔用主機的 CPU,消耗帶寬。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章