1. 程式人生 > >梳理mybatis-面試題

梳理mybatis-面試題

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>
解決辦法②:
通過<resultMap>來對映欄位名和實體類屬性名的一一對應的關係
<resultMap type=”me.gacl.domain.order” id=”orderresultmap”>
<!–用id屬性來對映主鍵欄位–>
<id property=”id” column=”order_id”>
<!–用result屬性來對映非主鍵欄位–>
<result property = “orderno” column =”order_no”/>
<result property=”price” column=”order_price” />
</reslutMap>

2、 要使用like語句該怎麼寫? 有兩種使用like的方法。(推薦使用)第一種方法是,在java程式碼中新增sql萬用字元。
示例一:
01.string wildcardname = “%smi%”;
02.list<name> names = mapper.selectlike(wildcardname);

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

第二種方式是在sql語句中拼接萬用字元。
這種方法相對來說安全性要低一些,因為可能會被sql注入攻擊。
示例二:
01.string wildcardname = “smi”;
02.list<name> names = mapper.selectlike(wildcardname);

01.<select id=”selectlike”>
02. select * from foo where bar like ‘%’ || ‘${value}’ || ‘%’
03.</select>

重要提示: 請注意兩種方式中 $ 和 # 的使用!

3、如何執行批量插入?

首先,建立一個簡單的insert語句:
01.<insert id=”insertname”>
02. insert into names (name) values (#{value})
03.</insert>

然後在java程式碼中像下面這樣執行批處理插入:
01.list<string> names = new arraylist();
02.names.add(“fred”);
03.names.add(“barney”);
04.names.add(“betty”);
05.names.add(“wilma”);
06.
07.// 注意這裡 executortype.batch
08.sqlsession sqlsession = sqlsessionfactory.opensession(executortype.batch);
09.try {
10. namemapper mapper = sqlsession.getmapper(namemapper.class);
11. for (string name : names) {
12. mapper.insertname(name);
13. }
14. sqlsession.commit();
15.} finally {
16. sqlsession.close();
17.}

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

insert 方法總是返回一個int值 - 這個值代表的是插入的行數。
而自動生成的鍵值在 insert 方法執行完後可以被設定到傳入的引數物件中。
示例:
01.<insert id=”insertname” usegeneratedkeys=”true” keyproperty=”id”>
02. insert into names (name) values (#{name})
03.</insert>

01.name name = new name();
02.name.setname(“fred”);
03.
04.int rows = mapper.insertname(name);
05.// 完成後,id已經被設定到物件中
06.system.out.println(“rows inserted = ” + rows);
07.system.out.println(“generated key value = ” + name.getid());

5、在mapper中如何傳遞多個引數?

java的反射機制並不能讓框架獲取到引數的名字(方法簽名中只有引數型別,
可以說是為了優化,也可以說設計就是如此,總之名字無意義), 所以mybatis預設的命名為: param1,param2……
如果想給他們指定名稱,可以使用 @param 註解:
01.import org.apache.ibatis.annotations.param;
02.public interface usermapper {
03. user selectuser(@param(“username”) string username,
04. @param(“hashedpassword”) string hashedpassword);
05.}

然後,就可以在xml像下面這樣使用(推薦封裝為一個map,作為單個引數傳遞給mapper):
01.<select id=”selectuser” resulttype=”user”>
02. select id, username, hashedpassword
03. from some_table
04. where username = #{username}
05. and hashedpassword = #{hashedpassword}
06.</select>

6.mybatis基礎: #{…} 和 ${…} 的區別
a)mybatis將 #{…} 解釋為jdbc prepared statement 的一個引數標記。
而將 ${…} 解釋為字串替換。
比如,我們不能在表名(table name)的位置使用引數標記。
b)假設有下面的程式碼:
01.map<string, object> parms = new hashmap<string, object>();
02.parms.put(“table”, “foo”); // 表名
03.parms.put(“criteria”, 37); // 查詢過濾條件
04.list<object> rows = mapper.generalselect(parms);

01.<select id=”generalselect” parametertype=”map”>
02. select * from ${table} where col1 = #{criteria}
3. 03.</select> mybatis生成的sql語句(prepared statement)

如下所示: 01.select * from foo where col1 = ?
重要提示: 請注意,使用$ {…} (字串替換)時可能會有sql注入攻擊的風險。
另外,字串替換在處理複雜型別也可能常常發生問題,如日期型別。

由於這些因素,我們建議您儘可能地使用 #{…} 這種方式。

相關推薦

梳理mybatis-試題

1.當實體類中的屬性名和表中的欄位名不一樣 解決辦法①: 通過在查詢的sql語句中定義欄位名的別名,讓欄位名的別名和實體類的屬性名一致 <select id=”selectorder” parametertype=”int” resu

springmvc和mybatis試題(含答案)

理解 頁面 發送請求 緩存 固定 sql tor 組件 poj 轉載:http://blog.csdn.net/xinghuo0007/article/details/53463897 Spring MVC Framework有這樣一些特點: 1。它是基於組件技術的.全部的

2018年mybatis試題

1、#{}和${}的區別是什麼?注:這道題是面試官面試我同事的。 答:${}是Properties檔案中的變數佔位符,它可以用於標籤屬性值和sql內部,屬於靜態文字替換,比如${driver}會被靜態替換為com.mysql.jdbc.Driver。#{}是sql的引數佔位符,Mybatis會將sql中的#

mybatis試題(二)

Mybatis的Xml對映檔案中,不同的Xml對映檔案,id是否可以重? 不同的Xml對映檔案,如果配置了namespace,那麼id可以重複;如果沒有配置namespace,那麼id不能重複;畢竟namespace不是必須的,只是最佳實踐而已。 原因就是namespace+id是作為Map

MyBatis試題

mybatis可能會問4個方面的問題 a.藉口繫結 b.一對一、一對多關係 c.動態SQL d.快取 1.Mybatis比IBatis比較大的幾個改進是什麼 a.有介面繫結,包括註解繫結sql和xml繫結Sql , b.動態sql由原來的

mybatis試題總結大全

1.介面繫結有幾種實現方式,分別是怎麼實現的? 介面繫結有兩種實現方式,一種是通過註解繫結,就是在介面的方法上面加上 @[email protected]等註解裡面包含Sql語句來繫結, 另外一種就是通過xml裡面寫SQL來繫結, 在這種情況下,要

mybatismybatis試題

mybatis的基本工作流程 1.讀取配置檔案,配置檔案包含資料庫連線資訊和Mapper對映檔案或者Mapper包路徑。 2.有了這些資訊就能建立SqlSessionFactory,SqlSessionFactory的生命週期是程式級,程式執行的時候建立起來,程式結束的時

mybatis 試題

1.Mybatis比IBatis比較大的幾個改進是什麼         a.有介面繫結,包括註解繫結sql和xml繫結Sql ,         b.動態sql由原來的節點配置變成OGNL表示式,         c. 在一對一,一對多的時候引進了association,在

SpringMVC+MyBatis試題 SpringMVC工作流程、MyBatis工作流程

SpringMVC的工作流程 使用者傳送請求至前端控制器DispatcherServlet。 DispatcherServlet收到請求後呼叫HandlerMapping處理器對映器。

Mybatis試題--網路整理

Mybatis常見面試題#{}和${}的區別是什麼?{}和${}的區別是什麼?在Mybatis中,有兩種佔位符#{}解析傳遞進來的引數資料${}對傳遞進來的引數原樣拼接在SQL中#{}是預編譯處理,${}是字串替換。使用#{}可以有效的防止SQL注入,提高系統安全性。當實體類

MyBatis試題,'#{}與${}的區別'以及'sql預編譯'

這個問題不算複雜,網上答案也比較”豐富”, 之所以寫這篇博文主要是以後查閱方便,自己總結也能加深印象, 畢竟它是面試題中的老相識,以後還要麻煩它關照關照… MyBatis本身是基於JDBC封

試題:應用中很多jar包,比如spring、mybatis、redis等等,各自用的日誌系統各異,怎麼用slf4j統一輸出?

一、問題概述 如題所說,後端應用(非spring boot專案)通常用到了很多jar包,比如spring系列、mybatis、hibernate、各類連線資料庫的客戶端的jar包。可能這個jar包用的是logback、那個用的是log4j、那個又是log4j2, 這時候,怎麼才能保證各jar包的日誌都能輸

試題:應用中很多jar包,比如spring、mybatis、redis等等,各自用的日誌系統各異,怎麽用slf4j統一輸出?

相同 如何 align 等等 version 試題 ava body jakarta 一、問題概述 如題所說,後端應用(非spring boot項目)通常用到了很多jar包,比如spring系列、mybatis、hibernate、各類連接數據庫的客戶端的jar包。可能這

JAVA企業試題精選 MyBatis 1-4

2.MyBatis 2.1.什麼是MyBatis? 參考答案:   MyBatis最早源自Apache基金會的一個開源專案iBatis,2010年這個專案由Apache software foundation遷移到了google code,並且改名為

第6課:Java Spring Boot 2.0實戰MyBatis與優化(Java試題)

《阿里巴巴Java Spring Boot 2.0開發實戰課程》06課本期分享專家:徐雷—阿里巴巴特邀Java講師,MongoDB講師 本期分享主題:Spring Boot2.0實戰MyBatis與優化 (Java面試題)Java Spring Boot 2.0是最新的開發平臺,Mybatis是高效能ORM

#Java面試-2018年MyBatis常見實用試題2

1、Mybatis動態sql是做什麼的?都有哪些動態sql?能簡述一下動態sql的執行原理不? 答: 1)Mybatis動態sql可以讓我們在Xml對映檔案內,以標籤的形式編寫動態sql,完成邏輯判斷和動態拼接sql的功能。 如果有想要學習java的小夥伴,可來

SSM(Spring + Springmvc + Mybatis)框架試題

事務管理器 map 得到 反轉 存取 _id conf last markdown JAVA SSM框架基礎面試題https://blog.csdn.net/qq_39031310/article/details/83050192 SSM(

Java試題2018---J2EE後端---MyBatis 框架

1、MyBatis 的核心原理,及執行流程 現在開源專案中持久層框架用到最多的基本就是 iBatis、myBatis 和 Hibernate 了。 原理詳解:         MyBatis應用程式根據XML配置檔案建立SqlSessionFact

Mybatis的原理與JVM記憶體結構(試題)

Mybatis的原理 1.Mapper 介面在初始SQL SessionFactory註冊的 2.Mapper 介面註冊在名為MapperRegistry類的 HasMap中 key=Mapper class   value = 建立當前Mapper的工廠  3.

Android試題總結|基本知識梳理---持續更新

梳理背景 最近準備換工作了,這兩天面試了幾家真的很受打擊。就像一位大佬說的,不是技術要求高了,而是企業招聘更理性了。好好反思自己處理平時到處百度copy,paste,還有什麼提升呢。早已不是瞭解四大元件就能收到各種offer的年代了。 決定好好的梳理一下知識