Mybatis 測試題

1、簡述自己對mybatis的理解,並簡述mybatis的優缺點
2、Mybatis是一個對象關係映射(Object Relational Mapping,簡稱ORM)框架,是爲了解決面向對象與關係數據庫存在的互不匹配的現象。也就是說Mybatis的關注點在於對象與數據庫之間的映射,Mybatis會把從數據庫中得到的鬆散數據進行封裝,使開發者直接拿到一個對象。Mybatis其實是對jdbc的操作數據庫的過程進行了封裝,使開發者只需要關注 SQL 本身,而不需要花費精力去處理例如註冊驅動、創建connection、創建statement、手動設置參數、結果集檢索等jdbc繁雜的過程代碼。
Mybaits的優點:
(1)基於SQL語句編程,相當靈活,不會對應用程序或者數據庫的現有設計造成任何影響,SQL寫在XML裏,解除sql與程序代碼的耦合,便於統一管理;提供XML標籤,支持編寫動態SQL語句,並可重用。
(2)與JDBC相比,減少了50%以上的代碼量,消除了JDBC大量冗餘的代碼,不需要手動開關連接;
MyBatis框架的缺點:
(1)SQL語句的編寫工作量較大,尤其當字段多、關聯表多時,對開發人員編寫SQL語句的功底有一定要求。
(2)SQL語句依賴於數據庫,導致數據庫移植性差,不能隨意更換數據庫。
2、當實體類中的屬性名和表中的字段名不一樣 ,怎麼辦 ?(不能修改屬性名和字段名)
在Mapper.xml映射文件中,寫SQL語句時起別名
在Mybatis全局配置文件中開啓駝峯命名
3、簡述如何利用mybatis實現批量刪除功能?
1.當collection=”array“時,表名參數爲數組;
2.當collection=”list“時,表名參數爲集合.

4、簡述在mybatis映射文件中如何獲取自動生成的(主)鍵值?
Mapper文件insert語句設置    useGeneratedKeys=“true” keyProperty=“id”
5、簡述mybatis傳遞參數的機制?

6、resultType:使用resultType實現較爲簡單,如果pojo中沒有包括查詢出來的列名,需要增加列名對應的屬性,即可完成映射。

如果沒有查詢結果的特殊要求建議使用resultType。

定義專門的po類作爲輸出類型,其中定義了sql查詢結果集所有的字段。此方法較爲簡單,企業中使用普遍。
resultMap:需要單獨定義resultMap,實現有點麻煩,如果對查詢結果有特殊的要求,使用resultMap可以完成將關聯查詢映射pojo的屬性中。
7、MyBatis中在查詢進行select映射的時候,返回類型可以用resultType,也可以用resultMap,resultType是直接表示返回類型的(對應着我們的model對象中的實體),而resultMap則是對外部ResultMap的引用(提前定義了db和model之間的隱射key–>value關係),但是resultType跟resultMap不能同時存在。
       在MyBatis進行查詢映射時,其實查詢出來的每一個屬性都是放在一個對應的Map裏面的,其中鍵是屬性名,值則是其對應的值。
       ①當提供的返回類型屬性是resultType時,MyBatis會將Map裏面的鍵值對取出賦給resultType所指定的對象對應的屬性。所以其實MyBatis的每一個查詢映射的返回類型都是ResultMap,只是當提供的返回類型屬性是resultType的時候,MyBatis對自動的給把對應的值賦給resultType所指定對象的屬性。
        ②當提供的返回類型是resultMap時,因爲Map不能很好表示領域模型,就需要自己再進一步的把它轉化爲對應的對象,這常常在複雜查詢中很有作用。
8、JDBC編程有哪些不足之處,MyBatis是如何解決這些問題的?
1、JDBC:數據庫鏈接創建、釋放頻繁造成系統資源浪費從而影響系統性能,如果使用數據庫鏈接池可解決此問題。

    MyBatis:在SqlMapConfig.xml中配置數據鏈接池,使用連接池管理數據庫鏈接。

    2、JDBC:Sql語句寫在代碼中造成代碼不易維護,實際應用sql變化的可能較大,sql變動需要改變java代碼。

    MyBatis:將Sql語句配置在XXXXmapper.xml文件中與java代碼分離。
    3、JDBC:向sql語句傳參數麻煩,因爲sql語句的where條件不一定,可能多也可能少,佔位符需要和參數一一對應。

    MyBatis: Mybatis自動將java對象映射至sql語句。
    4,JDBC:對結果集解析麻煩,sql變化導致解析代碼變化,且解析前需要遍歷,如果能將數據庫記錄封裝成pojo對象解析比較方便。

    MyBatis:Mybatis自動將sql執行結果映射至java對象。

9、簡述mybatis全局配置文件以及映射文件常用的標籤有哪些??
configuration 配置
  properties 屬性:可以加載properties配置文件的信息
  settings 設置:可以設置mybatis的全局屬性
  typeAliases 類型命名
  typeHandlers 類型處理器
  objectFactory 對象工廠
  plugins 插件
  environments 環境
    environment 環境變量
      transactionManager 事務管理器
      dataSource 數據源
  databaseIdProvider 數據庫廠商標識
  mappers 映射器10、mybatis常用註解有哪些??

11、mybatis如何傳遞多個參數??
使用HashMap傳遞多個參數  
使用JavaBean傳遞多個參數
@Param註解傳參法
順序傳參法

12、簡述mybatis運行機制是什麼?
1.讀取mybatis-config.xml配置文件,根據配置文件中的屬性組裝Configuration對象

2.由SqlSessionFactoryBuilder對象生成SqlSessionFactory對象

3.由SqlSessionFactory對象生成SqlSession對象

4.由SqlSession對象執行SQL語句
13、mybatis如何和spring整合?
不用寫mybatis映射文件,採用註解方式提供相應的sql語句和輸入參數
首先解析@Mapperscan,發現Import導入的類,執行類中的方法,這個類擴展了spring的掃描器,doScan方法,只掃描了所有接口。
之後將接口變成了對象:
1、首先拿到接口裏的beanDefinitions對象(用來描述bean的,記錄了bean的信息)
​ ps.spring創建對象跟接口無關,和bd有關
2、之後,接口無法直接產生對象,所以spring是產生MapperFactoryBean(FactoryBean對象),裏邊的getObject方法可以返回代理對象(動態代理),實現了接口
3、getObject方法中是:
​ getSqlSession().getMapper(this.mapperInterface) //生成mapper對象
​ ps.底層MapperProxy實現了jdk中動態代理的InvocationHandler,所以mapper.方法實際上就是調用了動態代理中的invoke方法(就是接口產生代理對象,然後調用的是invoke方法)
4、調用這個代理對象時,裏邊的invoke方法執行mapperMethod.execute方法,可以分別執行對應的CRUD操作。
5、那麼爲什麼getMapper(this.mapperInterface)需要傳接口呢?因爲返回代理對象,所以是接口。
​ ​ 那麼所有接口都變成了MapperFactoryBean對象後,又是如何區分的呢? definition.getConstructorArgumentValues().addGenericArgumentValue(definition.getBeanClassName());
​ 在生成MapperFactoryBean對象的時候,立即在一參構造中設置了一個值,這樣就有名稱了
​ ps.掃描遍歷過程中,defintion可以拿到每次傳進來的信息,和beanDefinitions相關
6、之後循環拿到所有構造方法,篩出有參,根據有參來創建對應名稱的MapperFactoryBean對象
14、mybatis中#{}和${}的區別是什麼?
Propertiessql{}是Properties文件中的變量佔位符,它可以用於標籤屬性值和sql內部,屬於靜態文本替換,比如{driver}會被靜態替換爲com.mysql.jdbc.Driver。#{}是sql的參數佔位符,Mybatis會將sql中的#{}替換爲?號,在sql執行前會使用PreparedStatement的參數設置方法,按序給sql的?號佔位符設置參數值,比如ps.setInt(0, parameterValue),#{item.name}的取值方式爲使用反射從參數對象中獲取item對象的name屬性值,相當於param.getItem().getName()。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章