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 <= #{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} "%" 注意在占位符兩側存在空格