MyBatis多参数传递之注解方式示例--转

原文地址:http://legend2011.blog.51cto.com/3018495/1015003

若映射器中的方法只有一个参数,则在对应的SQL语句中,可以采用#{参数名}的方式来引用此参数,以前的例子多属于此类。但这种方法却不适用于需要传递多个参数的情况,今天就来介绍如何使用注解传递多个参数(示例源码下载地址:http://down.51cto.com/data/537051)。

一、使用注解实现多参数传递

首先应引入“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

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的内容如下:


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

26

<?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>

运行主程序如下:


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

26

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

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",02);

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("**********************************************");

}

}

}

}

   运行结果如下:

二、可能会遇到的错误

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?

时间: 2024-10-12 19:07:58

MyBatis多参数传递之注解方式示例--转的相关文章

从零开始学JAVA(09)-使用SpringMVC4 + Mybatis + MySql 例子(注解方式开发)

项目需要,继续学习springmvc,这里加入Mybatis对数据库的访问,并写下一个简单的例子便于以后学习,希望对看的人有帮助.上一篇被移出博客主页,这一篇努力排版整齐,更原创,希望不要再被移出主页了. 原创文章,后面附上源码,转载请注明出处http://www.cnblogs.com/lin557/p/6179618.html 一.运行环境 Eclipse Neon.1a Release (4.6.1) 官网下载 mysql-5.7.16-winx64(http://cdn.mysql.co

SpringBoot+Mybatis 框架之 @SelectProvider注解方式搭建

之前搭建了@Select标签来做SringBoot+Mybatis的集成.这次使用@SelectProvider标签的方式搭建一次. 一.搭建SpringBoot的项目 https://start.spring.io/自己配置SpringBoot的项目,点击"Generate Project"按钮就可以下载下来一个配置好的SpringBoot项目. 二.项目结构 三.项目代码   原文地址:https://www.cnblogs.com/Lyh1997/p/10195183.html

mybatis之注解方式实现

* 使用mybatis举例,使用注解方式实现* 不需要针对UserMapperI接口去编写具体的实现类代码,这个具体的实现类由MyBatis帮我们动态构建出来,我们只需要直接拿来使用即可.* 1.导入jar包:mybatis和mysql-connector* 2.mybatis配置文件:mybatis-config.xml,加载Mapper接口路径* 3.编写JavaBean类:UserBean* 4.编写执行sql接口* 5.编写测试类进行测试 mybatis-config-zhujie.xm

MyBatis:参数传递 [转]

一.单个参数: public List<XXBean> getXXBeanList(String xxCode); <select id="getXXXBeanList" parameterType="java.lang.String" resultType="XXBean"> select t.* from tableName t where t.id= #{id} </select> 其中方法名和ID一致,

MyBtis注解方式注册异常

最近学习MyBatis,学习到注解方式实现增删改查使遇到异常,困惑的很长时间,最终找到解决问题的方法,共勉! 写好注解的接口后注册到配置文件时使用 方式一 <mapper class="com.liuyunlong.mybatis.annotation.UserMapper" /> 问题来了,抛出异常如下: org.apache.ibatis.exceptions.PersistenceException: ### Error building SqlSession. ##

MyBatis从入门到精通(第3章): MyBatis注解方式的基本使用

MyBatis 注解方式就是将 SQL 语句直接写在DAO层的接口上. 在黑马2018年录制的双元视频课:\08 SSM整合案例[企业权限管理系统]\07.订单操作  有使用mybatis注解进行多表关联查询的案例,在下文会有使用注解的补充说明. 这种方式的优点是 , 对于需求比较简单的系统,效率较高.缺点是 ,当 SQL 有变化时都需要重新编译代码, 一般情况下不建议使用MyBatis的注解方式 . 因此, (原书)本章不会进行深入讲解. 在 MyBatis 注解 SQL 中,最基本的就是@S

MyBatis应用开发(3)应用之开发方式注解方式篇

1.1. 注解方式 1.1.1. 开发步骤 目标:使用MyBatis从数据库中查询t_person表的全部记录. MyBatis还可以使用注解来配置数据库中的记录与Java对象之间的映射关系.此时SQL语句出现在Mapper接口的方法的注解中.优点是不再需要编写独立的Mapper配置文件. 使用MyBatis 的注解方式开发数据库应用的步骤如下所示: (1)编写POJO类Person. (2)编写Mapper接口PersonMapper. (3)编写业务接口PersonService. (4)编

springboot整合mybatis(映射文件方式和注解方式)

springboot作为一个微服务框架,给我们开发人员提供极大的便利,秉着约定大于配置的原则,通过starter包的形式为我们做了许多默认的配置,在进行数据持久化到关系型数据库时,我们一般都会首选spring data jpa,springboot为我们提供了starter包,只需配置很少的参数,就能满足我们的需求,非常方便.但是当我们遇到一些比较复杂的查询.多表关联查询及动态sql时,mybatis则在这方面更出色,并且在使用mybatis时我们可以通过sql优化来提高查询效率,springb

mybatis注解方式和xml方式的使用

Mybatis的注解方式的使用: Mybatis的xml的使用 原文地址:https://www.cnblogs.com/xjatj/p/9277426.html