解决方案:MyBatis中一对多,多对一关系取不到值的几种情况以及SSM整合常见的一些问题

导语:在学习MyBatis的过程中,有一些需要做连接查询的地方,便需要创建resultMap,在其中写
association等标签来进行一对多或多对一的关系引用,容易遇到一些很普遍的问题,就是所获取的实体类属性全部获取到了值,但是有特殊关系的集合无值的情况,本文所述内容就是解决这种问题的普遍解决思路。

首先先上一张图片 给大家更加轻易的理解我说的问题,如下图
在这里插入图片描述

先说一下排除这种异常的过程中可能会出现的情况

  1. debug过程中 后台已经可以正常获取数据了,但是前台没有正常显示
  2. debug过程中 显示该实体类正常获取到直接属性的值,有引用关系的属性无值。
  3. debug过程中 显示该实体类为null,或全部属性都没有值。

接下来说一下关于这几种情况的大体解决思路。
第一种情况,比较好解决,后台数据全部正确,前台无法正常显示,需要看对应显示数据是否正确,例如使用SpringMVC model存值,前台需要使用${model的Key}来取值,如果使用的EL表达式不正确,则会出现第一种情况。

第二种情况:出现这种情况,按照以下三步解决

  1. 首先检查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>
  1. 检查对应的标签中是否声明结果映射的ID,这个ID指向上面映射关系标签中的id属性
 <select id="Mapper接口方法名字" resultMap="这个ID指向上面resultMap中的id属性">
       要执行的SQL语句
 </select>
  1. 复合映射关系存在,并且进行了对应的方法resultMap绑定,如果还是无数据,则考虑是否名字冲突,比如连接查询的双表 都存在id这一列,Mybatis则不知道要把这一列绑定给哪个属性,需要手动标识别名,进行绑定。

第三种情况:如果实体对象 全部属性都为空,则代表查询没有查到值,检查SQL语句是否有误,复制SQL语句到对应数据库查询,并且看是否存在数据,若存在数据,则按照第二种情况的三个步骤解决,若不存在数据,新增数据或修改SQL语句。
这里复制SQL语句,指的不是复制自己写的那条 而是复制日志中执行的SQL,因为有可能因为自己粗心调用错误会出现写的SQL和执行的SQL不符的情况。

附带 记录一下SSM过程中所需要的几个容易导致的错误

  1. Spring配置文件中,配置自动扫描Dao层以及Service层,目的是为了让@Service注解生效

    <context:component-scan base-package="Service所在的包名"/>
    
  2. 在spring中注册MapperScannerConfigurer,并且注入mapper接口所在的包名

    <bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
        <property name="basePackage" value="Mapper接口所在的包名"/>
    </bean> 
    
  3. Mybatis配置文件中设置自动映射级别为FULL,目的是为了简便绑定过程,符合规则的自动绑定

    <settings>
        <setting name="autoMappingBehavior" value="FULL"/>
    </settings>
    
  4. 对包进行扫描,实现注解驱动Bean的定义,同时将Bean自动注入容器中使用,
    让标注了@Controller的Bean成为一个可以处理请求的控制器

    <context:component-scan base-package="controller层所对应的包全路径"/>
    
  5. 创建Mapper映射文件 namespace指向对应Mapper接口全路径
    Service层实现类 上面必须要添加@Service注解
    Controller层类 必须添加@Controller注解
    要注入的属性上 添加@Resource注解

总结:本文为纯原创文章,如有任何错误问题,请联系作者进行更正,感谢各位大佬!

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值