一、使用注解實作多參數傳遞
首先應引入“org.apache.ibatis.annotations.Param”,我們在接口TeacherMapper中引入,并增加一個教師分頁查詢的方法findTeacherByPage的聲明。如下所示:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
<code>package</code> <code>com.abc.mapper;</code>
<code>import</code> <code>com.abc.domain.Teacher;</code>
<code>import</code> <code>org.springframework.stereotype.Component;</code>
<code>import</code> <code>java.util.List;</code>
<code>//使用@Param注解需要先引入Param</code>
<code>import</code> <code>org.apache.ibatis.annotations.Param;</code>
<code>//@Component指定映射器名稱為myTeacherMapper</code>
<code>//相關内容,可參考筆者部落格:</code>
<code>//http://legend2011.blog.51cto.com/3018495/980150</code>
<code>@Component</code><code>(</code><code>"myTeacherMapper"</code><code>)</code>
<code>public</code> <code>interface</code> <code>TeacherMapper {</code>
<code>public</code> <code>Teacher getById(</code><code>int</code> <code>id);</code>
<code>//分頁查詢教師資訊</code>
<code>public</code> <code>List<Teacher> findTeacherByPage(</code>
<code>//使用@Param("sort")注解,即可在SQL語句中</code>
<code>//以“#{sort}”的方式引用此方法的sort參數值。</code>
<code>//當然也可以在@Param中使用其他名稱,</code>
<code>//如@Param("mysort")</code>
<code>@Param</code><code>(</code><code>"sort"</code><code>) String sort,</code><code>//排序字段</code>
<code>//以下三個注解同理</code>
<code>@Param</code><code>(</code><code>"dir"</code><code>) String dir, </code><code>//排序方向</code>
<code>@Param</code><code>(</code><code>"start"</code><code>) </code><code>int</code> <code>start, </code><code>//起始記錄</code>
<code>@Param</code><code>(</code><code>"limit"</code><code>) </code><code>int</code> <code>limit </code><code>//記錄條數</code>
<code>);</code>
<code>}</code>
對應的映射檔案TeacherMapper.xml的内容如下:
26
<code><?</code><code>xmlversion</code><code>=</code><code>"1.0"</code><code>encoding</code><code>=</code><code>"utf8"</code><code>?></code>
<code><!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"</code>
<code>"http://mybatis.org/dtd/mybatis-3-mapper.dtd"></code>
<code><!--與以前一樣,namespace的值是對應的映射器接口的完整名稱--></code>
<code><</code><code>mapper</code> <code>namespace</code><code>=</code><code>"com.abc.mapper.TeacherMapper"</code><code>></code>
<code><!--教師實體映射--></code>
<code><</code><code>resultMap</code> <code>id</code><code>=</code><code>"supervisorResultMap"</code><code>type</code><code>=</code><code>"Teacher"</code><code>></code>
<code><</code><code>id</code> <code>property</code><code>=</code><code>"id"</code><code>/></code>
<code><</code><code>result</code> <code>property</code><code>=</code><code>"name"</code><code>/></code>
<code><</code><code>result</code> <code>property</code><code>=</code><code>"gender"</code><code>/></code>
<code><</code><code>result</code> <code>property</code><code>=</code><code>"researchArea"</code><code>column</code><code>=</code><code>"research_area"</code><code>/></code>
<code><</code><code>result</code> <code>property</code><code>=</code><code>"title"</code><code>/></code>
<code><!--collection元素映射教師的指導學生集合的屬性。這裡采用了</code>
<code>“命名空間名.select語句id”的形式來引用StudentMapper.xml中的</code>
<code>select語句getStudents。關于這種collection元素使用嵌套的</code>
<code>select語句的詳情,請參考筆者部落格:</code>
<code>http://legend2011.blog.51cto.com/3018495/985907</code>
<code>--></code>
<code><</code><code>collection</code> <code>property</code><code>=</code><code>"supStudents"</code> <code>column</code><code>=</code><code>"id"</code> <code>ofType</code><code>=</code><code>"Student"</code>
<code>select</code><code>=</code><code>"com.abc.mapper.StudentMapper.getStudents"</code><code>/></code>
<code></</code><code>resultMap</code><code>></code>
<code><</code><code>select</code> <code>id</code><code>=</code><code>"findTeacherByPage"</code> <code>resultMap</code><code>=</code><code>"supervisorResultMap"</code><code>></code>
<code>select * from teacher</code>
<code>order by ${sort} ${dir} limit #{start},#{limit}</code>
<code></</code><code>select</code><code>></code>
<code></</code><code>mapper</code><code>></code>
運作主程式如下:
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
<code>package</code> <code>com.demo;</code>
<code>import</code> <code>org.springframework.context.ApplicationContext;</code>
<code>import</code> <code>com.abc.mapper.StudentMapper;</code>
<code>import</code> <code>com.abc.mapper.TeacherMapper;</code>
<code>import</code> <code>com.abc.domain.Student;</code>
<code>import</code> <code>org.springframework.context.support.ClassPathXmlApplicationContext;</code>
<code>public</code> <code>class</code> <code>CollectionDemo</code>
<code>{</code>
<code>private</code> <code>static</code> <code>ApplicationContext ctx;</code>
<code>static</code>
<code>//在類路徑下尋找resources/beans.xml檔案</code>
<code>ctx = </code><code>new</code> <code>ClassPathXmlApplicationContext(</code><code>"resources/beans.xml"</code><code>);</code>
<code>public</code> <code>static</code> <code>void</code> <code>main(String[] args)</code>
<code>//從Spring容器中請求映射器</code>
<code>TeacherMapper mapper =</code>
<code>(TeacherMapper)ctx.getBean(</code><code>"myTeacherMapper"</code><code>);</code>
<code>Teacher teacher = </code><code>null</code><code>;</code>
<code>//查詢教師分頁資訊</code>
<code>List<Teacher> teachers =</code>
<code>//以name字段升序排序,從第0條記錄開始查詢。</code>
<code>//查詢2條記錄</code>
<code>mapper.findTeacherByPage(</code><code>"name"</code><code>,</code><code>"asc"</code><code>,</code><code>0</code><code>, </code><code>2</code><code>);</code>
<code>if</code><code>(teachers == </code><code>null</code><code>)</code>
<code>System.out.println(</code><code>"未找到相關教師資訊。"</code><code>);</code>
<code>else</code>
<code>Object[] t = teachers.toArray();</code>
<code>System.out.println(</code><code>"**********************************************"</code><code>);</code>
<code>for</code><code>(</code><code>int</code> <code>i = </code><code>0</code><code>; i < t.length; i++)</code>
<code>teacher = (Teacher)t[i];</code>
<code>System.out.println(</code><code>"教師姓名:"</code> <code>+ </code><code>" "</code> <code>+ teacher.getName());</code>
<code>System.out.println(</code><code>"教師職稱:"</code> <code>+ </code><code>" "</code> <code>+ teacher.getTitle());</code>
<code>System.out.println(</code><code>"指導學生資訊:"</code><code>);</code>
<code>//周遊指導的學生</code>
<code>for</code><code>(Student s : teacher.getSupStudents())</code>
<code>System.out.println( s.getName() + </code><code>" "</code> <code>+ s.getGender()</code>
<code>+ </code><code>" "</code> <code>+ s.getGrade()</code>
<code>+ </code><code>" "</code> <code>+ s.getMajor());</code>
<a href="http://blog.51cto.com/attachment/201210/194610816.png" target="_blank"></a>
二、可能會遇到的錯誤
1、關于order by
一般而言,我們會使用#{參數名}的形式來引用方法中的參數,但這種方式對于order by子句無效或報錯。例如,當TeacherMapper.xml的select語句findTeacherByPage中的order by子句以#{sort}的形式引用方法中的sort參數的值時,是無效的(讀者可自行驗證);以#{dir}的形式引用方法中的dir參數的值時,會報MySQLSyntaxErrorException,如下圖所示:
<a href="http://blog.51cto.com/attachment/201210/194712292.png" target="_blank"></a>
是以,在這裡使用了${參數名}的形式引用了相應的參數值。
2、invalid XML character錯誤
這是一個詭異的錯誤。當在映射檔案内的注釋中,漢字“錯”後緊跟中文的句号時即報此錯誤,如下圖所示:
<a href="http://blog.51cto.com/attachment/201210/194826800.png" target="_blank"></a>
在Spring的配置檔案beans.xml中,也是一樣。類似地,漢字“錯”後緊跟中文的逗号時也會報此錯誤。此時若在“錯”字後面加一漢字,即不再報錯;然而加“啊”字卻仍然報錯。讀者可自行嘗試,說不定還能找出其他錯誤的情形。
報出的異常都是org.xml.sax.SAXParseException(如上面錯誤圖檔中紅框左邊所示),這也許意味着它們都是使用同樣的xml解析元件。而這種錯誤,會不會是此元件的bug?
本文轉自 NashMaster2011 51CTO部落格,原文連結:http://blog.51cto.com/legend2011/1015003,如需轉載請自行聯系原作者