栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

数据库中查询有结果,代码运行返回对象为null

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

数据库中查询有结果,代码运行返回对象为null

小白上路,开车不稳之——Mybatis中使用查询语句SELECT进行编写,返回对象中个别数据为null


当遇到这个bug时,小白刚开始又以为自己写出bug,于是检查代码和SQL语句出错,反复检查后确定没有问题。思考一小时有余仍然没有头绪。于是上网搜索找类似问题,有关于实体类和返回结果不一致导致的,有说resultType和resultMap不能同时用的。最终发现本质原因在于mybatis中的返回结果使用的区别:即Resultmap和Resulttype的区别。
进mybatis官网发现这段话:(深邃难懂,不读三遍以上难以理解)

通过类型处理器的泛型,MyBatis 可以得知该类型处理器处理的 Java 类型,不过这种行为可以通过两种方法改变:

在类型处理器的配置元素(typeHandler 元素)上增加一个 javaType 属性(比如:javaType=“String”);
在类型处理器的类上增加一个 @MappedTypes 注解指定与其关联的 Java 类型列表。 如果在 javaType
属性中也同时指定,则注解上的配置将被忽略。 可以通过两种方式来指定关联的 JDBC 类型:

在类型处理器的配置元素上增加一个 jdbcType 属性(比如:jdbcType=“VARCHAR”); 在类型处理器的类上增加一个
@MappedJdbcTypes 注解指定与其关联的 JDBC 类型列表。 如果在 jdbcType
属性中也同时指定,则注解上的配置将被忽略。 当在 ResultMap 中决定使用哪种类型处理器时,此时 Java
类型是已知的(从结果类型中获得),但是 JDBC 类型是未知的。 因此 Mybatis 使用 javaType=[Java 类型],
jdbcType=null 的组合来选择一个类型处理器。 这意味着使用 @MappedJdbcTypes
注解可以限制类型处理器的作用范围,并且可以确保,除非显式地设置,否则类型处理器在 ResultMap 中将不会生效。 如果希望能在
ResultMap 中隐式地使用类型处理器,那么设置 @MappedJdbcTypes 注解的
includeNullJdbcType=true 即可。 然而从 Mybatis 3.4.0 开始,如果某个 Java
类型只有一个注册的类型处理器,即使没有设置 includeNullJdbcType=true,那么这个类型处理器也会是 ResultMap
使用 Java 类型时的默认处理器。

mybatis官方文档

个人理解就是(参考大佬心得):

当返回类型属性是resultType时,mybatis默认结果封装成Map,一般默认resultType为Map集合中的key值,将返回结果作为value进行映射返回。当数据库返回结果和实体类中属性名一一对应时,可自动完成映射功能

当返回类型是resultMap时,Map进行更为复杂的转化,建议养成使用习惯。当数据库返回结果和实体类中属性名不对应时resultType可以使用resultMap自定义映射关系。

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/353763.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号