Mapper.xml映射文件中定義了操作數據庫的sql,每個sql是一個statement,映射文件是mybatis的核心。
1、parameterType(輸入類型)
通過parameterType指定輸入參數的類型,類型可以是簡單類型、hashmap、pojo的包裝類型。
#{}實現的是向prepareStatement中的預處理語句中設置參數值,sql語句中#{}表示一個占位符即?。
例如:
<select id="findUserById" parameterType="int" resultType="user"> select * from user where id = #{id} </select>
使用占位符#{}可以有效防止sql注入,在使用時不需要關心參數值的類型,mybatis會自動進行java類型和jdbc類型的轉換。#{}可以接收簡單類型值或pojo屬性值,如果parameterType傳輸單個簡單類型值,#{}括號中可以是value或其它名稱。
${}和#{}不同,通過${}可以將parameterType 傳入的內容拼接在sql中且不進行jdbc類型轉換, ${}可以接收簡單類型值或pojo屬性值,如果parameterType傳輸單個簡單類型值,${}括號中只能是value。使用${}不能防止sql注入,但是有時用${}會非常方便,如下的例子:
<select id="selectUserByName" parameterType="string" resultType="user">
select * from user where username like '%${value}%'
</select>
使用#{}則傳入的字符串中必須有%號,而%是人為拼接在參數中,顯然有點麻煩,如果采用${}在sql中拼接為%的方式則在調用mapper接口傳遞參數就方便很多。
如果使用${}原始符號則必須人為在傳參數中加%。
List<User> list = userMapper.selectUserByName("%管理員%");
如果使用%${value}%則不用人為在參數中加%。
List<User>list = userMapper.selectUserByName("管理員");
parameterType也可以傳遞pojo對象。Mybatis使用ognl表達式解析對象字段的值,如下例子:
<!—傳遞pojo對象綜合查詢用戶信息 -->
<select id="findUserByUser" parameterType="user" resultType="user">
select * from user where id=#{id} and username like '%${username}%'
</select>
上邊%${username}%中的username就是user對象中對應的屬性名稱。
parameterType還可以傳遞pojo包裝對象(也就是將多個對象包裝為一個對象)。開發中通過pojo傳遞查詢條件 ,查詢條件是綜合的查詢條件,不僅包括用戶查詢條件還包括其它的查詢條件(比如將用戶購買商品信息也作為查詢條件),這時可以使用包裝對象傳遞輸入參數。
例如下面的包裝對象:
public class QueryVo { private User user; private UserCustom userCustom; }
在映射文件中的使用
<!—傳遞pojo包裝對象綜合查詢用戶信息 -->
<select id="findUserByUser" parameterType="queryVo" resultType="user"> select * from user where id=#{user.id} and username like '%${user.username}%' </select>
可以看出通過使用類似java中對象訪問屬性的形式來進行參數傳遞。
parameterType也可以傳遞hashmap類型的參數
在xml映射文件中使用形式如下:
<select id="findUserByHashmap" parameterType="hashmap" resultType="user"> select * from user where id=#{id} and username like '%${username}%' </select>
在代碼中的調用形式如下:
Public void testFindUserByHashmap()throws Exception{ //獲取session SqlSession session = sqlSessionFactory.openSession(); //獲限mapper接口實例 UserMapper userMapper = session.getMapper(UserMapper.class); //構造查詢條件Hashmap對象 HashMap<String, Object> map = new HashMap<String, Object>(); map.put("id", 1); map.put("username", "管理員"); //傳遞Hashmap對象查詢用戶列表 List<User>list = userMapper.findUserByHashmap(map); //關閉session session.close(); }
這樣,可以把參數以key-value的形式傳給Mybatis。如果傳遞的map中的key和xml映射文件的sql語句中解析的key不一致,系統不會報錯,但是通過key獲取值為空。
2、resultType
使用resultType可以進行輸出映射,只有查詢出來的列名和pojo中的屬性名一致,才可以映射成功。如果查詢出來的列名和pojo中的屬性名全部不一致,就不會創建pojo對象。但是只要查詢出來的列名和pojo中的屬性有一個一致,就會創建pojo對象。
resultType可以輸出簡單類型。例如查詢用戶信息的綜合查詢列表總數,通過查詢總數和上邊用戶綜合查詢列表才可以實現分頁。
<!-- 獲取用戶列表總數 -->
<select id="findUserCount" parameterType="user" resultType="int"> select count(*) from user </select>
resultType可以輸出pojo對象和pojo列表。當使用動態代理時,輸出pojo對象和輸出pojo列表在xml映射文件中定義的resultType是一樣的,而生成的動態代理對象中是根據mapper方法的返回值類型確定是調用selectOne(返回單個對象調用)還是selectList (返回集合對象調用 )。
3、resultMap
mybatis中可以使用resultMap完成高級輸出結果映射。如果查詢出來的列名和定義的pojo屬性名不一致,就可以通過定義一個resultMap對列名和pojo屬性名之間作一個映射關系。然后使用resultMap作為statement的輸出映射類型。resultMap可以實現將查詢結果映射為復雜類型的pojo,比如在查詢結果映射對象中包括pojo和list實現一對一查詢和一對多查詢。這里先不做具體詳述,有興趣的可以參看Mybatis的官方文檔。