(十一)mybatis之映射器(select)
映射器
映射器的主要元素有八種:
元素名稱 |
描述 |
select |
查詢語句,可自定義參數 |
insert |
插入語句,執行後返回插入的條數 |
update |
更新語句,執行後返回更新的條數 |
delete |
刪除語句,執行後返回刪除的條數 |
sql |
定義一部分的sql,被各處引用 |
resultMap |
描述從數據庫中得到的結果,提供映射規則 |
cache |
給定命名空間的緩存配置 |
cache-ref |
其他命名空間緩存配置的引用 |
select元素
① 簡單地應用查詢的select元素:
<select id =”selectPerson” parameterType=”int” resultType=”hashmap”> SELECT * FROM PERSON WHERE ID=”#{id}” </select>
在<select>標簽中定義了,這個操作的標識id為”selectPerson”,而這個操作的接受的是int(Integer)類型的參數,並返回一個HashMap類型的對象。
其中的參數符號:
#{id}
就跟JDBC裏面的SQL語句中的一個預處理語句參數“?”是一樣的效果。
String selectPerson = “SELECT * FROM PERSON WHERE ID=?”;
而<select>標簽中的標識屬性id,需要與映射的Mapper類中的方法名一致。
public HashMap selectperson(int id);
這樣就可以使用Mybatis調用SQL了。
② 自動映射
在Mybatis的配置文件(mybatis-config.xml)中的settings下的參數autoMappingBehavior,當它不設置為NONE的時候,Mybatis就會提供自動映射的功能------只要返回的SQL列名和POJO的屬性一致,Mybatis就會回填這些字段而不需要任何設置。
在實際中,大部分的數據庫規範都是要求每個單詞用下劃線分隔,而Java則是用駝峰命名法來命名,於是使用列的別名
a) 使用列的別名。
package com.entity public class User{ private int id; private String userName; public int getId(){ return id; } public void setId(int id){ this.id = id; } public String getUserName(){ return userName; } public void setUserName(String userName){ this.userName = userName; } }
而數據庫表(user_info)的字段(簡略)如下:
字段 |
類型 |
說明 |
id |
int(20) |
角色編號,主鍵,遞增 |
user_name |
varchar(60) |
角色名稱 |
此時Mapper的映射語句是:
<select parameterType=”int” id=”getUser” resultType=”com.entity.User”> select id,user_name as username from user_info where id=#{id} </select>
對於UserDao接口,提供的方法是:
public User getUser(int id);
b) 在配置文件中啟用駝峰命名法:
設置settings屬性下的mapUnderscoreToCamelCase參數為true,這樣就可以實現從數據庫到POJO的自動映射了。
自動映射可以在settings元素中配置autoMappingBehavior屬性值來設定。
值 |
說明 |
NONE |
取消自動映射 |
PARTIAL |
只會自動映射,沒有定義嵌套結果集映射的結果集(默認值) |
FULL |
會自動映射任意復雜的結果集 |
③ 傳遞多個參數:
a) 使用Map傳遞參數。
我們可以使用Mybatis提供的Map接口作為參數來實現:
<select id=”findUserByMap” parameterType=”map” resultMap=”userMap”> select id,user_name from user_info where user_name like concat(‘%’,#{userName},‘%‘) </select>
對於UserDao接口:
public List<User> findUserByMap(Map<int, String> params);
傳遞參數:
Map<int, String> paramsMap = new HashMap<int, String>(); paramsMap.put(“id”,1); paramsMap.put(“username”,”tom”); userMapper.findUserByMap(paramsMap);
使用Map傳遞參數。因為Map導致業務可讀性喪失,從而導致後續擴展和維護的困難,所以這個方法廢棄掉。
b) 使用註解方式傳遞參數。
UserDao接口如下:
public List<User> findUserByAnnotation(@Param(“id”) int id, @Param(“userName”)String userName);
把映射器的XML修改為無需定義參數類型:
<select id=”findUserByAnnotation” parameterType=”map” resultMap=”userMap”> select id,user_name from user_info where user_name like concat(‘%’,#{userName},’%’) </select>
使用@Param註解傳遞多個參數,這種方式的使用受到參數個數(n)的影響。當n<=5時,它是最佳的傳參方式;當n>5的時候,多個參數將給調用帶來困難。
c) 使用JavaBean傳遞參數。
首先先定義一個UserParams的JavaBean:
package com.params; public class UserParam{ private String userName; public String getUserName(){ return userName; } public void setUserName(String userName){ this.userName = userName; } }
JavaBean傳遞參數:
<select id=”findUserByParams” parameterType=”com.params.UserParam” resultMap=”userMap”> select id,user_name from user_info where user_name like concat(‘%’,#{userName},’%’) </select>
同樣在RoleDao接口提供一個方法:
public List<User> findUserByParams(UserParam params);
當參數個數多於5個時,建議使用JavaBean方式。
參考文章:http://www.mybatis.org/mybatis-3/zh/sqlmap-xml.html
(十一)mybatis之映射器(select)