1、SQL映射文件,頂級元素配置
mapper:映射文件的根元素節點,只有一個namespace(命名接口),用於區分不同mapper,全局唯一。綁定dao接口,即面向接口編程,當namespace綁定某一接口之后,可以不用寫該接口的實現類。
cache:配置給定命名空間的緩存
cache-ref:從其他命名空間引用緩存配置。
resultMap:用來描述數據庫結果集和對象的對應關系
sql:可以重用的SQL塊,也可以被其他語句引用
insert:映射插入語句
update:映射更新語句
delete:映射刪除語句
select:映射查詢語句
關於MyBatis的SQL映射文件中的mapper元素的namespace屬性有以下要求:
- namespace的命名必須跟某個DAO接口同名,同屬於DAO層,映射文件與DAO接口應防放置在同一package下,並且習慣都是以Mapper結尾。
- 在不同的mapper文件中,子元素的id可以相同,MyBatis通過namespace和子元素的id聯合區分,接口中的方法與映射文件中SQL語句id應一一對應
2、使用select完成單條件查詢
<select id="getUserListByUserName" resultType="User" paramterType="string">
select * from user where userName like CONCAT ('%',#{userName},'%')
</select>
select元素屬性
id:命名空間中的唯一標識符,可以被用來引用這條語句
parameterType:表示查詢語句傳入參數的類型的完全限定名或別名,它支持基礎數據類型和復雜數據類型。在上面的例子中使用的是基礎數據類
型“string”,這是一個別名,代表String,屬於一個內建的類
型別名。
resultType:查詢語句返回結果類型的完全限定名或別名。別名的使用方式與parameterType是一樣的。
別名 | 映射類型 | 別名 | 映射類型 |
string |
String | double | Double |
byte | Byte | float | Float |
long | Long | boolean | Boolean |
short | Short | date | Date |
int | Integer | map | Map |
integer | Integer | hashmap | HashMap |
arraylist | ArrayList | list | List |
3、MyBaits多條件查詢:
3.1、parameterType傳參類型可以為任何類型,該屬性可以不寫。當傳入一個參數為基本數據類型時,可以通過#{}來獲取傳入的值,也可以通過#{下標}來
獲取,也可使用${value}獲取。當傳入
為多個基本數據類型時只能用#{下標}獲取,下標從0開始。
例:
接口:
public List<User> getUserListByParam(String username,Integer roleId);
Mapper映射文件:
<select id="getUserListByParam" resultType="User" >
select * from smbms_user where username like CONCAT('%',#{0},'%') and userRole=#{1}
</select>
3.2、使用實體類,將參數封裝成對象傳入。#{}中的參數名需要與對象的屬性名一致。
接口:
public List<User> getUserListByUser(User user);
Mapper映射文件:
<select id="getUserListByUser" resultType="User" parameterType="User">
select * from smbms_user where username like CONCAT('%',#{userName},'%') and userRole=#{userRole}
</select>
3.3、使用Map集合,將參數存入Map集合進行傳遞。#{}中參數名需要與Map集合中的鍵名一致
接口:
public List<User> getUserListByUserMap(Map<String, String> map);
Mapper映射文件:
<select id="getUserListByUserMap" resultType="User"
parameterType="map">
select * from smbms_user where username like CONCAT('%',#{userName},'%') and userRole=#{userRole}
</select>
3.4、使用@Param注解傳遞多個參數。使用@Param注解封裝的參數小括號中參數名需要與#{}中參數名一致。
接口:
public List<User> getUserListByParam(@Param("userName")String username,@Param("userRole")Integer roleId);
Mapper映射文件:
<select id="getUserListByParam" resultType="User" >
select * from smbms_user where username like CONCAT('%',#{userName},'%') and userRole=#{userRole}
</select>
4、${}和#{}獲取參數的區別
4.1、#{}會將參數轉化成String類型進行處理(特殊字符會進行轉義),${}不會。
4.2、使用#{}會進行預處理,也就是表示使用PreparedStatement進行執行SQL語句,可以有效的防止sql注入,但是${}不會。
4.3、一般在進行排序order by的時候使用${},${value}(只有單個參數時使用${value}可以獲取到參數值,多個參數依然使用對象屬性或Map集合的鍵名)
4.4、在能使用#{}的時候就不要去用${}。