1. 程式人生 > >Mybatis ----- 面試(一) 【摘抄】

Mybatis ----- 面試(一) 【摘抄】

摘自下面公眾號,記錄方便學習

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

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

Mybatis在處理#{}時,會將sql中的#{}替換為?號,呼叫PreparedStatement的set方法來賦值;

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

使用#{}可以有效的防止SQL注入,提高系統安全性。

2、當實體類中的屬性名和表中的欄位名不一樣 ,怎麼辦 ?

第1種: 通過在查詢的sql語句中定義欄位名的別名,讓欄位名的別名和實體類的屬性名一致 

<select id=”selectorder” parametertype=”int” resultetype=”me.gacl.domain.order”>
      select order_id id, order_no orderno ,order_price price form orders where order_id=#{id};
</select>

第2種: 通過<resultMap>來對映欄位名和實體類屬性名的一一對應的關係

<select id="getOrder" parameterType="int" resultMap="orderresultmap">
       select * from orders where order_id=#{id}
</select>

<resultMap type=”me.gacl.domain.order” id=”orderresultmap”> 
       <!–用id屬性來對映主鍵欄位–> 
       <id property=”id” column=”order_id”> 

       <!–用result屬性來對映非主鍵欄位,property為實體類屬性名,column為資料表中的屬性–> 
       <result property = “orderno” column =”order_no”/> 
       <result property=”price” column=”order_price” /> 
</reslutMap>

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

第1種:在Java程式碼中新增sql萬用字元。

string wildcardname = “%smi%”; 
list<name> names = mapper.selectlike(wildcardname);

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

第2種:在sql語句中拼接萬用字元,會引起sql注入

string wildcardname = “smi”; 
   list<name> names = mapper.selectlike(wildcardname);

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

4、通常一個Xml對映檔案,都會寫一個Dao介面與之對應,請問,這個Dao介面的工作原理是什麼?Dao接口裡的方法,引數不同時,方法能過載嗎?

Dao介面,就是人們常說的Mapper介面,介面的全限名,就是對映檔案中的namespace的值,介面的方法名,就是對映檔案中MappedStatement的id值,介面方法內的引數,就是傳遞給sql的引數。

Mapper介面是沒有實現類的,當呼叫介面方法時,介面全限名+方法名拼接字串作為key值,可唯一定位一個MappedStatement,

舉例:com.mybatis3.mappers.StudentDao.findStudentById,可以唯一找到namespace為com.mybatis3.mappers.StudentDao下面id = findStudentById的MappedStatement。

在Mybatis中,每一個<select>、<insert>、<update>、<delete>標籤,都會被解析為一個MappedStatement物件。

Dao接口裡的方法,是不能過載的,因為是全限名+方法名的儲存和尋找策略。

Dao介面的工作原理是JDK動態代理,Mybatis執行時會使用JDK動態代理為Dao介面生成代理proxy物件,代理物件proxy會攔截介面方法,轉而執行MappedStatement所代表的sql,然後將sql執行結果返回。

5、Mybatis是如何進行分頁的?分頁外掛的原理是什麼?

Mybatis使用RowBounds物件進行分頁,它是針對ResultSet結果集執行的記憶體分頁,而非物理分頁,可以在sql內直接書寫帶有物理分頁的引數來完成物理分頁功能,也可以使用分頁外掛來完成物理分頁。

分頁外掛的基本原理是使用Mybatis提供的外掛介面,實現自定義外掛,在外掛的攔截方法內攔截待執行的sql,然後重寫sql,根據dialect方言,新增對應的物理分頁語句和物理分頁引數。

6、Mybatis是如何將sql執行結果封裝為目標物件並返回的?都有哪些對映形式?

第一種是使用<resultMap>標籤,逐一定義列名和物件屬性名之間的對映關係。

第二種是使用sql列的別名功能,將列別名書寫為物件屬性名,比如T_NAME AS NAME,物件屬性名一般是name,小寫,但是列名不區分大小寫,Mybatis會忽略列名大小寫,智慧找到與之對應物件屬性名,你甚至可以寫成T_NAME AS NaMe,Mybatis一樣可以正常工作。

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

7、如何執行批量插入?

首先,建立一個簡單的insert語句: 

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

然後在java程式碼中像下面這樣執行批處理插入:

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();

   } finally {

    sqlsession.close();

   }

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

insert 方法總是返回一個int值 - 這個值代表的是插入的行數。

而自動生成的鍵值在 insert 方法執行完後可以被設定到傳入的引數物件中。

示例:

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

   name name = new name(); 
   name.setname(“fred”); 

   int rows = mapper.insertname(name); 
   // 完成後,id已經被設定到物件中 
   system.out.println(“rows inserted = ” + rows); 
   system.out.println(“generated key value = ” + name.getid());

9、在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 註解:

import org.apache.ibatis.annotations.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>

10、Mybatis動態sql是做什麼的?都有哪些動態sql?能簡述一下動態sql的執行原理不?

Mybatis動態sql可以讓我們在Xml對映檔案內,以標籤的形式編寫動態sql,完成邏輯判斷和動態拼接sql的功能。

Mybatis提供了9種動態sql標籤:trim|where|set|foreach|if|choose|when|otherwise|bind。

其執行原理為,使用OGNL從sql引數物件中計算表示式的值,根據表示式的值動態拼接sql,以此來完成動態sql的功能。

相關推薦

Mybatis ----- 面試 摘抄

摘自下面公眾號,記錄方便學習 1、#{}和${}的區別是什麼? #{}是預編譯處理,${}是字串替換。 Mybatis在處理#{}時,會將sql中的#{}替換為?號,呼叫PreparedStatement的set方法來賦值; Mybatis在處理${}時,就是

Mybatis ----- 面試 摘抄

摘自下面公眾號,記錄方便學習 Mybatis的Xml對映檔案中,不同的Xml對映檔案,id是否可以重? 不同的Xml對映檔案,如果配置了namespace,那麼id可以重複;如果沒有配置namespace,那麼id不能重複;畢竟namespace不是必須的,只是最

Mybatis ----- 剖析Mybatis原理 摘抄

摘自下面公眾號,記錄方便學習 # 前言 在java程式設計師的世界裡,最熟悉的開源軟體除了 Spring,Tomcat,還有誰呢?當然是 Mybatis 了,今天樓主是來和大家一起分析他的原理的。 1. 回憶JDBC 首先,樓主想和大家一起回憶學習JDBC的那

Mybatis ----- 面試 摘抄

摘自下面公眾號,記錄方便學習 Mybatis中如何執行批處理? 使用BatchExecutor完成批處理。 Mybatis都有哪些Executor執行器?它們之間的區別是什麼? Mybatis有三種基本的Executor執行器,SimpleExecutor

PLSQL簡介翻譯

發展 奇怪 設置 操作系統 fort 成熟 解決 之一 其他 PLSQL簡介(一)【翻譯】 原書:steven feuerstei-oracle PLSQL grogramming 2014 PL / SQL代表“結構化查詢語言和過程語言。 Oracle公司推出了PL

Linux進程描述符task_struct結構體詳解--Linux進程的管理與調度

mage ase 設備 兩種 等價 而且 當前 結構體 技術 Linux內核通過一個被稱為進程描述符的task_struct結構體來管理進程,這個結構體包含了一個進程所需的所有信息。它定義在include/linux/sched.h文件中。 談到task_struct結構體

語音識別學習筆記概述

語音識別學習筆記(一)【概述】   概述:  1)語音識別是機器通過識別和理解過程把人類的語音訊號轉變成相應的文字或命令的技術。  2)集 聲學、語音學、計算機、資訊處理、人工智慧等於一身的綜合技術。 難點:  1)語音特徵隨與之相連的語音

java基礎-中級集合

目錄   1、集合 1.1 集合框架          1.1.1 集合介面          1.1.2 集合實現類      

UML-概論

前言 主要是對九個方面進行了概述: 1.面向物件技術 2.模型與視覺化建模 3.什麼是UML 4.UML發展歷史 5.軟體過程 6.UML工具 7.UML的構成 8.UML示例 9.UML在軟體開發各個階段的應用 面向物件技術 之前看軟工的視訊就學習過,這裡再複習一遍。 面向物件

ArcGIS API for JavaScript3.x 學習筆記[3] 加載底圖天地圖經緯度版

矢量地圖 說明 tiled spa 過程 相同 服務器列表 text 服務 1 <!DOCTYPE html> 2 <html> 3 <head> 4 <meta charset="utf-8"> 5

Python自動化開發未完待續

urn sts dha sel def open entos div 初始 1、創建項目    2、創建models from django.db import models # Create your models here. # 主機表 class Host(m

PHP基礎入門詳解世界上最好用的編程語言

轉換成 c語言 127.0.0.1 mac const 讀取 成對 後臺 isset 簡介 ---------  PHP(超文本預處器)是一種通用開源腳本語言。語法吸收了C語言、Java和Perl的特點,利於學習,使用廣泛,主要適用於Web開發領域。PHP 獨

gulp前端自動化工具---gulp的使用------凡塵

app 一起 dex 前端自動化 指定 sass css 文件的 等待 什麽是gulp? 基於node的自動化構建工具 擴展:開發的時候分為2個節點一個是開發階段 另一個是部署階段 開發階段:源文件不會被壓縮

UWP 使用OneDrive雲存儲2.x api全網首發

既然 現在 rest 方式 exist 開源 體驗 clas 下載地址 最近開發人臉識別UWP【微識別 / WeRecognition】用到了OneDrive開發,下面把來龍去脈講一下。 下載地址 https://www.microsoft.com/store/produc

反向教學系列之——Django入門不需知道web框架

Django 教程 反向教學 一派胡言 用這東西最終是建網站的,或者是更一般意義的服務器。服務器麽,就是如果用別的電腦(“客戶機”)給它發請求,它會返回一些東西——如果給隨便某個機器發信息,它自然未必理你。要想某機器回應你,得滿足這些條件——它不處在關機狀態它能收到你的信息,你也能收到它的信息

面向對象“類與對象”的概念及特性

實例化 tro nbsp 面試 不同 分享圖片 pytho 種類 eat 面向對象程序設計(英語:Object-oriented programming,縮寫:OOP)是種具有對象概念的程序編程範式,同時也是一種程序開發的抽象方針。在此不再累述編程範式的種種類別,重點

分布式系統之緩存的微觀應用經驗談 基礎細節篇

聯網 需要 最新 響應時間 正文 劃分 發的 討論 server 分布式系統之緩存的微觀應用經驗談(一) 【基礎細節篇】 前言   近幾個月一直在忙些瑣事,幾乎年後都沒怎麽閑過。忙忙碌碌中就進入了2018年的秋天了,不得不感嘆時間總是如白駒過隙,也不知道收獲了什麽

交換機CPU負載高達90%以上新任幫主

交換機流量 很多 案例分享 自己 交換機 堆疊 技術分享 示意圖 mark 交換機CPU負載高達90%以上(一)一.前言自從工作以來 ,接觸了很多的項目,也遇到了無數多的問題,有些問題看似很奇葩,其實從理論上來解釋都是行的通的,當然我們排除是設備或是軟件自身的bug問題,因

、微服務Microservices翻譯

1、說明 本文轉載自 http://www.cnblogs.com/liuning8023/p/4493156.html 經典好文! 2、微服務 “微服務架構(Microservice Architecture)”一詞在過去幾年裡廣泛的傳播,它用於描述一種設計應用程式的特別方式,作為一套獨

Leetcode進階----學習兩數相加、無重複字元的最長字串

①兩數相加 給定兩個非空連結串列來表示兩個非負整數。位數按照逆序方式儲存,它們的每個節點只儲存單個數字。將兩數相加返回一個新的連結串列。 你可以假設除了數字 0 之外,這兩個數字都不會以零開頭。 示例: 輸入:(2 -> 4 -> 3) + (5 -> 6 ->