导语:在学习MyBatis的过程中,有一些需要做连接查询的地方,便需要创建resultMap,在其中写
association等标签来进行一对多或多对一的关系引用,容易遇到一些很普遍的问题,就是所获取的实体类属性全部获取到了值,但是有特殊关系的集合无值的情况,本文所述内容就是解决这种问题的普遍解决思路。
首先先上一张图片 给大家更加轻易的理解我说的问题,如下图
先说一下排除这种异常的过程中可能会出现的情况
- debug过程中 后台已经可以正常获取数据了,但是前台没有正常显示
- debug过程中 显示该实体类正常获取到直接属性的值,有引用关系的属性无值。
- debug过程中 显示该实体类为null,或全部属性都没有值。
接下来说一下关于这几种情况的大体解决思路。
第一种情况,比较好解决,后台数据全部正确,前台无法正常显示,需要看对应显示数据是否正确,例如使用SpringMVC model存值,前台需要使用${model的Key}来取值,如果使用的EL表达式不正确,则会出现第一种情况。
第二种情况:出现这种情况,按照以下三步解决
- 首先检查Mybatis的Mapper映射文件是否存在对应的复合映射关系,使用association或collection标签进行复合关系绑定,代码举例
<resultMap id="该resultMap的id" type="实体类全路径或别名">
/*这里有个小的细节,使用ID标识主键,否则容易导致无法绑定问题*/
<id property="faq_id" column="faq_id"/>
<association property="classes" javaType="cn.faq.pojo.Classes">
<id property="class_id" column="class_id"/>
<result property="class_name" column="class_name"/>
</association>
</resultMap>
- 检查对应的标签中是否声明结果映射的ID,这个ID指向上面映射关系标签中的id属性
<select id="Mapper接口方法名字" resultMap="这个ID指向上面resultMap中的id属性">
要执行的SQL语句
</select>
- 复合映射关系存在,并且进行了对应的方法resultMap绑定,如果还是无数据,则考虑是否名字冲突,比如连接查询的双表 都存在id这一列,Mybatis则不知道要把这一列绑定给哪个属性,需要手动标识别名,进行绑定。
第三种情况:如果实体对象 全部属性都为空,则代表查询没有查到值,检查SQL语句是否有误,复制SQL语句到对应数据库查询,并且看是否存在数据,若存在数据,则按照第二种情况的三个步骤解决,若不存在数据,新增数据或修改SQL语句。
这里复制SQL语句,指的不是复制自己写的那条 而是复制日志中执行的SQL,因为有可能因为自己粗心调用错误会出现写的SQL和执行的SQL不符的情况。
附带 记录一下SSM过程中所需要的几个容易导致的错误
-
Spring配置文件中,配置自动扫描Dao层以及Service层,目的是为了让@Service注解生效
<context:component-scan base-package="Service所在的包名"/>
-
在spring中注册MapperScannerConfigurer,并且注入mapper接口所在的包名
<bean class="org.mybatis.spring.mapper.MapperScannerConfigurer"> <property name="basePackage" value="Mapper接口所在的包名"/> </bean>
-
Mybatis配置文件中设置自动映射级别为FULL,目的是为了简便绑定过程,符合规则的自动绑定
<settings> <setting name="autoMappingBehavior" value="FULL"/> </settings>
-
对包进行扫描,实现注解驱动Bean的定义,同时将Bean自动注入容器中使用,
让标注了@Controller的Bean成为一个可以处理请求的控制器<context:component-scan base-package="controller层所对应的包全路径"/>
-
创建Mapper映射文件 namespace指向对应Mapper接口全路径
Service层实现类 上面必须要添加@Service注解
Controller层类 必须添加@Controller注解
要注入的属性上 添加@Resource注解
总结:本文为纯原创文章,如有任何错误问题,请联系作者进行更正,感谢各位大佬!