(超详细)在使用mybatis时遇到查询结果返回为空(NULL)的情况,但是查数据库能查到

当实体类包含其他实体类时,MyBatis使用resultMap和association处理查询。遇到查询返回NULL,但在数据库中存在数据的困扰。问题在于resultMap的association配置不完整。通过在association中正确设置id和result,根据教程调整配置后,查询返回正常。

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

这个问题困扰了我一个下午,看了很多博客都没有我中情况,所有写给和我有一样错误的

由于我的实体类里声明了其它实体类,所以在mapper.xml文件里要使用resultMap,在resultMap里要使用association引入,否则会报错

 

下面贴出我的实体类:

public class Subject {
    private Integer subid;
    private String subname;
    private Teacher tutor;
    private Teacher othertutor;

    //省略get和set方法
}

注意:声明了 Teacher 类

sql 语句:

<select id="getSubjectSim"  resultMap="SubjectMap">
   SELECT  tutorid,subname FROM tb_subject
</select>

resultMap:

<resultMap id="SubjectMap" type="com.learn.mydos.entity.Subject">
    <id column="subid" property="subid"/>
    <result column="subname" property="subname"/>
    <association property="tutor" javaType="com.learn.mydos.entity.Teacher" column="tutorid" >
    </association>
    <association property="othertutor" javaType="com.learn.mydos.entity.Teacher"              column="othertid">
    </association>
</resultMap>

   

这里用到了 association,property为实体类里定义的名称,javaType 为实体类,column 为数据库字段名

问题来了

我想取 Teacher 类里的 tid

 但是返回的是null,我到数据库里使用sql语句查询,能查到tid,我纠结了一会,重新去看mybaties里的association

下面我贴出教程里介绍的

关联:

<association property="author" column="blog_author_id" javaType="Author">
  <id property="id" column="author_id"/>
  <result property="username" column="author_username"/>
</association>

关联元素处理“有一个”类型的关系。比如,在我们的示例中,一个博客有一个用户。 关联映射就工作于这种结果之上。你指定了目标属性,来获取值的列,属性的 java 类型(很 多情况下 MyBatis 可以自己算出来) ,如果需要的话还有 jdbc 类型,如果你想覆盖或获取的 结果值还需要类型控制器。

关联中不同的是你需要告诉 MyBatis 如何加载关联。MyBatis 在这方面会有两种不同的 方式:

  • 嵌套查询:通过执行另外一个 SQL 映射语句来返回预期的复杂类型。
  • 嵌套结果:使用嵌套结果映射来处理重复的联合结果的子集。首先,然让我们来查看这个元素的属性。所有的你都会看到,它和普通的只由 select 和

resultMap 属性的结果映射不同。

看完之后,就按按照着教程在 association 里添加 id 和 result

<resultMap id="SubjectMap" type="com.learn.mydos.entity.Subject">
        <id column="subid" property="subid"/>
        <result column="subname" property="subname"/>
        <association property="tutor" javaType="com.learn.mydos.entity.Teacher" column="tutorid" >
            <id column="tutorid" property="tid"/>
            <result column="tname" property="tname"/>
        </association>
        <association property="othertutor" javaType="com.learn.mydos.entity.Teacher" column="othertid">
            <id column="othertid" property="tid"/>
            <result column="tname" property="tname"/>
        </association>

果然,再测试一下就有值了

<think>嗯,用户在使用IDEA的MyBatis查询数据库返回null,这个问题可能有很多原因。首先,我需要回忆一下常见的导致查询结果null情况。根据之前学过的知识,可能涉及到字段映射的问题,比如数据库列名和实体类属性名不一致,比如下划线和驼峰命名不匹配。这候,MyBatis可能无法正确映射结果,导致某些字段为null。然后,用户可能没有正确配置MyBatis的设置,比如是否启用了自动驼峰命名转换。如果没有开启mapUnderscoreToCamelCase,那么数据库中的user_name字段可能无法映射到实体类的userName属性,这样就会得到null值。引用3提到了这一点,需要检配置文件中的设置。 另外,SQL语句是否正确也是一个关键点。比如,是否在查询中正确选择了所有需要的列,或者是否有拼写错误。用户可能写的是SELECT*,但如果表结构有变动,或者实体类属性与数据库列不对应,也会导致null。此外,参数绑定是否正确,比如使用#{}和${}的区别,但这里用户的问题是关于结果返回null,可能和参数绑定无关,更多是结果映射的问题。 还有,结果集的映射方式是否正确。用户可能使用了resultType而不是resultMap,如果字段名和属性名不一致,这候就需要用resultMap来明确指定映射关系。引用3中的解决方案就是通过配置resultMap来解决字段映射的问题。另外,数据库连接是否正确,比如是否连接到正确的数据库,是否有权限访问表,这些也可能导致查询不到数据,返回null。但用户的问题应该排除了这种情况,因为可能其他查询正常,只是某个特定的查询有问题。 还可能存在类型处理器的问题,比如数据库中的某个字段类型在Java中没有对应的处理器,导致转换失败,但这种情况相对较少,尤其是使用常见的类型。总结一下,可能的原因有几个:字段名映射问题(驼峰和下划线)、resultMap未正确配置、SQL语句错误、配置未启用驼峰转换等。接下来需要一步步引导用户检这些方面,比如先检配置文件中是否开启了mapUnderscoreToCamelCase,然后检是否使用了resultMap,或者实体类属性是否与数据库列名匹配。此外,建议用户打印SQL日志,确认实际执行的SQL语句是否正确,以及返回结果集是否包含预期的数据。另外,用户可能在IDEA中配置数据库连接出现问题,或者实体类的getter/setter方法缺失,导致MyBatis无法注入值。这也是一个常见的问题点,需要检实体类是否有正确的访问方法。最后,可能需要用户提供更多的代码片段,比如Mapper文件、实体类定义和配置文件的内容,以便更准确地定位问题。但根据现有信息,应该优先考虑字段映射和配置设置的问题,结合引用中的解决方案给出具体的步骤。</think>在IDEA中使用MyBatis查询数据库返回null值的问题,通常由以下原因及解决方案构成: --- ### 一、字段映射不匹配 1. **驼峰命名与下划线转换问题** - **原因**:数据库列名如`user_name`与实体类属性`userName`未正确映射 - **解决方案**: - 在MyBatis配置文件中开启驼峰命名自动转换: ```xml <settings> <setting name="mapUnderscoreToCamelCase" value="true"/> </settings> ``` - 或手动在`<resultMap>`中定义映射关系(推荐)[^3]。 2. **列名与属性名完全不一致** - **原因**:SQL查询结果字段未绑定到实体类属性 - **解决方案**: 使用`<resultMap>`明确指定`column`和`property`的对应关系: ```xml <resultMap id="BaseResultMap" type="实体类全限定名"> <result column="数据库列名" property="实体类属性名"/> </resultMap> ``` 并在SQL语句中指定`resultMap="BaseResultMap"`[^3]。 --- ### 二、SQL语句问题 1. **查询字段缺失或别名错误** - **原因**:`SELECT *`可能遗漏字段,或字段别名与实体类属性不匹配 - **解决方案**: - 显式列出所有查询字段并检别名: ```xml <select id="queryUser" resultMap="BaseResultMap"> SELECT id, user_name AS userName FROM user_table </select> ``` 2. **参数绑定符号误用** - **原因**:排序查询使用`#{sort}`会导致字段被单引号包裹,引发语法错误 - **解决方案**:动态字段(如排序字段)使用`${sort}`,但需注意SQL注入风险[^2]。 --- ### 三、配置与日志排 1. **检MyBatis核心配置文件** - **关键点**:确认`mybatis-config.xml`中已加载Mapper文件,且路径正确[^4]。 2. **启用SQL日志** - **步骤**:在IDEA中配置日志框架(如Log4j),看实际执行的SQL语句和返回结果: ```xml <configuration> <settings> <setting name="logImpl" value="STDOUT_LOGGING"/> </settings> </configuration> ``` --- ### 四、其他常见原因 1. **实体类缺少Getter/Setter方法** - **原因**:MyBatis依赖Getter方法注入值 - **验证**:使用IDEA的`Generate`功能快速生成Getter/Setter。 2. **数据库连接问题** - **验证**:通过IDEA的数据库工具直接执行SQL,确认数据是否存在。 --- ### 五、操作流程图 1. 检字段映射 → 2. 验证SQL语句 → 3. 看日志 → 4. 修正配置 → 5. 测试结果 ---
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值