SpringBoot应用:MyBatis的select语句如何返回数组类型

在SpringBoot应用中,比如想返回一个表的主键id构成的Long型数组Long[],需要在XxxMapper.xml文件中这样定义select语句:

<select id="selectIds" parameterType="int" resultType="Long">
   select id from sys_job_log limit #{count}
</select>

注意,虽然想返回的是Long[],但是resultType的值只能写成"Long",而不能写成"Long[]",否则会报如下错误:

Caused by: org.apache.ibatis.executor.ExecutorException: 
No constructor found in [Ljava.lang.Long; matching [java.lang.Long]

意思是我这里有个Long类型的数据,但无法找到一个合适的(以一个Long数据为入参的)Long数组(即[Ljava.lang.Long)的构造方法,因此报错。

然后在XxxMapper.java类中这样定义方法即可:

Long[] selectIds(@Param(value = "count") int count);

调用该方法,就可以返回一个Long[]的结果了。


PS:网上很多资料,都说将 resultType 的值写成 “Long[]”,其实是错的,误人子弟,坑。

MyBatis 目录(?)[-] mybatis实战教程mybatis in action之一开发环境搭建 mybatis实战教程mybatis in action之二以接口的方式编程 mybatis实战教程mybatis in action之三实现数据的增删改查 mybatis实战教程mybatis in action之四实现关联数据的查询 mybatis实战教程mybatis in action之五与spring3集成附源码 mybatis实战教程mybatis in action之六与Spring MVC 的集成 mybatis实战教程mybatis in action之七实现mybatis分页源码下载 mybatis实战教程mybatis in action之八mybatis 动态sql语句 mybatis实战教程mybatis in action之九mybatis 代码生成工具的使用 mybatis SqlSessionDaoSupport的使用附代码下载 转自:http://www.yihaomen.com/article/java/302.htm (读者注:其实这个应该叫做很基础的入门一下下,如果你看过Hibernate了那这个就非常的简单) (再加一条,其实大家可以看官方的教程更好些:http://mybatis.github.io/mybatis-3/,而且如果英文不是很好的那就看中文的:http://mybatis.github.io/mybatis-3/zh/sqlmap-xml.html) 写在这个系列前面的话: 以前曾经用过ibatis,这是mybatis的前身,当时在做项目时,感觉很不错,比hibernate灵活。性能也比hibernate好。而且也比较轻量级,因为当时在项目中,没来的及做很很多笔记。后来项目结束了,我也没写总结文档。已经过去好久了。但最近突然又对这个ORM 工具感兴趣。因为接下来自己的项目中很有可能采用这个ORM工具。所以在此重新温习了一下 mybatis, 因此就有了这个系列的 mybatis 教程. 什么是mybatis MyBatis是支持普通SQL查询,存储过程和高级映射的优秀持久层框架。MyBatis消除了几乎所有的JDBC代码和参数的手工设置以及结果集的检索。MyBatis使用简单的XML或注解用于配置和原始映射,将接口和Java的POJOs(Plan Old Java Objects,普通的Java对象)映射成数据库中的记录. orm工具的基本思想 无论是用过的hibernate,mybatis,你都可以法相他们有一个共同点: 1. 从配置文件(通常是XML配置文件中)得到 sessionfactory. 2. 由sessionfactory 产生 session 3. 在session 中完成对数据的增删改查和事务提交等. 4. 在用完之后关闭session 。 5. 在java 对象和 数据库之间有做mapping 的配置文件,也通常是xml 文件。 mybatis实战教程(mybatis in action)之一:开发环境搭建 mybatis 的开发环境搭建,选择: eclipse j2ee 版本,mysql 5.1 ,jdk 1.7,mybatis3.2.0.jar包。这些软件工具均可以到各自的官方网站上下载。 首先建立一个名字为 MyBaits 的 dynamic web project 1. 现阶段,你可以直接建立java 工程,但一般都是开发web项目,这个系列教程最后也是web的,所以一开始就建立web工程。 2. 将 mybatis-3.2.0-SNAPSHOT.jar,mysql-connector-java-5.1.22-bin.jar 拷贝到 web工程的lib目录. 3. 创建mysql 测试数据库和用户表,注意,这里采用的是 utf-8 编码 创建用户表,并插入一条测试数据 程序代码 程序代码 Create TABLE `user` ( `id` int(11) NOT NULL AUTO_INCREMENT, `userName` varchar(50) DEFAULT NULL, `userAge` int(11) DEFAULT NULL, `userAddress` varchar(200) DEFAULT NULL, PRIMARY KEY (`id`) ) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8; Insert INTO `user` VALUES ('1', 'summer', '100', 'shanghai,pudong'
<think>好的,我现在需要解释为什么在Spring Boot 2中,当传入数组或集合作为参数时,需要使用@Param注解。这个问题涉及到MyBatis框架和参数绑定的机制,我需要先理清相关知识点,然后组织一个清晰的回答。 首先,我应该回顾MyBatis中参数绑定的基本概念。MyBatis在映射XML文件中,通过#{}或${}来引用方法参数。当方法有多个参数时,默认情况下,MyBatis会将它们按照顺序命名为param1、param2等,或者使用@Param注解指定的名称。如果方法参数是一个集合类型,比如List或数组,直接使用默认名称可能无法正确引用。 接下来,我需要考虑在Spring Boot 2中,尤其是整合MyBatis时,参数传递的情况。假设在Mapper接口中,有一个方法需要传入一个集合或数组作为参数,比如根据多个ID查询用户。如果没有使用@Param,可能会出现MyBatis无法正确识别参数名称的问题,导致SQL语句中引用的参数名不正确。 例如,考虑以下Mapper方法: List<User> findByIds(List<Long> ids); 在XML映射文件中,如果直接写: SELECT * FROM user WHERE id IN (#{ids}) 这可能会导致错误,因为MyBatis默认不会将集合参数识别为“ids”,而是可能需要使用默认的param1,或者需要特殊处理集合类型。 这时候,使用@Param("ids")来明确指定参数名称,可以确保在XML中正确引用该参数。例如: List<User> findByIds(@Param("ids") List<Long> ids); 然后在XML中使用: SELECT * FROM user WHERE id IN <foreach item="item" collection="ids" open="(" separator="," close=")"> #{item} </foreach> 这样,MyBatis就能正确识别集合参数,并遍历它。 接下来,我需要考虑为什么在Spring Boot 2中特别需要注意这一点。可能的原因包括MyBatis版本的变化,或者Spring Boot自动配置的方式改变,导致参数绑定的默认行为有所不同。例如,在早期的MyBatis版本中,可能允许直接通过参数类型自动处理集合,但在较新的版本中,可能更严格地要求显式指定参数名称,尤其是在使用动态SQL的时候。 此外,可能涉及到MyBatis的参数解析机制。当方法只有一个参数时,如果没有@Param,MyBatis会直接使用该参数。但如果参数是集合类型(如List、数组),在动态SQL中使用foreach时,需要指定collection属性,而这个属性需要对应参数的名称。如果没有使用@Param,MyBatis可能无法确定集合参数的名称,因此必须显式指定。 比如,在动态SQL的foreach中,collection属性必须指定为@Param中的名称,或者在没有@Param时使用默认的_parameter(但这种方式可能不够直观且容易出错)。因此,使用@Param可以明确指定名称,使代码更清晰,避免潜在的错误。 另外,可能还存在MyBatisSpring Boot整合时的配置差异。例如,是否启用了某种参数名称的自动推断功能,或者是否使用了不同的参数解析器。在某些情况下,如果未正确配置,可能会导致参数名称无法正确获取,进而需要显式使用@Param。 总结起来,主要原因可能包括: 1. MyBatis在处理集合类型参数时,需要明确指定参数名称以便在动态SQL中引用。 2. 在方法有多个参数的情况下,必须使用@Param来区分各个参数,而集合或数组作为单个参数时,同样需要明确名称以确保正确绑定。 3. Spring Boot 2可能默认使用更为严格的参数解析策略,或者整合的MyBatis版本要求更明确的参数命名。 还需要验证这些结论是否正确。可以查阅MyBatis的官方文档,查看关于@Param注解的说明,以及处理集合参数时的建议。例如,MyBatis官方文档提到,在使用foreach元素时,collection属性需要指定为传入的List或数组的名称,如果未使用@Param,则对于单个集合参数,可以使用默认名称_parameter或param1,但显式使用@Param更推荐,以提高可读性和避免混淆。 此外,可能涉及到Java 8以上版本中参数名称的获取问题。在Java 8之前,如果没有使用-parameters编译参数,方法参数名称在反射中是不可用的,因此MyBatis可能无法获取参数名称,只能依赖param1这样的占位符。而使用@Param可以显式指定名称,避免依赖编译参数设置。但这个问题更多是在方法有多个参数的情况下,而单个集合参数可能也适用同样的规则。 综合以上分析,可以得出结论:在Spring Boot 2中,当传入数组或集合作为参数到MyBatis的Mapper方法时,需要使用@Param注解来明确指定参数名称,以便在XML映射文件中正确引用该集合,特别是在动态SQL的foreach元素中,必须指定collection属性为@Param定义的名称,否则MyBatis无法正确解析参数,导致SQL语句错误或执行失败。</think>在Spring Boot 2中,当通过MyBatis传递数组或集合作为参数时,使用`@Param`注解的主要原因如下: --- ### 1. **MyBatis的参数绑定机制** MyBatis默认通过参数名称或顺序索引(如`param1`)绑定参数。但以下情况需注意: - **单个集合/数组参数**:若未用`@Param`,MyBatis会将其命名为`_parameter`或`param1`,但动态SQL中需明确引用名称。 - **多参数场景**:若方法有多个参数(如集合+其他参数),必须通过`@Param`区分。 --- ### 2. **动态SQL的`<foreach>`要求** 在动态SQL中使用`<foreach>`遍历集合时,必须通过`collection`属性指定参数名称。例如: ```xml <foreach item="item" collection="ids" ...> ``` - 若未用`@Param`,需写为`collection="param1"`,但代码可读性差且易出错。 - 使用`@Param("ids")`后,直接写`collection="ids"`更清晰。 --- ### 3. **避免编译依赖问题** Java反射默认不保留方法参数名称(除非编译时启用`-parameters`)。若未显式指定`@Param`: - MyBatis可能无法正确获取参数名,导致绑定失败。 - `@Param`直接提供名称,无需依赖编译配置。 --- ### 示例对比 #### 不使用`@Param`(可能出错) ```java List<User> findUsers(List<Long> ids); // Mapper接口 ``` ```xml <select id="findUsers"> SELECT * FROM user WHERE id IN <foreach collection="param1" item="id"> <!-- 需用默认名称 --> #{id} </foreach> </select> ``` #### 使用`@Param`(推荐) ```java List<User> findUsers(@Param("ids") List<Long> ids); // 明确参数名 ``` ```xml <select id="findUsers"> SELECT * FROM user WHERE id IN <foreach collection="ids" item="id"> <!-- 直接引用名称 --> #{id} </foreach> </select> ``` --- ### 总结 - **核心原因**:确保MyBatis在动态SQL中能准确识别集合/数组参数的名称。 - **最佳实践**:无论参数数量,显式使用`@Param`可提升代码可读性并避免潜在错误。 - **Spring Boot 2的影响**:默认整合的MyBatis版本可能更严格遵循参数解析规则,推荐显式命名。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值