mybatis中關於${}和#{}取值的區別


1.相同點:

  #{}:都可以獲取map中的值或者pojo對象屬性的值;
  ${}:都可以獲取map中的值或者pojo對象屬性的值;

區別:  

  #{}:是以預編譯的形式,將參數設置到sql語句中(?,?,?)的形式,相當於原生JDBC中的PreparedStatement,可以防止sql注入;

  ${}:取出的值直接拼接在sql語句中,會有安全問題

建議: 大多數情況下,我們去參數的值都應該去使用#{};

${}的使用:

  原生jdbc不支持占位符的地方我們就可以使用${}進行取值
        比如分表、排序。。。;按照年份分表拆分
            select * from ${year}_salary where xxx;
            select * from tbl_employee order by ${f_name} ${order}

#{}:更豐富的用法:
    規定參數的一些規則:
    javaType、 jdbcType、 mode(存儲過程)、 numericScale、
    resultMap、 typeHandler、 jdbcTypeName、 expression(未來准備支持的功能);

    jdbcType通常需要在某種特定的條件下被設置:
        在我們數據為null的時候,有些數據庫可能不能識別mybatis對null的默認處理。比如Oracle(報錯);
        (在我們向數據庫插入一條數據時,有些字段為空時,在mysql下可以正常插入,不考慮數據庫的約束情況,在oracle下插入時有會爆jdbc Type OTHER的錯誤,因為mybaits

默認情況下是jdbc Type OTHER類型的,oracle不支持該類型),所以只要在下列加上一句oracle支持的類型jdbcType=null就可以成功的插入到oracle數據中


        JdbcType OTHER:無效的類型;因為mybatis對所有的null都映射的是原生Jdbc的OTHER類型,oracle不能正確處理;
        
        由於全局配置中:jdbcTypeForNull=OTHER;oracle不支持;兩種辦法
        1、#{email,jdbcType=OTHER};
        2、jdbcTypeForNull=NULL
            <setting name="jdbcTypeForNull" value="NULL"/>

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM