輸入映射
通過parameterType指定輸入參數的類型,類型可以是簡單類型、hashmap、POJO的包裝類型。
舉個栗子:完成用戶信息的綜合查詢,需要傳入條件很複雜(可能包括用戶信息、其他信息,比如商品、訂單)。傳遞POJO的包裝類對象,看下面的實例:
定義包裝類型POJO
針對上面的需求,建議將條件包裝進自定義的POJO類中。
package cn.itcast.mybatis.po;
import java.util.List;
/**
* 包裝類型
* @author Administrator
*
*/
public class UserQueryVo {
private List<Integer> ids;
//包裝所需要的查詢條件
private UserCustom userCustom;
public UserCustom getUserCustom() {
return userCustom;
}
public void setUserCustom(UserCustom userCustom) {
this.userCustom = userCustom;
}
public List<Integer> getIds() {
return ids;
}
public void setIds(List<Integer> ids) {
this.ids = ids;
}
//可以包裝其他的查詢條件,訂單、商品
//....
Mapper.xml
在UserMapper.xml中定義用戶信息綜合查詢(查詢條件複雜,通過高級查詢進行復雜關聯查詢)。
<!-- 用戶信息綜合查詢
#{userCustom.sex}:取出pojo包裝對象中性別值
${userCustom.username}:取出pojo包裝對象中用戶名稱
-->
<select id="findUserList" parameterType="cn.itcast.mybatis.po.UserQueryVo"
resultType="cn.itcast.mybatis.po.UserCustom">
SELECT * FROM USER WHERE user.sex=#{userCustom.sex} AND user.username LIKE '%${userCustom.username}%'
</select>
Mapper.java
在UserMapper的接口類中定義接口:
//用戶信息綜合查詢
public List<UserCustom> findUserList(UserQueryVo userQueryVo) throws Exception;
測試代碼
@Test
public void testFindUserList() throws Exception {
SqlSession sqlSession = sqlSessionFactory.openSession();
//創建UserMapper對象,mybatis自動生成mapper代理對象
UserMapper userMapper = sqlSession.getMapper(UserMapper.class);
//創建包裝對象,設置查詢條件
UserQueryVo userQueryVo = new UserQueryVo();
UserCustom userCustom = new UserCustom();
userCustom.setSex("1");
userCustom.setUsername("張三丰");
userQueryVo.setUserCustom(userCustom);
//調用userMapper的方法
List<UserCustom> list = userMapper.findUserList(userQueryVo);
System.out.println(list);
}
輸出映射
resultType
使用resultType進行輸出映射,只有查詢出來的列名和POJO中的屬性名一致,該列纔可以映射成功。
如果查詢出來的列名和pojo中的屬性名全部不一致,沒有創建pojo對象。
只要查詢出來的列名和pojo中的屬性有一個一致,就會創建pojo對象。
輸出簡單類型-需求
用戶信息的綜合查詢列表總數,通過查詢總數和上邊用戶綜合查詢列表纔可以實現分頁。
Mapper.xml
<!-- 用戶信息綜合查詢總數
parameterType:指定輸入類型和findUserList一樣
resultType:輸出結果類型
-->
<select id="findUserCount" parameterType="cn.itcast.mybatis.po.UserQueryVo" resultType="int">
SELECT count(*) FROM USER WHERE user.sex=#{userCustom.sex} AND user.username LIKE '%${userCustom.user}%'
</select>
Mapper.java
//用戶信息綜合查詢總數
public int findUserCount(UserQueryVo userQueryVo) throws Exception;
測試代碼
@Test
public void testFindUserCount() throws Exception {
SqlSession sqlSession = sqlSessionFactory.openSession();
//創建UserMapper對象,mybatis自動生成mapper代理對象
UserMapper userMapper = sqlSession.getMapper(UserMapper.class);
//創建包裝對象,設置查詢條件
UserQueryVo userQueryVo = new UserQueryVo();
UserCustom userCustom = new UserCustom();
userCustom.setSex("1");
userCustom.setUsername("張三丰");
userQueryVo.setUserCustom(userCustom);
//調用userMapper的方法
int count = userMapper.findUserCount(userQueryVo);
System.out.println(count);
}
小結
查詢出來的結果集只有一行且一列,可以使用 簡單類型進行輸出映射。
輸出POJO對象和POJO列表
不管是輸出的pojo單個對象還是一個列表(list中包括pojo),在mapper.xml中resultType指定的類型是一樣的。
在mapper.java指定的方法返回值類型不一樣:
1. 輸出單個POJO對象,方法返回值是單個對象類型
//根據id查詢用戶信息
public User findUserById(int id) throws Exception;
2. 輸出POJO對象list,方法返回值是List<POJO>
//根據用戶名列查詢用戶列表
public List<User> findUserByName(String name) throws Exception;
生成的動態代理對象中是根據mapper方法的返回值類型確定是調用selectOne(返回單個對象調用)還是selectList (返回集合對象調用 )。
resultMap
mybatis中使用resultMap完成高級輸出結果映射。
使用方法
如果查詢出來的列名和POJO的屬性名不一致,通過定義一個resultMap對列名和POJO屬性名之間作一個映射關係。>
1. 定義resultMap
2. 使用resultMap作爲statement的輸出類型
將下邊的sql使用User完成映射
SELECT id id_,username username_ FROM USER WHERE id=#{value}
User類中屬性名和上邊查詢列名不一致。
- 定義resultMap
<!-- 定義resultMap
將SELECT id id_,username username_ FROM USER 和User類中的屬性作一個映射關係
type:resultMap最終映射的java對象類型,可以使用別名
id:對resultMap的唯一標識
-->
<resultMap type="user" id="userResultMap">
<!-- id表示查詢結果集中唯一標識
column:查詢出來的列名
property:type指定的pojo類型中的屬性名
最終resultMap對column和property作一個映射關係 (對應關係)
-->
<id column="id_" property="id"/>
<!--
result:對普通名映射定義
column:查詢出來的列名
property:type指定的pojo類型中的屬性名
最終resultMap對column和property作一個映射關係 (對應關係)
-->
<result column="username_" property="username"/>
</resultMap>
- 使用resultMap作爲statement的輸出映射類型
<!-- 使用resultMap進行輸出映射
resultMap:指定定義的resultMap的id,如果這個resultMap在其它的mapper文件,前邊需要加namespace
-->
<select id="findUserByIdResultMap" parameterType="int" resultMap="userResultMap">
SELECT id id_,username username_ FROM USER WHERE id=#{value}
</select>
- Mapper.java
//根據id查詢用戶信息,使用resultMap輸出
public User findUserByIdResultMap(int id) throws Exception;
- 測試代碼
@Test
public void testFindUserByIdResultMap() throws Exception {
SqlSession sqlSession = sqlSessionFactory.openSession();
//創建UserMapper對象,mybatis自動生成mapper代理對象
UserMapper userMapper = sqlSession.getMapper(UserMapper.class);
//調用userMapper的方法
User user = userMapper.findUserByIdResultMap(1);
System.out.println(user);
}
小結
使用resultType進行輸出映射,只有查詢出來的列名和pojo中的屬性名一致,該列纔可以映射成功。
如果查詢出來的列名和pojo的屬性名不一致,通過定義一個resultMap對列名和pojo屬性名之間作一個映射關係。