天天看點

MyBatis多參數傳遞之注解方式示例——MyBatis學習筆記之十一

一、使用注解實作多參數傳遞

      首先應引入“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&lt;Teacher&gt; 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>&lt;?</code><code>xmlversion</code><code>=</code><code>"1.0"</code><code>encoding</code><code>=</code><code>"utf8"</code><code>?&gt;</code>

<code>&lt;!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"</code>

<code>"http://mybatis.org/dtd/mybatis-3-mapper.dtd"&gt;</code>

<code>&lt;!--與以前一樣,namespace的值是對應的映射器接口的完整名稱--&gt;</code>

<code>&lt;</code><code>mapper</code> <code>namespace</code><code>=</code><code>"com.abc.mapper.TeacherMapper"</code><code>&gt;</code>

<code>&lt;!--教師實體映射--&gt;</code>

<code>&lt;</code><code>resultMap</code> <code>id</code><code>=</code><code>"supervisorResultMap"</code><code>type</code><code>=</code><code>"Teacher"</code><code>&gt;</code>

<code>&lt;</code><code>id</code> <code>property</code><code>=</code><code>"id"</code><code>/&gt;</code>

<code>&lt;</code><code>result</code> <code>property</code><code>=</code><code>"name"</code><code>/&gt;</code>

<code>&lt;</code><code>result</code> <code>property</code><code>=</code><code>"gender"</code><code>/&gt;</code>

<code>&lt;</code><code>result</code> <code>property</code><code>=</code><code>"researchArea"</code><code>column</code><code>=</code><code>"research_area"</code><code>/&gt;</code>

<code>&lt;</code><code>result</code> <code>property</code><code>=</code><code>"title"</code><code>/&gt;</code>

<code>&lt;!--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>--&gt;</code>

<code>&lt;</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>/&gt;</code>

<code>&lt;/</code><code>resultMap</code><code>&gt;</code>

<code>&lt;</code><code>select</code> <code>id</code><code>=</code><code>"findTeacherByPage"</code> <code>resultMap</code><code>=</code><code>"supervisorResultMap"</code><code>&gt;</code>

<code>select * from teacher</code>

<code>order by ${sort} ${dir} limit #{start},#{limit}</code>

<code>&lt;/</code><code>select</code><code>&gt;</code>

<code>&lt;/</code><code>mapper</code><code>&gt;</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&lt;Teacher&gt; 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 &lt; 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,如需轉載請自行聯系原作者