中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

mybatis占位符#{}和${}的用法和區別

發布時間:2021-06-26 09:56:56 來源:億速云 閱讀:188 作者:chen 欄目:大數據

這篇文章主要講解了“mybatis占位符#{}和${}的用法和區別”,文中的講解內容簡單清晰,易于學習與理解,下面請大家跟著小編的思路慢慢深入,一起來研究和學習“mybatis占位符#{}和${}的用法和區別”吧!

mybatis 之 占位符#{} 和 ${}

一. #{}占位符用來設置參數,參數的類型可以有3種:基本類型,自定義類型,Map。

基本類型:

基本類型,參數名稱與占位符中的名稱無關。

#{} 傳入值時,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;

  1. #是將傳入的值當做字符串的形式,eg:select id,name,age from student where id =#{id},當前端把id值1,傳入到后臺的時候,就相當于 select id,name,age from student where id ='1'.

  2. $是將傳入的數據直接顯示生成sql語句,eg:select id,name,age from student where id =${id},當前端把id值1,傳入到后臺的時候,就相當于 select id,name,age from student where id = 1.

  3. 使用#可以很大程度上防止sql注入。(語句的拼接)

  4. 但是如果使用在order by 中就需要使用 $.

  5. 在大多數情況下還是經常使用#,但在不同情況下必須使用$.

  6. 我覺得#與的區別最大在于:#{} 傳入值時,sql解析時,參數是帶引號的,而的區別最大在于:#{} 傳入值時,sql解析時,參數是帶引號的,而{}穿入值,sql解析時,參數是不帶引號的。

感謝各位的閱讀,以上就是“mybatis占位符#{}和${}的用法和區別”的內容了,經過本文的學習后,相信大家對mybatis占位符#{}和${}的用法和區別這一問題有了更深刻的體會,具體使用情況還需要大家實踐驗證。這里是億速云,小編將為大家推送更多相關知識點的文章,歡迎關注!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

保定市| 泰州市| 南康市| 百色市| 济宁市| 乳山市| 大宁县| 遵义县| 广昌县| 申扎县| 安图县| 昂仁县| 富平县| 杂多县| 西峡县| 平昌县| 昭苏县| 阿瓦提县| 津市市| 会宁县| 商都县| 尉氏县| 廉江市| 三门峡市| 进贤县| 余干县| 苏尼特左旗| 鹤峰县| 寻乌县| 麦盖提县| 阿克苏市| 祁阳县| 来安县| 阳高县| 德州市| 隆尧县| 新邵县| 乌鲁木齐市| 五大连池市| 晴隆县| 平利县|