您好,登錄后才能下訂單哦!
這篇文章主要講解了“mybatis占位符#{}和${}的用法和區別”,文中的講解內容簡單清晰,易于學習與理解,下面請大家跟著小編的思路慢慢深入,一起來研究和學習“mybatis占位符#{}和${}的用法和區別”吧!
基本類型:
基本類型,參數名稱與占位符中的名稱無關。
#{} 傳入值時,sql解析時,參數是帶引號的
如果用了@Param("xxx") ,則mybatis會自動生成map作為入參,那么參數名稱則必須與占位符一致
<select id="findById" parameterType="int" resultType="cn.wh.vo.Role"> select * from t_role where id = #{xxxid} </select>
測試:
@Test public void testSelectOne(){ Role role = (Role)session.selectOne("cn.wh.mapper.RoleMapper.findById",1); System.out.println(role.getName()); }
自定義類型
自定義類型作為參數,自定義類中需要為為屬性提供get方法,如果沒有提供get方法,那么會根據占位符中的名稱去反射獲取值,如果占位符中的名稱和屬性不一致,那么報ReflectionException。
<select id="findListBypage" parameterType="cn.wh.util.PageUtil" resultType="Role"> select * from t_role limit #{index},#{size} </select>
測試:
@Test public void testPage1(){ PageUtil pu = new PageUtil(); pu.setIndex(3); pu.setSize(3); List<Role> list = session.selectList("cn.wh.mapper.RoleMapper.findListBypage", pu); for(Role r:list){ System.out.println(r.getName()); } }
Map
Map作為參數類型,key和占位符中的名稱一致即可,如果名稱不一致那么將會把null,傳遞到占位符中。
注意:#{}占位符不能解決一下 3 類問題:
表名是動態的: Select * from #{table_name}
列名是動態的:Select #{column_name} from t_role
排序列是動態的: Select * from t_role order by #{columu}
${}傳入值,sql解析時,參數是不帶引號的。
因此${}參數不能為基本數據類型,只能為自定義類型和map
<!-- 查詢所有 --> <select id="findAll" parameterType="map" resultType="cn.wh.vo.Role"> select * from ${tableName} </select>
測試:
@Test public void testSelectList(){ Map<String,String> map = new HashMap<String,String>(); map.put("tableName", "t_role"); List<Role> list = session.selectList("cn.wh.mapper.RoleMapper.findAll",map); for(Role role:list){ System.out.println(role.getId()+"----"+role.getName()); } }
作為連接符使用:
<select id="selectLike1" parameterType="map" resultType="Role"> select *from t_role where name like '${name}%'; </select>
測試:
@Test public void testLike2(){ Map<String,String> map = new HashMap<String,String>(); map.put("name", "黃"); List<Role> list = session.selectList("cn.wh.mapper.RoleMapper.selectLike1",map); for(Role r:list){ System.out.println(r.getName()); } }
在mybatis中的$與#都是在sql中動態的傳入參數。
eg:select id,name,age from student where name=#{name} 這個name是動態的,可變的。當你傳入什么樣的值,就會根據你傳入的值執行sql語句。
#{}: 解析為一個 JDBC 預編譯語句(prepared statement)的參數標記符,一個 #{ } 被解析為一個參數占位符 。
${}: 僅僅為一個純碎的 string 替換,在動態 SQL 解析階段將會進行變量替換。
例子:
eg 1: select id,name,age from student where name=#{name} ;
解析為:select id,name,age from student where name='cy';
eg 2: select id,name,age from student where name=${name};
解析為:select id,name,age from student where name=cy;
#是將傳入的值當做字符串的形式,eg:select id,name,age from student where id =#{id},當前端把id值1,傳入到后臺的時候,就相當于 select id,name,age from student where id ='1'.
$是將傳入的數據直接顯示生成sql語句,eg:select id,name,age from student where id =${id},當前端把id值1,傳入到后臺的時候,就相當于 select id,name,age from student where id = 1.
使用#可以很大程度上防止sql注入。(語句的拼接)
但是如果使用在order by 中就需要使用 $.
在大多數情況下還是經常使用#,但在不同情況下必須使用$.
我覺得#與的區別最大在于:#{} 傳入值時,sql解析時,參數是帶引號的,而的區別最大在于:#{} 傳入值時,sql解析時,參數是帶引號的,而{}穿入值,sql解析時,參數是不帶引號的。
感謝各位的閱讀,以上就是“mybatis占位符#{}和${}的用法和區別”的內容了,經過本文的學習后,相信大家對mybatis占位符#{}和${}的用法和區別這一問題有了更深刻的體會,具體使用情況還需要大家實踐驗證。這里是億速云,小編將為大家推送更多相關知識點的文章,歡迎關注!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。