Mybatis深入瞭解(四)----輸入輸出映射

輸入映射


    通過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屬性名之間作一個映射關係。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章