昨天做项目的时候遇到了一对多的关系的应用,因为现在自己正在学习ssm框架的使用,在处理数据库的关系时遇到了一些问题,后来废了很大的功夫终于解决了问题。本来不想写这篇博客的,因为写的话又得重新去模拟出现的问题,不过为了不让跟我一样自学的小白再入坑,还是决定写下这篇博客,前事之师,后车之鉴。
废话不多说我这个项目中主要是一个主版块下面有很多子版块,就类似于java技术开发,和.net技术开发俩大版块下面里面又有很多子分类。
main_forum表
sub_forum表
记得在sub_forum中建立外键main_forum怎么建立我就不说了。
注意这里有个问题就是以后查询的时候出现问题的根本原因我直接说了就是id,title,info这三个字段的名称相同,至于为什么带着这个疑问看下去
mian_forum类
private Integer id;
private String title;
private String info;
private List<SubForum>subforumList;//存储子论坛信息的集合
----------------setter,getter方法省略------------
sub_forum类
private Integer id;
private String subTitle;
private String subInfo;
---------------setter,getter方法省略------------
MainForumMapper.xml
<!--nameSpace对应的接口的类 -->
<mapper namespace="com.bbs.mapper.MainForumMapper">
<!--这里的id是返回类型 com.bbs.beans.MainForum的别名-->
<resultMap type="com.bbs.beans.MainForum" id="resultMainForumMap">
<!-- property是javaBean里面的属性 column对应数据库的字段 -->
<id column="id" jdbcType="INTEGER" property="id" />
<result property="title" column="title"/>
<result property="info" column="info"/>
<!-- ofType:返回的数据类型 -->
<collection property="subforumList" ofType="com.bbs.beans.SubForum">
<!-- 这里的id标签和上面的id标签都是主键的标志 -->
<id property="id" column="id"/>
<result property="title" column="title"/>
<result property="Info" column="info"/>
</collection>
</resultMap>
<!--resultMainForumMap: com.bbs.beans.MainForum的别名 -->
<select id="findMainForum" resultMap="resultMainForumMap">
select *from main_forum m,sub_forum s where m.id=s.main_forum
</select>
</mapper>
一对多的关系映射完毕没毛病
看一下数据库中添加的数据
main_forum
sub_forum
Controller代码
public String mainforum(Model model){
List<MainForum>mainForumList=mainForumService.findMainForum();
model.addAttribute("mainForumList",mainForumList);
return "index";
jsp代码
<div class="container">
<div class="row">
<c:forEach items="${mainForumList}" var="obj">
<div class="col-md-3 col-sm-12">
<a href="#">
<div class="main-forum">
<h3>${obj.title}</h3>
<c:forEach items="${obj.subforumList}" var="subobj">
${subobj.subTitle}
</c:forEach>
</div>
</a>
</div>
</c:forEach>
</div>
</div>
显示结果
由于图片无法显示我画一下大概的样子
java 技术 java技术 |
web开发 web开发 |
去查看一下数据库发现java技术对应的标题应该是javaSE和javaMe web开发对应的应该是Jsp和php
然而这里显示的却是main_forum里面t的title,按照理由来说main_forum类里面的集合list的数据应该是sub_forum表里面的数据,然而却出现了另人匪夷所思的状况
ResultMap接收的结果集信息,当前的返回的结果集信息也就是上面通过sql语句在数据库查询出来的图上所示的信息。ResultMap会从返回的结果集逐条读取记录(每一行数据),当前获取第一行数据:
<resultMap type="com.bbs.beans.MainForum" id="resultMainForumMap"> ,发现这是一个MainForum对象,就new一个MainForum对象,然后再将结果集中的字段值id与column属性值逐一匹配,<id property="id"column="id" />匹配,就通过Customer的set方法将id的值设置进id属性;然后对结果集这一列的匹配并没有结束,ResultMap会继续拿着这个id字段向下匹配,下面一个配置是<result property="title" column="info" />,不匹配,则不做任何动作;继续向下匹配,发现<collection property="subForumList" ofType="com.bbs.SubForum">建立了一对多关系,实体是subForum,于是就建立了一个subForum对象,然后继续拿着id字段向下匹配,接着发现在subForum中也有id,<id property="id"column="id" />匹配了,再用subForumr的serId方法将id字段的值设置进去,所以现在List集合中的一个subForum id的值就是mainFourm id的值。继续拿着id向下匹配,<resultproperty="name" column="name" />,不匹配,且配置结束,则结束这个id字段的配置
总而言之呢就是如果你的集合的id字段的名称和第一次出现的id字段名称相同它就会将同样的值赋给你所以就出现了上面的现象重复
还没有结束还有一个问题就算重复 我数据库有俩条数据应该重复俩次啊,为什么只会重复一次呢?
进行下一个结果集字段的匹配,下一个也是id,同样进入配置文件逐一匹配,需要注意的是,如果之前有一个与当前字段id相同的字段,在同一条记录中对同一个对象做了set操作,那么当前这个id字段将不会再对当前对象做set操作。
也就是说当它在第一次赋值时遇到俩个俩个id值相同,那么下一次另一行数据的id看到了就不会再赋值了,就好比一个女的看见一个男的一下子有俩个女友,她就不会再凑热闹了
说了这么多 根本原因就是集合的字段的名称和上面的字段名称重复了 所以我们再做mybatis的数据查询操作时一定要保证属性和字段名称都不要相同。
<mapper namespace="com.bbs.mapper.MainForumMapper">
<!--这里的id是返回类型 com.bbs.beans.MainForum的别名-->
<resultMap type="com.bbs.beans.MainForum" id="resultMainForumMap">
<!-- property是javaBean里面的属性 column对应数据库的字段 -->
<id column="id" jdbcType="INTEGER" property="id" />
<result property="title" column="title"/>
<result property="info" column="info"/>
<!-- ofType:返回的数据类型 -->
<collection property="subforumList" ofType="com.bbs.beans.SubForum">
<!-- 这里的id标签和上面的id标签都是主键的标志 -->
<id property="sid" column="sid"/>
<result property="subTitle" column="sub_title"/>
<result property="subInfo" column="sub_info"/>
</collection>
</resultMap>
<!--resultMainForumMap: com.bbs.beans.MainForum的别名 -->
<select id="findMainForum" resultMap="resultMainForumMap">
select *from main_forum m,sub_forum s where m.id=s.main_forum
</select>
</mapper>
正确结果
java 技术 javaSe javaME |
web开发 jsp php |