MyBatis多参数传递之注解方式示例——MyBatis学习笔记之十一

若映射器中的方法只有一个参数,则在对应的SQL语句中,可以采用#{参数名}的方式来引用此参数,以前的例子多属于此类。但这种方法却不适用于需要传递多个参数的情况,今天就来介绍如何使用注解传递多个参数(示例源码下载地址: http://down.51cto.com/data/537051)。
一、使用注解实现多参数传递
      首先应引入“org.apache.ibatis.annotations.Param”,我们在接口TeacherMapper中引入,并增加一个教师分页查询的方法findTeacherByPage的声明。如下所示:
 
 
  1. package com.abc.mapper;  

  2. import com.abc.domain.Teacher;  

  3. import org.springframework.stereotype.Component;  

  4. import java.util.List;  

  5. //使用@Param注解需要先引入Param 

  6. import org.apache.ibatis.annotations.Param;  

  7. //@Component指定映射器名称为myTeacherMapper 

  8. //相关内容,可参考笔者博客: 

  9. //http://legend2011.blog.51cto.com/3018495/980150 

  10. @Component("myTeacherMapper")  

  11. publicinterface TeacherMapper {  

  12. public Teacher getById(int id);  

  13. //分页查询教师信息 

  14. public List<Teacher> findTeacherByPage(  

  15. //使用@Param("sort")注解,即可在SQL语句中 

  16. //以“#{sort}”的方式引用此方法的sort参数值。 

  17. //当然也可以在@Param中使用其他名称, 

  18. //如@Param("mysort") 

  19. @Param("sort") String sort,//排序字段 

  20. //以下三个注解同理 

  21. @Param("dir") String dir,  //排序方向 

  22. @Param("start"int start, //起始记录 

  23. @Param("limit"int limit  //记录条数 

  24.         );  

  25. }  

      对应的映射文件TeacherMapper.xml的内容如下:
 
 
  1. <?xmlversion="1.0"encoding="utf8"?>

  2. <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"  

  3. "http://mybatis.org/dtd/mybatis-3-mapper.dtd">

  4. <!--与以前一样,namespace的值是对应的映射器接口的完整名称-->

  5. <mappernamespace="com.abc.mapper.TeacherMapper">

  6. <!--教师实体映射-->

  7. <resultMapid="supervisorResultMap"type="Teacher">

  8. <idproperty="id"/>

  9. <resultproperty="name"/>

  10. <resultproperty="gender"/>

  11. <resultproperty="researchArea"column="research_area"/>

  12. <resultproperty="title"/>

  13.             <!--collection元素映射教师的指导学生集合的属性。这里采用了  

  14.             “命名空间名.select语句id”的形式来引用StudentMapper.xml中的  

  15.             select语句getStudents。关于这种collection元素使用嵌套的  

  16.             select语句的详情,请参考笔者博客:  

  17.             http://legend2011.blog.51cto.com/3018495/985907  

  18.             -->

  19. <collectionproperty="supStudents"column="id"ofType="Student"

  20. select="com.abc.mapper.StudentMapper.getStudents"/>

  21. </resultMap>

  22. <selectid="findTeacherByPage"resultMap="supervisorResultMap">

  23.               select * from teacher             

  24.               order by ${sort} ${dir} limit #{start},#{limit}  

  25. </select>

  26. </mapper>

      运行主程序如下:
 
 
  1. package com.demo;  

  2. import org.springframework.context.ApplicationContext;  

  3. import com.abc.mapper.StudentMapper;  

  4. import com.abc.mapper.TeacherMapper;  

  5. import com.abc.domain.Teacher;  

  6. import com.abc.domain.Student;  

  7. import org.springframework.context.support.ClassPathXmlApplicationContext;  

  8. import java.util.List;  

  9. publicclass CollectionDemo  

  10. {  

  11. privatestatic ApplicationContext ctx;  

  12. static

  13.     {  

  14. //在类路径下寻找resources/beans.xml文件 

  15.         ctx = new ClassPathXmlApplicationContext("resources/beans.xml");  

  16.     }  

  17. publicstaticvoid main(String[] args)  

  18.     {  

  19. //从Spring容器中请求映射器 

  20.         TeacherMapper mapper =   

  21.                (TeacherMapper)ctx.getBean("myTeacherMapper");  

  22.         Teacher teacher = null;  

  23. //查询教师分页信息 

  24.         List<Teacher> teachers =  

  25. //以name字段升序排序,从第0条记录开始查询。 

  26. //查询2条记录 

  27.                  mapper.findTeacherByPage("name","asc",02);  

  28. if(teachers == null)  

  29.         {  

  30.             System.out.println("未找到相关教师信息。");  

  31.         }  

  32. else

  33.         {  

  34.             Object[] t = teachers.toArray();  

  35.             System.out.println("**********************************************");  

  36. for(int i = 0; i < t.length; i++)  

  37.             {  

  38.                 teacher = (Teacher)t[i];  

  39.                 System.out.println("教师姓名:" + "  " + teacher.getName());  

  40.                 System.out.println("教师职称:" + "  " + teacher.getTitle());  

  41.                 System.out.println("指导学生信息:");  

  42. //遍历指导的学生 

  43. for(Student s : teacher.getSupStudents())  

  44.                 {  

  45.                    System.out.println( s.getName() + "  " + s.getGender()   

  46.                                 + "  " + s.getGrade()  

  47.                                 + "  " + s.getMajor());  

  48.                 }  

  49.                 System.out.println("**********************************************");  

  50.             }  

  51.         }         

  52.     }  

      运行结果如下:

二、可能会遇到的错误
      1、关于order by
      一般而言,我们会使用#{参数名}的形式来引用方法中的参数,但这种方式对于order by子句无效或报错。例如,当TeacherMapper.xml的select语句findTeacherByPage中的order by子句以#{sort}的形式引用方法中的sort参数的值时,是无效的(读者可自行验证);以#{dir}的形式引用方法中的dir参数的值时,会报MySQLSyntaxErrorException,如下图所示:

       因此,在这里使用了${参数名}的形式引用了相应的参数值。

2、invalid XML character错误
      这是一个诡异的错误。当在映射文件内的注释中,汉字“错”后紧跟中文的句号时即报此错误,如下图所示:

       在Spring的配置文件beans.xml中,也是一样。类似地,汉字“错”后紧跟中文的逗号时也会报此错误。此时若在“错”字后面加一汉字,即不再报错;然而加“啊”字却仍然报错。读者可自行尝试,说不定还能找出其他错误的情形。

      报出的异常都是org.xml.sax.SAXParseException(如上面错误图片中红框左边所示),这也许意味着它们都是使用同样的xml解析组件。而这种错误,会不会是此组件的bug?
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值