当前位置: 首页 > article >正文

MyBatis 中 resultType 的使用详解

📌 MyBatis 中 resultType 的使用详解

💡 1. resultType 的含义
  • 在 MyBatis 中,resultType 指的是每一行查询结果的 Java 类型,而不是整个结果集的类型。
  • 常见的用法:
    • resultType="java.lang.String":表示每一行是一个字符串。
    • resultType="com.example.User":表示每一行是一个 User 对象。

🚀 2. resultType 与方法返回值类型的关系
  • MyBatis 自动将每一行的结果对象封装到一个 List 中。
  • 方法返回值类型通常是 List<对象>,但 resultType 只指定单行结果类型
  • 错误示例:
     

    <!-- 错误:resultType 不应该为 List --> <select id="getFilePathsById" resultType="java.util.List">

  • 正确示例:
    <!-- 正确:单行结果是 String -->
    <select id="getFilePathsById" resultType="java.lang.String">
        select file_path from vb_knowledge_base_attachment where id in
        <foreach collection="attachmentIds" item="id" separator="," open="(" close=")">
            #{id}
        </foreach>
    </select>
    
    
    List<String> getFilePathsById(@Param("attachmentIds") List<Long> attachmentIds);

为什么使用 java.lang.String 而不是 List

  1. MyBatis 处理机制

    • MyBatis 会逐行处理查询结果。
    • 每一行查询的结果会映射成一个对象,然后将这些对象收集到一个 List 中。
    • resultType 就是用于指定单行结果的类型,而不是整个列表的类型。
  2. SQL 查询:

     

    select file_path from vb_knowledge_base_attachment where id in (1, 2, 3);

    • 这个查询返回的结果是类似于:
       

      file_path ----------- /path/to/file1 /path/to/file2 /path/to/file3

    • 每一行是一个 String 类型,因此 resultType="java.lang.String"
  3. MyBatis 自动封装

    • MyBatis 自动将每一行返回的 String 封装到一个 List<String> 中。
    • 所以,最终方法的返回值是 List<String>

📝 3. 常见问题及解决
  • 问题: 报错 Result type not match for select... targetType: java.lang.String
  • 原因:
    1. XML 中 resultType 设置错误。
    2. 方法返回值类型与单行结果类型不匹配。
  • 解决方案:
    1. resultType 设置为单行数据类型,例如 java.lang.String
    2. 方法返回值类型设置为 List<String>
  1. Mapper 接口 方法:

     

    List<String> getFilePathsById(List<Long> attachmentIds);

    • 返回值是一个 List<String>
  2. MyBatis 映射文件

    <select id="getFilePathsById" resultType="list" parameterType="java.util.List"> select file_path from vb_knowledge_base_attachment where id in <foreach collection="list" item="id" separator="," open="(" close=")"> #{id} </foreach> </select>

    • 错误 1: resultType="list" 是错误的,MyBatis 没有这个类型。
    • 错误 2: parameterType="java.util.List" 是不必要的,可以简化。

🛠️ 正确写法:

1. 正确的 XML 映射文件:

<select id="getFilePathsById" resultType="java.lang.String" parameterType="java.util.List">
    select file_path from vb_knowledge_base_attachment where id in
    <foreach collection="attachmentIds" item="id" separator="," open="(" close=")">
        #{id}
    </foreach>
</select>

解释:

  1. resultType="java.lang.String"
    • 因为查询结果是多个文件路径(字符串),所以返回类型是 List<String>
  2. parameterType="java.util.List"
    • 参数是一个 List,因此指定类型为 java.util.List
  3. collection="attachmentIds"
    • collection 指定为方法参数的名称,即 @Param("attachmentIds")
  4. 使用 @Param 注解
    • 避免直接使用 list,更加规范。

🗒️ 4. 总结
  • resultType 表示每一行数据类型,而非整个结果集的类型。
  • 返回值类型为 List<resultType>,MyBatis 自动将每行结果封装为列表。
  • 切记:不要把 resultType 设置为集合类型

http://www.kler.cn/a/593438.html

相关文章:

  • 从0到1用cursor开发iOS应用(二)
  • SpringBoot第三站(4):配置嵌入式服务器使用外置的Servlet容器
  • MySQL 中利用 mysql.help_topic 实现行转列的深入剖析
  • YOLOv11有效涨点—以对某安防监控场景中的目标进行检测为例
  • 【Linux】进程间通信:system V共享内存
  • 解决 WSL1 Ubuntu 24.04 更新失败
  • Spring(6)——Spring、Spring Boot 与 Spring MVC 的关系与区别
  • ElasticSearch 7.x 集群 + Kibana 部署完全指南(5节点)
  • 多模态系列——调研可在笔记本电脑端部署的多模态大模型
  • 杂谈:前端 UI 框架和 UI 组件库的区别
  • 【已解决】Error: listen EACCES: permission denied 0.0.0.0:8082 端口占用+没有进程
  • 基于Python+MySql实现(Web)校园学习助手网站
  • Feign请求发生中文乱码
  • 您对下列文件的本地修改将被合并操作覆盖XXXXX请 在 合 并前 提 交 或贮 藏 您 的 修 改
  • 赛逸展2025创新模式,以科技创新奖赋能展位战略价值
  • 全流程数字化管理的智慧物流开源了。
  • (十六) 60s搞懂 : Zookeeper 的详细安装,使用及注意事项
  • navicat忘记已经连接过的数据库密码的操作步骤
  • MySQL事务详解:从理论到实践,保障数据一致性
  • RocketMQ分布式场景篇