筆記:MyBatis 其他特性
- 多行結果集映射成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 其他特性