Mybatis基礎學習筆記(四)-select標簽參數解析


Mybatis基礎學習筆記(四)

parameterType參數解析
  • parameterType:表示參數的類型,指定dao方法的形參數據類型,在mapper映射文件select標簽中使用,Mybatis會在調用PreparedStatement.setXxx(索引,值)時將值賦予sql執行語句

  • <select id="findProductByPage" resultMap="productByPageMapper" parameterType="Condition">
        select * from products
        <where>
            <if test="id!=null ">
                and id = #{id}
            </if>
            <if test="name!=null">
                and name like #{name}
            </if>
            <if test="lp!=null">
                and price >= #{lp}
            </if>
            <if test="hp!=null">
                and  price &lt;= #{hp}
            </if>
        </where>
        limit ${(currentPage-1)*size} , ${size};
    </select>
    
  • 通過反射機制可以獲取dao接口參數類型推斷出parameterType,所以可以省略

  • 一個簡單類型的參數,#{參數名稱}中參數名稱任取

  • 多個簡單類型時使用@Param

    • 由Mybatis提供
    • 放置在dao接口對應方法的形參前
    • 屬性為自定義的參數名稱
    • 在使用了該注解后,mapper中占位符中所使用的參數名稱為該注解的value屬性值
  • 使用對象作為參數,在參數有多個時比較方便,將該對象的屬性值作為sql語句的參數

    • Mybtis會調用該參數對應的getXxx獲取該屬性值(測試發現只要屬性名或getXxx方法有一個匹配都可)
  • 另一種傳遞參數的辦法

    • #{property,javaType=java中數據類型名,jdbcType=數據類型名稱(CHAR、VARHCAR、INTEGER... ...)},這是一個完整格式
    • Mybatis可以自動檢測數據類型信息,一般只寫#{property}
按位置傳遞參數
  • dao接口方法中,形參列表按位置從左往右為0,1,2,3... ...
  • 語法格式#{arg0},#{arg1}... ...
  • 這種形式顯然不清晰
  • 3.5.1以上版本
使用Map傳遞參數
  • 使用方法#{key}
  • Map<String,Object>,不夠清晰
#和$的區別
  • 對#占位符使用的jdbc對象是PrepareStatement,Mybatis會創建出PrepareStatement,執行sql語句

  • 特點:

    • PrepareStatement對象執行sql語句效率高
    • 能避免sql注入,sql語句更安全
    • #{}常作為列值使用,位於等號右側,數據類型不同時設置參數的方法不同(可能會補充引號)
  • ${字符}代表字符串連接,將sql語句的其他內容和${}的內容使用+連接方式連接在一起

  • 特點:

    • Mybatis此時使用Statement對象執行sql語句

    • 沒有預編譯,sql語句效率低

    • 使用字符串拼接方式,有sql注入風險,有代碼安全問題

    • 不會區分數據類型,原樣拼接字符串不會自動加引號(特點),導致mysql在執行查詢時將參數當作表的列名,使用需自加引號,字符串替換在一些特殊情況下有作用

    • 常用作表名和列名,需要保證執行安全

    • 在簡單參數查詢時使用@Param命名參數,取值

resultType
  • 作用:封裝數據結果,代表結果類型
  • 值的類型:
    • 1.類型的全限定名稱:自定義的、基本類型、Map
    • 2.類型的別名, 例如 java.lang.Integer別名是int
  • 處理方式:mybatis執行sql語句, 然后mybatis調用類的無參數構造方法(使用反射),創建對象,同名的列賦值給同名的屬性:如person.setName(rs.getString("name")),在返回值是List時,mybatis會把對象放入List集合中,行數據映射一個實體類對象
  • 在設置返回值類型為Map時,Mybatis會將表列名與對應的值分別作為k/v傳入,在結果是一列時可行
設置別名
  • <typeAliases>
      <typeAlias alias="Author" type="domain.blog.Author"/>
      <typeAlias alias="Blog" type="domain.blog.Blog"/>
    </typeAliases>
    
  • 另外一種方式:

  • <typeAliases>
      <package name="domain.blog"/>
    </typeAliases>
    <!--指定一個包名,MyBatis 會在包名下面搜索需要的 Java Bean,在沒有注解的情況下,會使用 Bean 的首字母小寫的非限定類名來作為它的別名-->
    
  • 就可讀性而言寫全限定類名更好

resultMap
  • 解決的問題:resultType中需要實體類的屬性與表的列名對應,通過resultMap可以解決 實體類的屬性與表的列名不對應的問題,或者在sql語句中使用別名也可解決

  • <resultMap id="productByPageMapper" type="Product">
        <!--對於主鍵使用id標簽-->
        <id property="id" column="id"/>
        <result property="name" column="name"/>
        <result property="price" column="price"/>
        <result property="quantity" column="quantity"/>
    </resultMap>
    
    <select id="findProductByPage" resultMap="productByPageMapper">
        ...
    </select>
    
like
  • 使用#{}出現的問題:不會自動加百分號%,需要自行在設置查詢參數時拼接百分號
  • 直接在sql語句中拼接組織like的內容:
    • sql語句like的格式:"%" #{name} "%" 注意在占位符兩側存在空格


免責聲明!

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



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