Mybatis常見的面試題總結

什麼是Mybatis?

1. mybatis是一個半ORM框架,它內部封裝了JDBC,開發時只須要關乎sql語句自己,不須要花費精力去處理驅動,建立鏈接,建立1statement等繁複過程。 2. mybatis可使用xml或註解來配置和映射原生信息。將pijo映射成數據庫中的記錄,避免了幾乎全部的JDBC 代碼和手動設置參數以及獲取結果集。 3. 經過xm文件或註解的方式將要執行的各類statement配置起來,並通java對象和statement中sql的動態參數進行映射生成最終的sql語句,最後由mybatis框架執行sql並將結果映射java對象返回.java

Mybatis的優缺點?

優勢:

1. 基於sql語句編程,至關靈活,不會對應用程序或者數據庫的現有設計形成任何影響,sql寫在xml裏,解除了sql與程序代碼的耦合, 2. 可以與spring很好的集成, 3. 消除了JDBC的大量冗餘代碼,不須要手動開關鏈接,很好的與各類數據庫兼容spring

缺點:

1. sql語句編寫量偏多, 2. sql'語句依賴於數據庫,倒追數據庫移植性差,不能隨意更換數據庫.sql

Mybatis使用場合?

專一於sql自己,是一個足夠靈活的dao層解決方案.,對性能的要求很高,或者需求多變的項目,數據庫

#{}和${}的區別是什麼?

#{}是預編譯處理,${}是字符串替換。編程

Mybatis在處理#{}時,會將sql中的#{}替換爲?號,調用PreparedStatement的set方法來賦值;緩存

Mybatis在處理${}時,就是把${}替換成變量的值。安全

使用#{}能夠有效的防止SQL注入,提升系統安全性。session

當實體類的屬性名和表種字段名不一致怎麼辦?

有兩種解決方案:能夠在sql語句給字段名取別名,別名於實體類屬性名同名,也能夠用<resultMap>來映射字段名和實體類屬性名一一對應.mybatis

模糊查詢like語句該怎麼寫?

第一種:在java代碼添加sql通配符併發

<select id=」selectlike」>
     select * from foo where bar like #{value}
    </select>

第二種:在sql語句中拼接通配符,會引發sql注入

<select id=」selectlike」>
         select * from foo where bar like "%"#{value}"%"
    </select>

一般一個Xml映射文件,都會寫一個Dao接口與之對應,請問,這個Dao接口的工做原理是什麼?Dao接口裏的方法,參數不一樣時,方法能重載嗎?

Dao接口即Mapper接口。接口的全限名,就是映射文件中的namespace的值;接口的方法名,就是映射文件中Mapper的Statement的id值;接口方法內的參數,就是傳遞給sql的參數。 mapper接口是沒有實現類的,當調用接口方法時,接口全限名+方法名拼接字符串做爲key值,可惟必定位一個MapperStatement。在Mybatis中,每個<select>、<insert>、<update>、<delete>標籤,都會被解析爲一個MapperStatement對象。

mapper接口裏的方法是不能被重載的,由於是使用 全限名+方法名 的保存和尋找策略

Mybatis是如何將sql執行結果封裝爲目標對象並返回的?都有哪些映射形式?

第一種是使用<resultMap>標籤,逐必定義數據庫列名和對象屬性名之間的映射關係。

第二種是使用sql列的別名功能,將列的別名書寫爲對象屬性名。

有了列名與屬性名的映射關係後,Mybatis經過反射建立對象,同時使用反射給對象的屬性逐一賦值並返回,那些找不到映射關係的屬性,是沒法完成賦值的。

如何執行批量插入?

先建立一個簡單的插入語句

<insert id=」insertname」>
         insert into names (name) values (#{value})
    </insert>

而後在代碼執行下面的

list<string> names = new arraylist();
    names.add(「fred」);
    names.add(「barney」);
    names.add(「betty」);
    names.add(「wilma」);
 
    // 注意這裏 executortype.batch
    sqlsession sqlsession = sqlsessionfactory.opensession(executortype.batch);
    try {
     namemapper mapper = sqlsession.getmapper(namemapper.class);
     for (string name : names) {
         mapper.insertname(name);
     }
     sqlsession.commit();
    }catch(Exception e){
     e.printStackTrace();
     sqlSession.rollback(); 
     throw e; 
    }
     finally {
         sqlsession.close();
    }

如何獲取自動生成的(主)鍵值?

<insert id=」insertname」 usegeneratedkeys=」true」 keyproperty=」id」>
     insert into names (name) values (#{name})
</insert>

在mapper中如何傳遞多個參數?

(1)第一種:
//DAO層的函數
Public UserselectUser(String name,String area);  
//對應的xml,#{0}表明接收的是dao層中的第一個參數,#{1}表明dao層中第二參數,更多參數一致日後加便可。
<select id="selectUser"resultMap="BaseResultMap">  
    select *  fromuser_user_t   whereuser_name = #{0} anduser_area=#{1}  
</select>  
 
(2)第二種: 使用 @param 註解:
public interface usermapper {
   user selectuser(@param(「username」) string username,@param(「hashedpassword」) string hashedpassword);
}
而後,就能夠在xml像下面這樣使用(推薦封裝爲一個map,做爲單個參數傳遞給mapper):
<select id=」selectuser」 resulttype=」user」>
         select id, username, hashedpassword
         from some_table
         where username = #{username}
         and hashedpassword = #{hashedpassword}
</select>
 
(3)第三種:多個參數封裝成map
try{
//映射文件的命名空間.SQL片斷的ID,就能夠調用對應的映射文件中的SQL
//因爲咱們的參數超過了兩個,而方法中只有一個Object參數收集,所以咱們使用Map集合來裝載咱們的參數
Map<String, Object> map = new HashMap();
     map.put("start", start);
     map.put("end", end);
     return sqlSession.selectList("StudentID.pagination", map);
 }catch(Exception e){
     e.printStackTrace();
     sqlSession.rollback();
    throw e; }
finally{
 MybatisUtil.closeSqlSession();
 }

Mybatis的Xml映射文件中,不一樣的Xml映射文件,id是否能夠重複?

不一樣的Xml映射文件,若是配置了namespace,那麼id能夠重複;若是沒有配置namespace,那麼id不能重複

Mybatis的一級、二級緩存:

一級緩存 事務範圍:緩存只能被當前事務訪問。緩存的生命週期 依賴於事務的生命週期當事務結束時,緩存也就結束生命週期。 在此範圍下,緩存的介質是內存。 二級緩存 進程範圍:緩存被進程內的全部事務共享。這些事務有 多是併發訪問緩存,所以必須對緩存採起必要的事務隔離機制。 緩存的生命週期依賴於進程的生命週期,進程結束時, 緩存也就結束了生命週期。進程範圍的緩存可能會存放大量的數據, 因此存放的介質能夠是內存或硬盤。

什麼是MyBatis的接口綁定?有哪些實現方式?

接口綁定,就是在MyBatis中任意定義接口,而後把接口裏面的方法和SQL語句綁定, 咱們直接調用接口方法就能夠,這樣比起原來了SqlSession提供的方法咱們能夠有更加靈活的選擇和設置。

接口綁定有兩種實現方式,一種是經過註解綁定,就是在接口的方法上面加上 @Select、@Update等註解,裏面包含Sql語句來綁定;另一種就是經過xml裏面寫SQL來綁定, 在這種狀況下,要指定xml映射文件裏面的namespace必須爲接口的全路徑名。當Sql語句比較簡單時候,用註解綁定, 當SQL語句比較複雜時候,用xml綁定,通常用xml綁定的比較多。

使用MyBatis的mapper接口調用時有哪些要求?

① Mapper接口方法名和mapper.xml中定義的每一個sql的id相同; ② Mapper接口方法的輸入參數類型和mapper.xml中定義的每一個sql 的parameterType的類型相同; ③ Mapper接口方法的輸出參數類型和mapper.xml中定義的每一個sql的resultType的類型相同; ④ Mapper.xml文件中的namespace便是mapper接口的類路徑。

相關文章
相關標籤/搜索