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

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

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

基本類型:前端

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

​ #{} 傳入值時,sql解析時,參數是帶引號的sql

​ 若是用了@Param("xxx") ,則mybatis會自動生成map做爲入參,那麼參數名稱則必須與佔位符一致session

<select id="findById" parameterType="int" resultType="cn.wh.vo.Role">
           select * from t_role where id = #{xxxid}
       </select>

測試:mybatis

@Test
       public void testSelectOne(){
           Role role = (Role)session.selectOne("cn.wh.mapper.RoleMapper.findById",1);
           System.out.println(role.getName());
       }

自定義類型app

自定義類型做爲參數,自定義類中須要爲爲屬性提供get方法,若是沒有提供get方法,那麼會根據佔位符中的名稱去反射獲取值,若是佔位符中的名稱和屬性不一致,那麼報ReflectionException。測試

<select id="findListBypage" parameterType="cn.wh.util.PageUtil" resultType="Role">
           select * from t_role limit #{index},#{size}
       </select>

測試:code

@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());
           }
       }

Mapxml

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解析時,參數是不帶引號的。
相關文章
相關標籤/搜索