1、#{}和${}的區別是什麼?
#{}是預編譯處理,${}是字串替換。
mybatis在處理#{}時,會將sql中的#{}替換為?號,呼叫preparedstatement的set方法來賦值;
mybatis在處理${}時,就是把${}替換成變數的值。
使用#{}可以有效的防止sql注入,提高系統安全性。
2、當實體類中的屬性名和表中的欄位名不一樣 ,怎麼辦 ?
第1種: 通過在查詢的sql語句中定義欄位名的別名,讓欄位名的別名和實體類的屬性名一致
select order_id id, order_no orderno ,order_price price form orders where order_id=#;
第2種: 通過來對映欄位名和實體類屬性名的一一對應的關係
select * from orders where order_id=#
3、mybatis是如何將sql執行結果封裝為目標物件並返回的?都有哪些對映形式?
答:第一種是使用標籤,逐一定義列名和物件屬性名之間的對映關係。
第二種是使用sql列的別名功能,將列別名書寫為物件屬性名,比如t_name as name,物件屬性名一般是name,小寫,但是列名不區分大小寫,mybatis會忽略列名大小寫,智慧型找到與之對應物件屬性名,你甚至可以寫成t_name as name,mybatis一樣可以正常工作。
有了列名與屬性名的對映關係後,mybatis通過反射建立物件,同時使用反射給物件的屬性逐一賦值並返回,那些找不到對映關係的屬性,是無法完成賦值的。
4、如何獲取自動生成的(主)鍵值?
insert 方法總是返回乙個int值 - 這個值代表的是插入的行數。 而自動生成的鍵值在 insert 方法執行完後可以被設定到傳入的引數物件中。 示例:
insert into names (name) values (#)
name name = new name();
name.setname(「fred」);
system.out.println(「rows inserted = 」 + rows);
system.out.println(「generated key value = 」 + name.getid());
public userselectuser(string name,string area);
//對應的xml,#代表接收的是dao層中的第乙個引數,#代表dao層中第二引數,更多引數一致往後加即可。
select * fromuser_user_t whereuser_name = # anduser_area=#
第2種:使用 @param 註解:
import org.apache.ibatis.annotations.param;
user selectuser(@param(「username」) string username,
@param(「hashedpassword」) string hashedpassword);
}
select id, username, hashedpassword from some_table
where username = # and hashedpassword = #
select * from class c,teacher t where c.teacher_id=t.t_id and c.c_id=#
select * from class c,teacher t,student s where c.teacher_id=t.t_id and c.c_id=s.class_id and c.c_id=#
簡單面試題
1.short s1 1 s1 s1 1 有錯嗎?short s1 1 s1 1 有錯嗎?答 對於short s1 1 s1 s1 1 由於1是int型別,因此s1 1運算結果也是int 型,需要強制轉換型別才能賦值給short型。而short s1 1 s1 1 可以正確編譯,因為s1 1 相當於...
python簡單面試題(2)
首先搭建環境,然後根據專案搭建自動化框架,編寫自動化用例,整理用例,自動生成測試報告,然後整合到jenkins上進行操作 出現anr和crash進行復現抓取日誌 adb命令 編寫自動化用例的時候斷言編寫清楚,然後也可以通過用例失敗後進行截圖進行儲存,方便我們後續檢視用例失敗原因,自動化用例失敗後,進...
單鏈表的簡單面試題
define crt secure no warnings 1 include slistnode.h void test1 pushback popback void test2 pushfront popfront find else void test3 erase void test4 bu...