mapper.xml中返回值类型

这篇博客详细介绍了MyBatis中resultType和resultMap的用法,resultType用于简单返回类型,而resultMap用于复杂映射。通过示例展示了如何在XML映射文件中配置,并提及了在处理list参数时的注意事项,包括默认list参数的使用和自定义参数名的处理。同时,博主分享了在实际操作中遇到的问题及解决思路。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

因为两次都错在这个上面上,所以还是记录一下。。。。

resultType是直接表示返回类型的,比如Integer,String, List<Integer>也是一样,resultMap则是对外部ResultMap的引用

例如:

  <select id="selectByStatus" resultType="java.lang.Integer" parameterType="com.meihui.learning.viewmodel.admin.question.QuestionStatusVM">
    SELECT
    t_question.id
    FROM t_question LEFT JOIN t_question_status on t_question_status.question_id = t_question.id
    <where>
      and t_question.deleted = 0
      <if test="questionType != null">
        and t_question.question_type = #{questionType}
      </if>
      <if test="wrongStatus != null ">
        and t_question_status.wrong_status= #{wrongStatus}
      </if>
      <if test="subjectSecondId != null ">
        and t_question.subject_second_id= #{subjectSecondId}
      </if>
      <if test="subjectId != null ">
        and t_question.subject_id= #{subjectId}
      </if>
    </where>
  </select>
  <select id="getUserDingTaskByDdUserIdDeptId" resultMap="BaseResultMap">
    select
    <include refid="Base_Column_List"/>
    from t_user_ding_task
    where dd_user_id = #{ddUserId} and dept_id = #{deptId} and deleted = 0 limit 1
  </select>

 还有一种略特殊的,其实也不算特殊,之前没理解清楚,下面并没有引用外部的,所以用resultType是正常的。。 <include refid="Base_Column_List"/>这种才是外部引用。。。

  <select id="selectCountByDate"  resultType="com.meihui.learning.domain.other.KeyValue">
		SELECT create_time as name,COUNT(create_time) as value from
		        (
				  SELECT DATE_FORMAT(create_time,'%Y-%m-%d') as create_time from 
                   t_user_event_log
					WHERE  create_time  between  #{startTime}  and  #{endTime}
				) a
		GROUP BY create_time
  </select>
    List<KeyValue> selectCountByDate(@Param("startTime") Date startTime, @Param("endTime") Date endTime);

https://blog.youkuaiyun.com/woshixuye/article/details/27521071  这位很详细

还有就是关于传递参数为list的时候的一个小问题。。

默认的list,亲测可行

    List<UserDTO> selectByDdUserIds(List<String> list);
  <select id="selectByDdUserIds" resultMap="BaseResultMap">
    select
    <include refid="Base_Column_List" />
    from t_user_ding
    where id in
    <foreach item="ddUserId" collection="list" open="(" separator=","
             close=")">
      #{ddUserId}
    </foreach>
  </select>

这里的collection为list,所以上面的代码里不用传@Param("list")之类的

但是如果是自定义的,就得加上@Param("ddUserIds")之类的。。

    List<UserDTO> selectByDdUserIds(@Param("ddIdList") List<String> ddIdList);
  <select id="selectByDdUserIds" resultMap="BaseResultMap">
    select
    <include refid="Base_Column_List" />
    from t_user_ding
    where id in
    <foreach item="ddUserId" collection="ddIdList" open="(" separator=","
             close=")">
      #{ddUserId}
    </foreach>
  </select>

但其实我代码里这么写还是报错 。。。清过redis缓存,clean也clean过了。。就是报错。。。但是其他的xml里的也是这写法就可以,应该还是哪里出问题了。。

https://blog.youkuaiyun.com/qq_28379809/article/details/83342196 这位也很详细。。

### 配置 MyBatis Mapper.XML 将查询结果作为 Map 返回 在 MyBatis 中,可以通过设置 `resultType="java.util.Map"` 来让查询的结果自动封装成 Java 的 HashMap 对象。这种方式适用于不需要复杂映射关系的场景。 对于简单的键值对形式的数据存储到 map 中可以如下操作: #### 使用 resultType 属性指定返回类型为 java.util.Map ```xml <select id="getUsersAsMap" parameterType="int" resultType="java.util.Map"> SELECT user_id AS KEY, username AS VALUE FROM users WHERE department_id = #{departmentId} </select> ``` 上述 SQL 会将每一行记录转换成一个 entry 存储于最终返回的一个大 Map 中,其中 key 和 value 是由 select 后面定义的列名决定[^1]。 如果希望整个查询结果作为一个整体被放入单个 Map,则应考虑使用 resultMap 定义字与对象属性之间的关联规则,并通过 `<collection>` 或者其他方式来构建更复杂的结构。不过这通常用于列表类型的集合而非单一的 Map 实例。 当涉及到较为复杂的嵌套对象如 person 类及其内部含有的 card 成员变量时,推荐采用 resultMap 方式来进行精确控制[^3]。 为了使查询结果能够按照预期的方式存入 Map,在编写 Select 语句的时候需要注意两点: - 映射文件中声明的 sql 可以直接利用 as 关键字给列起别名以便更好地匹配目标实体类中的属性名称或者是 Map 键的名字。 - 如果是多条记录转成多个 Entry 放在一个总的 Map 里边的话,那么一般情况下我们会选取某唯一标识符作为 Key 而把其余所有信息打包成 Value (即另一个子 Map),这样做的好处是可以方便地获取特定用户的全部资料而不会造成混淆。 下面是一个具体的例子展示如何实现这一点: ```xml <!-- 获取用户信息并将其转化为 Map --> <select id="getUserInfoToMap" resultType="java.util.Map"> SELECT u.id, u.name, c.card_no, c.address FROM mybatis.user u LEFT JOIN card c ON u.card_id = c.id; </select> ``` 此代码将会读取数据库表 mybatis.user 并左连接 card 表的信息,最后得到的结果会被放进一个 Map 当中,每一条记录对应着该 Map 下的一组键值对。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值