${}和#{}的區別是什么?
${}是字串替換,#{}是預編譯處理,
Mybatis在處理#{}時,會將sql中的#{}替換為?號,呼叫PreparedStatement的set方法來賦值;
Mybatis在處理${}時,就是把${}原樣替換成變數的值,
使用#{}可以有效的防止SQL注入,提高系統安全性,
當物體類中的屬性名和表中的欄位名不一樣 ,怎么辦 ?
方法一:通過在查詢的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>
方法二:通過
模糊查詢再MyBatis中怎么寫
一般模糊查詢都是通過 like %xx% 這種形式來查詢的,xx是前端傳過來的查詢變數,在MyBatis中推薦使用字串拼接函式的形式來使用,這樣出錯的可能性較小,
<if test="xx!= null and xx!= ''">
and user_name like concat('%',#{xx,jdbcType=VARCHAR},'%')
</if>
MyBatis中的Mapper只有介面,那實作類是怎么生成的?當我們呼叫Mapper介面中的某個方法時,這個方法是怎么跟Mapper映射檔案中的SQL陳述句對應起來的,
在使用MyBatis的時候我們只需要定義Mapper介面進行了,具體的Mapper介面實作是通過動態代理的方式生成的,
MyBatis在啟動的時候會為每個Mapper映射檔案指定一個MapperProxyFactory類,這個類是MapperProxy的工廠類,當我們呼叫sqlSession1.getMapper時,就會使用
MapperProxyFactory來生成動態代理類,生成的動態代理類代理了Mapper的所有介面,
CbondissuerMapper cbondissuerMapper10 = sqlSession1.getMapper(CbondissuerMapper.class);
下面來回答第二個問題,Mapper介面中的方法是怎么和映射檔案中的SQL匹配起來的,
上面提到,Mapper介面的實作類是通過動態代理生成的,熟悉動態代理的應該知道呼叫Mapper介面的任何介面方法都會調到InvocationHandler介面的
invoke方法,在這里也就是MapperProxy的invoke方法,因為MapperProxy實作了InvocationHandler介面,
查看MapperProxy的invoke方法的源代碼,我們會發現介面方法呼叫可具體的SQL是通過一個叫做MapperStatement的物件關聯起來的,
MyBatis在啟動時會將Mapper檔案中的每一個 <select>、<insert>、<update>、<delete>標簽決議為一個MapperStatement物件,并放入一個Map結構中,
放入時的key就是Mapper檔案的namespace加上標簽值的id值,(這里我們也就知道了為什么配置映射檔案時namespace需要和介面的全限定名一致,標簽的id需要
和介面的方法名一致)
也就是說在Mapper介面中定義的每個方法都有一個MapperStatement物件和它一一對應,這個MapperStatement物件包含了所有映射檔案的資訊,自然也包含了SQL
資訊,所以Mapper介面就是通過MapperStatement物件和具體SQL匹配的,
Mapper介面中的方法定義能否通過方法簽名多載?
通過上面的介紹我們知道Mapper介面中的方法并不能通過方法名多載,因為MyBatis是通過介面的全限定名和方法名來匹配MapperStatement物件,
兩個方法名相同方法簽名不同的介面會匹配到同一個MapperStatement物件,
Mybatis是如何進行分頁的?分頁插件的原理是什么?
插入資料回傳主鍵ID
參考
- https://mp.weixin.qq.com/s/XjsYq6bk2paZP6mPrV7fGw
- https://mp.weixin.qq.com/s/MB4iIKd3ISWBJ37hlJs5tA
- https://www.jianshu.com/p/3a233fb317f6
- https://mp.weixin.qq.com/s/Xi2P7XH867m_AoegaGqW3Q
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/162690.html
標籤:Java
