1. 程式人生 > >筆記:MyBatis 其他特性

筆記:MyBatis 其他特性

為我 進行 rri 展示 插件 筆記 public 獲取 註意

  • 多行結果集映射成Map

    如果你有一個映射語句返回多行記錄,並且你想以HashMap的形式存儲記錄的值,使用記錄列名作為key值,而記錄對應值或為value值。我們可以使用sqlSession.selectMap(),如下所示:

    <select id=" findAllStudents" resultMap="StudentResult">

    ????????select * from Students

    </select>

    Java代碼:

    Map<Integer, Student> studentMap =

    sqlSession.selectMap("com.mybatis3.mappers.StudentMapper.findAllStudents", "studId");

    這裏studentMap將會將studId作為key值,而Student對象作為value值。

  • 使用RowBounds對結果集進行分頁

    有時候,我們會需要跟海量的數據打交道,比如一個有數百萬條數據級別的表。由於計算機內存的現實我們不可能一次性加載這麽多數據,我們可以獲取到數據的一部分。特別是在Web應用程序中,分頁機制被用來以一頁一頁的形式展示海量的數據。MyBatis可以使用RowBounds逐頁加載表數據。RowBounds對象可以使用offset和limit參數來構建。參數offset表示開始位置,而limit表示要取的記錄的數目。

    假設如果你想每頁加載並顯示25條學生的記錄,你可以使用如下的代碼:

    <select id="findAllStudents" resultMap="StudentResult">

    ????????select * from Students

    </select>

    Java代碼:

    int offset =0 , limit =25;

    RowBounds rowBounds = new RowBounds(offset, limit);

    List<Student> = studentMapper.getStudents(rowBounds);

    註意:該分頁為邏輯分頁,也就是先把數據記錄全部查詢出來,然後在再根據offset和limit截斷記錄返回

  • 使用ResultSetHandler自定義結果集ResultSet處理

    MyBatis在將查詢結果集映射到JavaBean方面提供了很大的選擇性。但是,有時候我們會遇到由於特定的目的,需要我們自己處理SQL查詢結果的情況。MyBatis提供了ResultHandler插件形式允許我們以任何自己喜歡的方式處理結果集ResultSet。

    假設我們想從學生的stud_id被用作key,而name被用作value的HashMap中獲取到student信息。

    對於sqlSession.select()方法,我們可以傳遞給它一個ResultHandler的實現,它會被調用來處理ResultSet的每一條記錄。

    public interface ResultHandler

    {

    ????????void handleResult(ResultContext context);

    }

    現在然我們來看一下怎麽使用ResultHandler來處理結果集ResultSet,並返回自定義化的結果

    public Map<Integer, String> getStudentIdNameMap()

    {

    ????????final Map<Integer, String> map = new HashMap<Integer, String>();

    ????????SqlSession sqlSession = MyBatisUtil.openSession();

    ????????try

    ????????{

    ????????????????sqlSession.select("com.mybatis3.mappers.StudentMapper.findAllStudents",?new ResultHandler()

    ????????????????{

    ????????????????????????@Override

    ????????????????????????public void handleResult(ResultContext context)

    ????????????????????????{

    ????????????????????????????????Student student = (Student) context.getResultObject();

    ????????????????????????????????map.put(student.getStudId(), student.getName());

    ????????????????????????}

    ????????????????}?);

    ????????}

    ????????finally

    ????????{

    ????????????????sqlSession.close();

    ????????}

    ????????return map;

    }

    在上述的代碼中,我們提供了匿名內部ResultHandler實現類,在handleResult()方法中,我們使用context.getResultObject()獲取當前的result對象,即Student對象,因為我們定義了findAllStudent映射語句的resultMap="studentResult"。對查詢返回的每一行都會調用handleResult()方法,並且我們從Student對象中取出studId和name,將其放到map中。

筆記:MyBatis 其他特性