若映射器中的方法只有一個參數,則在對應的SQL語句中,能夠採用#{參數名}的方式來引用此參數,之前的例子多屬於此類。但這種方法卻不適用於須要傳遞多個參數的狀況,今天就來介紹如何使用註解傳遞多個參數(示例×××地址:http://down.51cto.com/data/537051)。 html
1、使用註解實現多參數傳遞 java
首先應引入「org.apache.ibatis.annotations.Param」,咱們在接口TeacherMapper中引入,並增長一個教師分頁查詢的方法findTeacherByPage的聲明。以下所示: spring
package com.abc.mapper; import com.abc.domain.Teacher; import org.springframework.stereotype.Component; import java.util.List; //使用@Param註解須要先引入Param import org.apache.ibatis.annotations.Param; //@Component指定映射器名稱爲myTeacherMapper //相關內容,可參考筆者博客: //http://legend2011.blog.51cto.com/3018495/980150 @Component("myTeacherMapper") public interface TeacherMapper { public Teacher getById(int id); //分頁查詢教師信息 public List<Teacher> findTeacherByPage( //使用@Param("sort")註解,便可在SQL語句中 //以「#{sort}」的方式引用此方法的sort參數值。 //固然也能夠在@Param中使用其餘名稱, //如@Param("mysort") @Param("sort") String sort,//排序字段 //如下三個註解同理 @Param("dir") String dir, //排序方向 @Param("start") int start, //起始記錄 @Param("limit") int limit //記錄條數 ); }
對應的映射文件TeacherMapper.xml的內容以下: apache
<?xmlversion="1.0"encoding="utf8"?> <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd"> <!--與之前同樣,namespace的值是對應的映射器接口的完整名稱--> <mapper namespace="com.abc.mapper.TeacherMapper"> <!--教師實體映射--> <resultMap id="supervisorResultMap"type="Teacher"> <id property="id"/> <result property="name"/> <result property="gender"/> <result property="researchArea"column="research_area"/> <result property="title"/> <!--collection元素映射教師的指導學生集合的屬性。這裏採用了 「命名空間名.select語句id」的形式來引用StudentMapper.xml中的 select語句getStudents。關於這種collection元素使用嵌套的 select語句的詳情,請參考筆者博客: http://legend2011.blog.51cto.com/3018495/985907 --> <collection property="supStudents" column="id" ofType="Student" select="com.abc.mapper.StudentMapper.getStudents"/> </resultMap> <select id="findTeacherByPage" resultMap="supervisorResultMap"> select * from teacher order by ${sort} ${dir} limit #{start},#{limit} </select> </mapper>
運行主程序以下: mybatis
package com.demo; import org.springframework.context.ApplicationContext; import com.abc.mapper.StudentMapper; import com.abc.mapper.TeacherMapper; import com.abc.domain.Teacher; import com.abc.domain.Student; import org.springframework.context.support.ClassPathXmlApplicationContext; import java.util.List; public class CollectionDemo { private static ApplicationContext ctx; static { //在類路徑下尋找resources/beans.xml文件 ctx = new ClassPathXmlApplicationContext("resources/beans.xml"); } public static void main(String[] args) { //從Spring容器中請求映射器 TeacherMapper mapper = (TeacherMapper)ctx.getBean("myTeacherMapper"); Teacher teacher = null; //查詢教師分頁信息 List<Teacher> teachers = //以name字段升序排序,從第0條記錄開始查詢。 //查詢2條記錄 mapper.findTeacherByPage("name","asc",0, 2); if(teachers == null) { System.out.println("未找到相關教師信息。"); } else { Object[] t = teachers.toArray(); System.out.println("**********************************************"); for(int i = 0; i < t.length; i++) { teacher = (Teacher)t[i]; System.out.println("教師姓名:" + " " + teacher.getName()); System.out.println("教師職稱:" + " " + teacher.getTitle()); System.out.println("指導學生信息:"); //遍歷指導的學生 for(Student s : teacher.getSupStudents()) { System.out.println( s.getName() + " " + s.getGender() + " " + s.getGrade() + " " + s.getMajor()); } System.out.println("**********************************************"); } } } }
運行結果以下:
2、可能會遇到的錯誤 app
一、關於order by dom
通常而言,咱們會使用#{參數名}的形式來引用方法中的參數,但這種方式對於order by子句無效或報錯。例如,當TeacherMapper.xml的select語句findTeacherByPage中的order by子句以#{sort}的形式引用方法中的sort參數的值時,是無效的(讀者可自行驗證);以#{dir}的形式引用方法中的dir參數的值時,會報MySQLSyntaxErrorException,以下圖所示: ide
所以,在這裏使用了${參數名}的形式引用了相應的參數值。 學習
二、invalid XML character錯誤 spa
這是一個詭異的錯誤。當在映射文件內的註釋中,漢字「錯」後緊跟中文的句號時即報此錯誤,以下圖所示:
在Spring的配置文件beans.xml中,也是同樣。相似地,漢字「錯」後緊跟中文的逗號時也會報此錯誤。此時若在「錯」字後面加一漢字,即再也不報錯;然而加「啊」字卻仍然報錯。讀者可自行嘗試,說不定還能找出其餘錯誤的情形。
報出的異常都是org.xml.sax.SAXParseException(如上面錯誤圖片中紅框左邊所示),這也許意味着它們都是使用一樣的xml解析組件。而這種錯誤,會不會是此組件的bug?
MyBatis技術交流羣:188972810,或掃描二維碼:
【MyBatis學習筆記】系列之預備篇一:ant的下載與安裝
【MyBatis學習筆記】系列之二:MyBatis增刪改示例
【MyBatis學習筆記】系列之三:MyBatis的association示例
【MyBatis學習筆記】系列之四:MyBatis association的兩種形式
【MyBatis學習筆記】系列之五:MyBatis與Spring集成示例
【MyBatis學習筆記】系列之六:MyBatis與Spring集成示例續
【MyBatis學習筆記】系列之七:MyBatis一對多雙向關聯
【MyBatis學習筆記】系列之八:MyBatis MapperScannerConfigurer配置
【MyBatis學習筆記】系列之九:MyBatis collection的兩種形式
【MyBatis學習筆記】系列之十:MyBatis日誌之Log4j示例
【MyBatis學習筆記】系列之十一:MyBatis多參數傳遞之註解方式示例
【MyBatis學習筆記】系列之十二:MyBatis多參數傳遞之默認命名方式示例
【MyBatis學習筆記】系列之十三:MyBatis多參數傳遞之Map方式示例
【MyBatis學習筆記】系列之十四:MyBatis中的N+1問題
【MyBatis學習筆記】系列之十五:MyBatis多參數傳遞之混合方式
【MyBatis學習筆記】系列之十六:Spring聲明式事務管理示例
【MyBatis學習筆記】系列之十七:MyBatis多對多保存示例
【MyBatis學習筆記】系列之十八:MyBatis多對多關聯查詢示例
【MyBatis學習筆記】系列之十九:如何在MyBatis-3.2.7中使用Log4j2 rc2