浅谈mybatis返回单一对象或对象列表的问题

 更新时间:2021年08月25日 10:18:00   作者:MichaelChansn  
这篇文章主要介绍了浅谈mybatis返回单一对象或对象列表的问题,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教

mybatis返回单一对象或对象列表

一、说明

  • 返回数据类型由dao中的接口和map.xml文件共同决定。另外,不论是返回单一对象还是对象列表,***map.xml中的配置都是一样的,都是resultMap=”***Map”或resultType=“* .* .*”类型.
  • 每一次mybatis从数据库中select数据之后,都会检查数据条数和dao中定义的返回值是否匹配。
  • 若返回一条数据,dao中定义的返回值是一个对象或对象的List列表,则可以正常匹配,将查询的数据按照dao中定义的返回值存放。
  • 若返回多条数据,dao中定义的返回值是一个对象,则无法将多条数据映射为一个对象,此时mybatis报错。

二、代码测试

UserMap.xml映射文件

<resultMap id="BaseResultMap" type="com.ks.ssm.domain.User" >
    <id column="id" property="id" jdbcType="BIGINT" />
    <result column="username" property="username" jdbcType="VARCHAR" />
    <result column="password" property="password" jdbcType="VARCHAR" />
    <result column="email" property="email" jdbcType="VARCHAR" />
    <result column="qq" property="qq" jdbcType="VARCHAR" />
    <result column="phone" property="phone" jdbcType="VARCHAR" />
    <result column="gender" property="gender" jdbcType="BIT" />
    <result column="birthday" property="birthday" jdbcType="DATE" />
    <result column="city" property="city" jdbcType="VARCHAR" />
    <result column="mood" property="mood" jdbcType="VARCHAR" />
    <result column="single" property="single" jdbcType="BIT" />
    <result column="enrolltime" property="enrolltime" jdbcType="TIMESTAMP" />
    <result column="level" property="level" jdbcType="TINYINT" />
    <result column="status" property="status" jdbcType="BIT" />
    <result column="titlepic" property="titlepic" jdbcType="VARCHAR" />
    <result column="job" property="job" jdbcType="VARCHAR" />
    <result column="logintime" property="logintime" jdbcType="TIMESTAMP" />
    <result column="loginip" property="loginip" jdbcType="VARCHAR" />
    <result column="token" property="token" jdbcType="VARCHAR" />
    <result column="modifytime" property="modifytime" jdbcType="TIMESTAMP" />
  </resultMap>
  <sql id="Base_Column_List" >
    id, username, password, email, qq, phone, gender, birthday, city, mood, single, enrolltime, 
    level, status, titlepic, job, logintime, loginip, token, modifytime
  </sql>
  <select id="selectByPrimaryKey" resultMap="BaseResultMap" parameterType="java.lang.Long" >
    select 
    <include refid="Base_Column_List" />
    from user_info
    where id = #{id,jdbcType=BIGINT}
  </select>
  <!-- add by ks -->
    <select id="selectByUserName" resultMap="BaseResultMap" parameterType="java.lang.String" >
    select 
    <include refid="Base_Column_List" />
    from user_info
    where username = #{username,jdbcType=VARCHAR}
   </select>
   <!-- mybatis 非常的智能,返回值统一使用 resultMap="BaseResultMap",mybatis会根据查询到的条目数量自动进行判断,如果是一条就返回对象,如果是多条就返回List对象列表-->
  <select id="selectByEmail" resultMap="BaseResultMap" parameterType="java.lang.String" >
    select 
    <include refid="Base_Column_List" />
    from user_info
    where email = #{email,jdbcType=VARCHAR}
   </select>
   <!-- end by ks -->

dao文件UserMap.java

public interface UserMapper {
    User selectByPrimaryKey(Long id);
    User selectByUserName(String username );
    /**关于mybatis返回单一对象或对象列表的问题:
     * 1.返回数据类型由dao中的接口和*map.xml文件共同决定。另外,不论是返回单一对象还是对象列表,*map.xml中的配置都是一样的,都是resultMap="*Map"*或resultType=“* .* .*”类型.
     * 2.每一次mybatis从数据库中select数据之后,都会检查数据条数和dao中定义的返回值是否匹配。
     * 3.若返回一条数据,dao中定义的返回值是一个对象或对象的List列表,则可以正常匹配,将查询的数据按照dao中定义的返回值存放。
     * 4.若返回多条数据,dao中定义的返回值是一个对象,则无法将多条数据映射为一个对象,此时mybatis报错。
     * */
    List<User> selectByEmail(String email );
}

测试代码和结果文件

@RunWith(SpringJUnit4ClassRunner.class)     //表示继承了SpringJUnit4ClassRunner类
@ContextConfiguration(locations = {"classpath:spring-mybatis.xml"})
public class TestMyBatis {
  private static Logger logger = Logger.getLogger(TestMyBatis.class);
  @Resource
  private UserMapper userDao;
  @Test
  public void testMybatis() {
    User user = userDao.selectByUserName("ks");
    logger.info("user.........................");
    logger.info(JSON.toJSONString(user));
    List<User> users=userDao.selectByEmail("ks");
    logger.info("list.........................");
    for(User userTemp : users)
    {
        logger.info(JSON.toJSONString(userTemp));
    }
  }
}

测试结果

mybatis 返回的对象包含集合

DeviceQuestionInstruction.java

import com.hikari.cloud.data.entity.TbInstruction;
import lombok.Data;
import java.util.Date;
import java.util.List;
@Data
public class DeviceQuestionInstruction {//tb_instruction  使用说明表
    private String dvqsTitle;
    private List<TbInstruction> instructionList;
}

TbInstruction.java

import lombok.Data;
import java.util.Date;
@Data
public class TbInstruction {//tb_instruction  使用说明表
    private Long id;
    private Long userId;
    private String title;
    private String detail;
    private String url;
    private Integer type;
    private Integer suffix;
    private String deviceCategory;
    private String deviceTypeName;
    private String deviceTypeNum;
    private Integer views;
    private Long dvqsId;
    private Integer dvqsLevel;
    private Date gmtCreate;
}

TbDeviceQuestionMapper.java

import com.hikari.cloud.data.bean.DeviceQuestionInstruction;
import org.apache.ibatis.annotations.Param;
import java.util.List;
public interface TbDeviceQuestionMapper {
    List<DeviceQuestionInstruction> findByNo(@Param("deviceTypeNo") String deviceTypeNo);
}

TbDeviceQuestionMapper.xml

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
        PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
        "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.hikari.cloud.data.mapper.TbDeviceQuestionMapper">
    <resultMap id="dataMap" type="com.hikari.cloud.data.bean.DeviceQuestionInstruction">
        <result column="dvqs_title" property="dvqsTitle"/>
        <collection property="instructionList" resultMap="insResultMap"/>
    </resultMap>
    <resultMap id="insResultMap" type="com.hikari.cloud.data.entity.TbInstruction">
        <result column="id" property="id"/>
        <result column="user_id" property="userId"/>
        <result column="title" property="title"/>
        <result column="detail" property="detail"/>
        <result column="url" property="url"/>
        <result column="type" property="type"/>
        <result column="suffix" property="suffix"/>
        <result column="device_category" property="deviceCategory"/>
        <result column="device_type_name" property="deviceTypeName"/>
        <result column="device_type_num" property="deviceTypeNum"/>
        <result column="views" property="views"/>
        <result column="dvqs_id" property="dvqsId"/>
        <result column="dvqs_level" property="dvqsLevel"/>
        <result column="gmt_create" property="gmtCreate"/>
    </resultMap>
    <select id="findByNo" resultType="com.hikari.cloud.data.bean.DeviceQuestionInstruction" resultMap="dataMap">
        SELECT tb_device_question.title AS dvqs_title,tb_instruction.* FROM tb_device_question
        LEFT JOIN tb_instruction
        ON tb_device_question.id=tb_instruction.dvqs_id
        WHERE tb_device_question.device_type_no='HSAT-K5'
        ORDER BY tb_instruction.dvqs_level ASC
    </select>
</mapper>

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • Java程序顺序结构中逻辑控制语句详解流程

    Java程序顺序结构中逻辑控制语句详解流程

    在程序开发的过程之中一共会存在有三种程序逻辑:顺序结构、分支结构、循环结构,对于之前所编写的代码大部分都是顺序结构的定义,即:所有的程序将按照定义的代码顺序依次执行
    2021-10-10
  • Java 继承与多态超详细梳理

    Java 继承与多态超详细梳理

    继承就是可以直接使用前辈的属性和方法。自然界如果没有继承,那一切都是处于混沌状态。多态是同一个行为具有多个不同表现形式或形态的能力。多态就是同一个接口,使用不同的实例而执行不同操作
    2022-04-04
  • Java看完秒懂版熔断和降级的关系

    Java看完秒懂版熔断和降级的关系

    这篇文章主要介绍了Java熔断和降级的关系,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2021-09-09
  • Java使用ArrayList实现扑克牌的示例代码

    Java使用ArrayList实现扑克牌的示例代码

    学习了关于集合类的知识,我们可以做一个小项目来加深对集合类知识的学习!本文就来利用ArrayList实现扑克牌发牌洗牌效果,需要的可以参考一下
    2022-10-10
  • mybatis @Alias注解在类上的使用方式(推荐)

    mybatis @Alias注解在类上的使用方式(推荐)

    这篇文章主要介绍了mybatis @Alias注解在类上的使用方式,非常不错,具有一定的参考借鉴价值,需要的朋友可以参考下
    2018-05-05
  • springboot schedule 解决定时任务不执行的问题

    springboot schedule 解决定时任务不执行的问题

    这篇文章主要介绍了springboot schedule 解决定时任务不执行的问题,本文给大家介绍的非常详细,具有一定的参考借鉴价值,需要的朋友可以参考下
    2019-09-09
  • Java+Windows+ffmpeg实现视频转换功能

    Java+Windows+ffmpeg实现视频转换功能

    这篇文章主要为大家详细介绍了Java+Windows+ffmpeg实现视频转换功能,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2018-12-12
  • Struts2学习教程之Action类如何访问WEB资源

    Struts2学习教程之Action类如何访问WEB资源

    这篇文章主要给大家介绍了关于Struts2学习教程之Action类如何访问WEB资源的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧。
    2018-04-04
  • 在spring中实例化bean无效的问题

    在spring中实例化bean无效的问题

    这篇文章主要介绍了在spring中实例化bean无效的问题,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-02-02
  • springboot如何使用@Value获取配置文件的值

    springboot如何使用@Value获取配置文件的值

    这篇文章主要介绍了springboot如何使用@Value获取配置文件的值,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-08-08

最新评论