最近遇到一个问题
比如:
<select id="xxx">
SELECT * FROM xx WHERE is_deleted =0
</select>
这个mybatis 中写的 没有加resultmap 然后线上运行了一个星期都没问题 今天反馈 后台bug。我看了下。就是这行代码 返回的list 很多字段都是null 导致的。然后 我给后面加了一个resultmap 然后就好使了 我然后就立马有建了一个项目 把查询代码 粘贴过来 发现 有不报错了 返回的集合字段 都是有值的 我也没有加resultmap 就很纳闷 为什么有时候好使 有时候不好使
下面就是我定义的一些字段 刚开始都是好使的 后来就死活有下划线的 返回的都是null。换了一个新项目后 有好使 真的搞不懂
<id column="id" property="id"/>
<result column="user_id" property="userId"/>
<result column="user_name" property="userName"/>
看你描述的问题,应该是mybatis配置出来问题,mybatis配置中有一个配置是将_线转成驼峰形式的。你可以试试。
#驼峰下划线转换
db-column-underline: true
【以下回答由 GPT 生成】
问题的答案是: Mybatis中不是必须加resultmap标签来映射结果集。问题出现的原因可能是因为你的查询语句中的字段名与对应的实体类中的属性名不一致,导致无法自动映射。
如果你没有加上resultmap标签,Mybatis会尝试使用自动映射的方式将查询结果映射到对应的实体类中。自动映射是通过数据库查询返回的列名与实体类中的属性名进行对应,如果对应不上,就会出现字段返回null的情况。
解决该问题的方法是使用resultmap标签手动映射查询结果。你可以在对应的mapper XML文件中定义一个resultmap标签,将查询结果的列名与实体类中的属性名进行对应。下面是一个示例:
<resultMap id="userMap" type="User">
<id column="id" property="id"/>
<result column="user_id" property="userId"/>
<result column="user_name" property="userName"/>
</resultMap>
<select id="getUser" resultMap="userMap">
SELECT id, user_id, user_name
FROM users
WHERE id = #{id}
</select>
然后在对应的mapper接口中定义一个方法,使用@ResultMap注解指定使用的resultmap:
@Select("select * from users where id = #{id}")
@ResultMap("userMap")
User getUser(int id);
这样就能确保查询结果正确地映射到实体类中了。
另外,也可以通过使用@Results和@Result注解来定义resultmap,如下所示:
@Results(id = "userMap", value = {
@Result(column = "id", property = "id"),
@Result(column = "user_id", property = "userId"),
@Result(column = "user_name", property = "userName")
})
@Select("select * from users where id = #{id}")
User getUser(int id);
总结一下,是否需要加上resultmap标签取决于你的查询语句中的字段名与实体类中的属性名是否一致,如果一致则可以不加,采用自动映射的方式;如果不一致,则需要手动定义resultmap来映射查询结果。
【相关推荐】