大战熟女丰满人妻av-荡女精品导航-岛国aaaa级午夜福利片-岛国av动作片在线观看-岛国av无码免费无禁网站-岛国大片激情做爰视频

面試題首頁 > Mybaits面試題

Mybaits面試題

001簡單介紹下Mybatis?

1.Mybatis是一個半ORM(對象關系映射)框架,它內部封裝了JDBC,開發時只需要關注SQL語句本身,不需要花費精力去處理加載驅動、創建連接、創建statement等繁雜的過程;
2.MyBatis 可以使用 XML 或注解來配置和映射原生信息,將 POJO映射成數據庫中的記錄,避免了幾乎所有的 JDBC 代碼和手動設置參數以及獲取結果集;
3.通過xml 文件或注解的方式將要執行的各種 statement 配置起來,并通過java對象和 statement中MySQL的動態參數進行映射生成最終執行的sql語句,最后由mybatis框架執行sql并將結果映射為java對象并返回。

002Mybatis編程步驟 ?

1.創建SqlSessionFactory
2.通過SqlSessionFactory創建SqlSession
3.通過SqlSession執行數據庫操作
4.調用SqlSession的commit()方法提交事務
5.調用SqlSession的close()方法關閉會話

003MyBatis的優點?

1.基于SQL語句編程,相對靈活,接觸sql與程序代碼的藕合,便于統一管理,支持寫動態sql語句并可重復使用;
2.減少代碼量,消除了冗余代碼;
3.數據庫兼容能夠與Spring集成;
4.提供映射標簽支持字段關系映射;

004MyBatis的缺點?

1.SQL語句的編寫工作量較大,尤其當字段多、關聯表多時,對開發人員編寫SQL的功底有一定要求;
2.SQL語句依賴于數據庫,導致數據庫移植性差,不能隨意更換數據庫。

005MyBatis中$和#的區別?

1.傳入的參數在SQL中顯示不同
#傳入的參數在SQL中相當占位符,#方式能夠很大程度防止sql注入;而$傳入的參數在SQL中相當字符串,$方式無法防止Sql注入.
--------------------------------------------
例:使用以下SQL
1)select id,name,age from student where name=#{name};
2)select id,name,age from student where name =${name}:
當我們傳遞的參數name為 "‘zs    ' or 1=1" 時,上述 sql分別會解析為:
select id,name,age from student where id ="‘zs' or 1=1"
select id,name,age from student where id =‘zs' or 1=1
這樣第二條sql語句的會查出所有學生的信息,這是非常不安全的,有sql注入的風險。所以#可以防止SQL注入的風險(語句的拼接);但$無法防止Sql注入。
------------------------------------------------------
2.$方式一般用于傳入數據庫對象,例如傳入表名。
3.大多數情況下還是經常使用#,但有些情況下必須使用$,例:MyBatis排序時使用order by 動態參數時需要注意,用$而不是#。

006Mybatis的一級、二級緩存?

1.一級緩存 Mybatis的一級緩存是指SQLSession,一級緩存的作用域是SQlSession, Mabits默認開啟一級緩存。 在同一個SqlSession中,執行相同的SQL查詢時;第一次會去查詢數據庫,并寫在緩存中,第二次會直接從緩存中取。 當執行SQL時候兩次查詢中間發生了增刪改的操作,則SQLSession的緩存會被清空。 每次查詢會先去緩存中找,如果找不到,再去數據庫查詢,然后把結果寫到緩存中。 Mybatis的內部緩存使用一個HashMap,key為hashcode+statementId+sql語句。Value為查詢出來的結果集映射成的java對象。 SqlSession執行insert、update、delete等操作commit后會清空該SQLSession緩存。
2.二級緩存 二級緩存是mapper級別的,Mybatis默認是沒有開啟二級緩存的。 第一次調用mapper下的SQL去查詢用戶的信息,查詢到的信息會存放代該mapper對應的二級緩存區域。 第二次調用namespace下的mapper映射文件中,相同的sql去查詢用戶信息,會去對應的二級緩存內取結果。 如果調用相同namespace下的mapepr映射文件中增刪改sql,并執行了commit操作,此時會情況該

007Mybatis 是如何進行分頁的?分頁插件的原理是什么?

Mybatis 使用 RowBounds 對象進行分頁,它是針對 ResultSet 結果集執行的內 存分頁,而非物理分頁。可以在 sql 內直接書寫帶有物理分頁的參數來完成物理分 頁功能,也可以使用分頁插件來完成物理分頁。 分頁插件的基本原理是使用 Mybatis 提供的插件接口,實現自定義插件,在插件 的攔截方法內攔截待執行的 sql,然后重寫 sql,根據 dialect 方言,添加對應的物 理分頁語句和物理分頁參數。舉例:select * from student,攔截sql后重寫為:select t.* from (select * from student)t limit 0,10

008Mapper動態代理的實現原理?

Mybatis使用JDK的動態代理,為需要攔截的接口生成代理對象以實現接口方法攔截功能,每當執行這4種接口對象的方法時,就會進入攔截方法,具體就是InvocationHandler的invoke()方法。

009MyBatis是否支持延遲加載?如果支持,它的實現原理是什么?

1)在MyBatis配置文件中,可以配置是否啟用延遲加載lazyLoadingEnabled=true|false。MyBatis僅支持association關聯對象和collection關聯集合對象的延遲加載,association指的就是一對一,collection指的就是一對多查詢。
2)它的原理是,使用CGLIB創建目標對象的代理對象,當調用目標方法時,進入攔截器方法,比如調用a.getB().getName(),攔截器invoke()方法發現a.getB()是null值,那么就會單獨發送事先保存好的查詢關聯B對象的sql,把B查詢上來,然后調用a.setB(b),于是a的對象b屬性就有值了,接著完成a.getB().getName()方法的調用。這就是延遲加載的基本原理。

010MyBatis與Hibernate有哪些不同?

1.Mybatis和hibernate不同,它不完全是一個ORM框架,因為MyBatis需要程序員自己編寫Sql語句。
2.Mybatis直接編寫原生態sql,可以嚴格控制sql執行性能,靈活度高,非常適合對關系數據模型要求不高的軟件開發,因為這類軟件需求變化頻繁,一但需求變化要求迅速輸出成果。但是靈活的前提是mybatis無法做到數據庫無關性,如果需要實現支持多種數據庫的軟件,則需要自定義多套sql映射文件,工作量大。
3.Hibernate對象/關系映射能力強,數據庫無關性好,對于關系模型要求高的軟件,如果用hibernate開發可以節省很多代碼,提高效率。

011IBatis 和 MyBatis 在細節上有哪些不同?

1)在 sql 里面變量命名有原來的#變量# 變成了#{變量}
2)原來的$變量$變成了${變量}
3)原來在 sql 節點里面的 class 都換名字交 type
4)原來的 queryForObject queryForList 變成了 selectOne selectList
5)原來的別名設置在映射文件里面放在了核心配置文件里
1. IBatis 里面的核心處理類交 SqlMapClient,MyBatis 里面的核心處理類叫做 SqlSession

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

1.Mapper接口方法名和mapper.xml中定義的每個sql的id相同;
2.Mapper接口方法的輸入參數類型和mapper.xml中定義的每個sql的parameterType的類型相同;
3.Mapper接口方法的輸出參數類型和mapper.xml中定義的每個sql的resultType的類型相同;
4.Mapper.xml文件中的namespace即是mapper接口的類路徑;

013當實體類中的屬性名和表中的字段名不一樣 ,怎么辦 ?

第一種:通過定義select語句中字段名的別名,讓字段明的別名和實體類的屬性名一致
第二種:通過ResutlMap來映射字段名和實體類屬性名的一一對應的關系。

014模糊查詢 like 語句該怎么寫?

第 1 種:在 Java 代碼中添加 sql 通配符。
<select id="selectlike">
? select * from foo where bar like #{value}
</select>
第 2 種:在 sql 語句中拼接通配符,會引起 sql 注入
<select id="selectlike">
? select * from foo where bar like "%"#{value}"%"
</select>

015MyBatis動態sql是做什么的?都有哪些動態sql?能簡述一下動態sql的執行原理不?

1)MyBatis動態sql可以讓我們在Xml映射文件內,以標簽的形式編寫動態sql,完成邏輯判斷和動態拼接sql的功能,MyBatis提供了9種動態sql標簽 trim | where | set | foreach | if | choose | when | otherwise | bind。
2)其執行原理為,使用OGNL從sql參數對象中計算表達式的值,根據表達式的值動態拼接sql,以此來完成動態sql的功能。

016這個Dao接口的工作原理是什么?Dao接口里的方法,參數不同時,方法能重載嗎?

Dao接口的工作原理是JDK動態代理,Mybatis運行時會使用JDK動態代理為Dao接口生成代理proxy對象,代理對象proxy會攔 截接口方法,轉而執行MappedStatement所代表的sql,然后將sql執行結果返回。
Dao接口里的方法,是不能重載的,因為是全限名+方法名的保存和尋找策略。

017一對一、一對多的關聯查詢 ?

MyBatis實現一對一、一對多關聯查詢一般有兩種方式:
方式一:sqlMapper配置文件
一對一:在resultMap標簽中使用 association 標簽
一對多:在resultMap 標簽中使用collection 標簽
方式二:注解
一對一:在@Results 注解中的@Result注解中使用@One注解
一對多:在@Results 注解中的@Result 注解中使用@Many注解

018Mybatis 單條插入,如何返回主鍵?

useGeneratedKeys為true,持自動生成主鍵,keyProperty和keyColumn分別代表數據庫記錄主鍵字段和java對象成員屬性名
dao層 修飾符 為 void,不需要返回任何

<insert id="insertEntity" parameterType="**" useGeneratedKeys="true" keyProperty="id" keyColumn="id">

019Mybatis 批量插入,如何返回主鍵?

//dao層 修飾符 為 void,不需要返回任何
void batchInsert(List<TAlarmChannelEntity> list);
<insert id="batchInsert" parameterType="java.util.List" useGeneratedKeys="true" keyProperty="id" >
    INSERT INTO  t_alarm_channel
    (channel, silent_cycle, aggregation_mode,threshold,effective_start_time,effective_end_time,inform_obj,selected,create_time)
    VALUES
    <foreach collection="list" index="index" item="bo" separator=",">
       (
          #{bo.channel}, #{bo.silentCycle}, #{bo.aggregationMode},#{bo.threshold},#{bo.effectiveStartTime},#{bo.effectiveEndTime},#{bo.informObj},#{bo.selected},now()
       )
    </foreach>
</insert>

020ResultMap和ResultType的區別?

ResultMap是??指定返回值與對象及與對象內部屬性名和數據庫列名的綁定
ResultType是直接返回值與別名庫當中的java對象的映射

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

1,第一種:
public UserselectUser(String name,String area); 對應的 xml,#{0}代表接收的是 dao 層中的第一個參數,#{1}代表 dao 層中第二 參數,更多參數一致往后加即可。

<select id="selectUser"resultMap="BaseResultMap">
? select * from user_user_t where user_name = #{0} and user_area=#{1}
</select>

2,第二種:使用@param注解:

public interface UserMapper {
? ? User selectUser(@param("username") String username,
? ? ? ? ? ? ? ? ? ? @param("hashedpassword") sString 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();
}

022請說說MyBatis的工作原理?

1.讀取 MyBatis 配置文件:mybatis-config.xml 為 MyBatis 的全局配置文件,配置了 MyBatis 的運行環境等信息,例如數據庫連接信息。
2.加載映射文件。映射文件即 SQL 映射文件,該文件中配置了操作數據庫的 SQL 語句,需要在 MyBatis 配置文件 mybatis-config.xml 中加載。mybatis-config.xml 文件可以加載多個映射文件,每個文件對應數據庫中的一張表。
3.構造會話工廠:通過 MyBatis 的環境等配置信息構建會話工廠 SqlSessionFactory。
4.創建會話對象:由會話工廠創建 SqlSession 對象,該對象中包含了執行 SQL 語句的所有方法。
5.Executor 執行器:MyBatis 底層定義了一個 Executor 接口來操作數據庫,它將根據 SqlSession 傳遞的參數動態地生成需要執行的 SQL 語句,同時負責查詢緩存的維護。
6.MappedStatement 對象:在 Executor 接口的執行方法中有一個 MappedStatement 類型的參數,該參數是對映射信息的封裝,用于存儲要映射的 SQL 語句的 id、參數等信息。
7.輸入參數映射:輸入參數類型可以是 Map、List 等集合類型,也可以是基本數據類型和 POJO 類型。輸入參數映射過程類似于 JDBC 對 preparedStatement 對象設置參數的過程。
8.輸出結果映射:輸出結果類型可以是 Map、 List 等集合類型,也可以是基本數據類型和 POJO 類型。輸出結果映射過程類似于 JDBC 對結果集的解析過程。

023MyBatis中重要組件?

1)Configuration:用于描述 MyBatis 主配置文件信息,MyBatis 框架在啟動時會加載主配置文件,將配置信息轉換為 Configuration 對象。
2)SqlSession:面向用戶的 API,是 MyBatis 與數據庫交互的接口。
3)Executor:SQL 執行器,用于和數據庫交互。SqlSession 可以理解為 Executor 組件的外觀(外觀模式),真正執行 SQL 的是 Executor 組件。
4)MappedStatement:用于描述 SQL 配置信息,MyBatis 框架啟動時,XML 文件或者注解配置的 SQL信息會被轉換為 MappedStatement 對象注冊到 Configuration 組件中。
5)StatementHandler:封裝了對 JDBC 中 Statement 對象的操作,包括為 Statement 參數占位符設置值,通過 Statement 對象執行 SQL語句。
6)TypeHandler:類型處理器,用于 Java 類型與 JDBC 類型之間的轉換。
7)ParameterHandler:用于處理 SQL 中的參數占位符,為參數占位符設置值。
8)ResultSetHandler:封裝了對 ResultSet 對象的處理邏輯,將結果集轉換為 Java 實體對象。

024Mybatis 都有哪些 Executor 執行器?它們之間的區別是什么?

Mybatis有三種基本的Executor執行器,SimpleExecutor、ReuseExecutor、BatchExecutor。
1)SimpleExecutor:每執行一次update或select,就開啟一個Statement對象,用完立刻關閉Statement對象。
2)ReuseExecutor:執行update或select,以sql作為key查找Statement對象,存在就使用,不存在就創建,用完后,不關閉Statement對象,而是放置于Map<String, Statement>內,供下一次使用。簡言之,就是重復使用Statement對象。
3)BatchExecutor:執行update(沒有select,JDBC批處理不支持select),將所有sql都添加到批處理中(addBatch()),等待統一執行(executeBatch()),它緩存了多個Statement對象,每個Statement對象都是addBatch()完畢后,等待逐一執行executeBatch()批處理。與JDBC批處理相同。
作用范圍:Executor的這些特點,都嚴格限制在SqlSession生命周期范圍內。

025Spring和Mybatis整合之后為什么?級緩存會失效?

?級緩存使?者可以隨時使?或者銷毀緩存,從SqlSession對象打開時緩存就已經存在。當關閉SqlSession對象緩存就失效。當與spring整合的時候,直接跳過SqlSession對象,?法直接操作到SqlSession對象,spring在操作SqlSession的時候,不知道?戶什么時候關閉,所以每調?完?個dao?法就關閉了,所以導致?級緩存失效。
如果開啟了事務,?級緩存就會?效,因為開啟了事務,執?完dao就不會銷毀,因為?旦銷毀,事務就沒有了,你開啟了事務,Spring就知道你什么時候需要結束

目錄

返回頂部
主站蜘蛛池模板: 99久热在线精品视频观看 | 日本三级日本三级人妇三级四 | 国产在线视频h | 寡妇一级a毛片免费播放 | 久久国产精品老女人 | 手机看片日韩日韩韩 | 黄片毛片免费在线观看 | 国产午夜精品尤物福利视频 | 欧美顶级毛片在线播放 | 免费看人做人爱视频拍拍拍 | 久久久久国产精品免费看 | 国产最新在线视频 | 真人实干一级毛片aa免费 | 国产欧美精品专区一区二区 | 羞羞免费观看视频 | 色爱区综合 | 一级国产精品一级国产精品片 | 成年午夜性视频免费播放 | 精品一久久香蕉国产线看观看下 | 亚洲精品日本 | 亚洲 欧洲 自拍 另类 校园 | 香蕉视频国产 | 国产午夜成人无码免费看 | 亚洲免费精品 | 久久久久爽亚洲精品 | 久久久7777888精品 | 欧美精品一区二区三区在线播放 | 日本囗交做爰视频欧美 | 毛片毛片毛片毛片出来毛片 | xxxx久久| 欧美色视频超清在线观看 | 久久九九热 | 有码在线| 久久久久欧美激情 | 久久综合色综合 | 国产国产人免费观看在线视频 | 免费精品在线视频 | 欧美成人免费毛片 | 日本四虎影院 | 爱久久www.35669 | 国产香蕉国产精品偷在线观看 |