mybatis中,collection配置后查询只显示一条记录

描述一下问题:
已知有两个表,一个是user表,一个是address,一(user)对多(address)的关系,在user的实体类里面写属性:

private List<Address> addressList = new ArrayList<Address>();
	
	public List<Address> getAddressList() {
		return addressList;
	}
	public void setAddressList(List<Address> addressList) {
		this.addressList = addressList;
	}

然后写了一个测试方法,根据用户的编号查询地址信息,一个用户对应多个地址。
配置如下:

<resultMap type="User" id="userAddMap">
	<id property="id" column="id"/>
		<result property="userName" column="userName"/>
		<result property="userCode" column="userCode"/>
		<result property="userPassword" column="userPassword"/>
		<result property="gender" column="gender"/>
		<result property="birthday" column="birthday"/>
		<result property="phone" column="phone"/>
		<result property="address" column="address"/>
		<result property="userRole" column="userRole"/>
		<result property="createdBy" column="createdBy"/>
		<result property="creationDate" column="creationDate"/>
		<result property="modifyBy" column="modifyBy"/>
		<result property="modifyDate" column="modifyDate"/>
		<result property="roleName" column="roleName"/>
		<collection property="addressList" ofType="Address">
			<id property="aid" column="id"/>
			<result property="contact" column="contact"/>
			<result property="addressDesc" column="addressDesc"/>
			<result property="postCode" column="postCode"/>
			<result property="tel" column="tel"/>
			<result property="createdBy" column="createdBy"/>
			<result property="creationDate" column="creationDate"/>
			<result property="modifyBy" column="modifyBy"/>
			<result property="modifyDate" column="modifyDate"/>
			<result property="userId" column="userId"/>
		</collection>
	</resultMap>

sql映射如下:

<select id="findUserByidAndAddress" parameterType="Integer" resultMap="userAddMap">
		
SELECT u.*,a.id,a.contact,a.addressdesc,a.postCode
		FROM smbms_user u,smbms_address a 
		WHERE u.id = a.userid AND  u.id = #{id} 
  </select>

看起来没有任何问题吧,写了个测试方法:

@Test
	public void findUserByidAndAddress(){
		SqlSession sqlSession = utils.getSqlSession();
		User user = sqlSession.getMapper(IUserDao.class).findUserByidAndAddress(1);
		List<Address> addressList = user.getAddressList();
		for (Address address : addressList) {
			System.out.println(address.getAddressDesc());
		}
	}

运行结果如图所示:
在这里插入图片描述
可是数据库中却有三条记录:
在这里插入图片描述
经过自己琢磨,不行。
然后上网查了下,原来是数据库中两个表中的主键都是id,如果配置collection一对多关联的话需要改别名,我就试着改了下,发现,可以了。
改过之后的映射文件如下:

<resultMap type="User" id="userAddMap">
	<id property="id" column="id"/>
		<result property="userName" column="userName"/>
		<result property="userCode" column="userCode"/>
		<result property="userPassword" column="userPassword"/>
		<result property="gender" column="gender"/>
		<result property="birthday" column="birthday"/>
		<result property="phone" column="phone"/>
		<result property="address" column="address"/>
		<result property="userRole" column="userRole"/>
		<result property="createdBy" column="createdBy"/>
		<result property="creationDate" column="creationDate"/>
		<result property="modifyBy" column="modifyBy"/>
		<result property="modifyDate" column="modifyDate"/>
		<result property="roleName" column="roleName"/>
		<collection property="addressList" ofType="Address">
			<id property="aid" column="aid"/>
			<result property="contact" column="contact"/>
			<result property="addressDesc" column="addressDesc"/>
			<result property="postCode" column="postCode"/>
			<result property="tel" column="tel"/>
			<result property="createdBy" column="createdBy"/>
			<result property="creationDate" column="creationDate"/>
			<result property="modifyBy" column="modifyBy"/>
			<result property="modifyDate" column="modifyDate"/>
			<result property="userId" column="userId"/>
		</collection>
	</resultMap>

sql语句如下:

 <select id="findUserByidAndAddress" parameterType="Integer" resultMap="userAddMap">
		
SELECT u.*,a.id as aid,a.contact,a.addressdesc,a.postCode
		FROM smbms_user u,smbms_address a 
		WHERE u.id = a.userid AND  u.id = #{id} 
  </select>

注意:resultMap中的property对应的是实体类里面的属性,而column严格意义上来说对应的是结果集里面的列名,而不是数据库中的列,比如起别名的话就对应的是别名,不是原来的列,切记切记!!!
欢迎关注:雄雄的小课堂

  • 3
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论
MyBatis,可以使用批量插入语句将多条记录同时插入数据库。具体来说,可以使用foreach标签来遍历一个列表,并在循环执行插入操作。下面是一个示例代码片段,展示了如何在MyBatis使用foreach实现批量插入: <<引用:注解插入 @Insert({ "<script>", "insert into task_info(id,info) values ", "<foreach collection='recordList' item='item' index='index' separator=','>", "(#{item.id}, #{item.info})", "</foreach>", "</script>" }) int insertList(@Param("recordList") List<TaskInfo> recordList); Oracle 批量 。 引用:总感觉自己做过批量插入,又好像没有,刻意看一下,我一次插入了1W条数据,结合自己的MYSQL版本最大插入来做,记得做好字段阈值 MYSQL 批量 。 引用:XML插入 <insert id="insertAll" parameterType="java.util.List"> insert into big_temp_data (`time`, region, `type`, current_period_data, cumulative_data, indicator_type, time_attribute, `indicator`,period_last_year,period_last,year_on_year,code ) values <foreach collection="list" item="item" index="index" separator=","> ( #{item.time,jdbcType=VARCHAR}, #{item.region,jdbcType=VARCHAR}, #{item.type,jdbcType=VARCHAR}, #{item.currentPeriodData,jdbcType=VARCHAR}, #{item.cumulativeData,jdbcType=VARCHAR}, #{item.indicatorType,jdbcType=VARCHAR}, #{item.timeAttribute,jdbcType=VARCHAR}, #{item.indicator,jdbcType=VARCHAR}, #{item.periodLastYear,jdbcType=VARCHAR},#{item.periodLast,jdbcType=VARCHAR},#{item.yearOnYear,jdbcType=VARCHAR}, #{item.code ,jdbcType=VARCHAR} ) </foreach> </insert> >> 在注解方式,可以使用@Insert注解,结合<foreach>标签来实现。示例代码的insertList方法接收一个名为recordList的参数,该参数是一个List<TaskInfo>类型的对象。在SQL语句使用<foreach>标签将recordList的每个元素插入到数据。 在XML配置文件,可以使用<insert>标签,并在其使用<foreach>标签来实现批量插入。示例代码的insertAll语句接收一个名为list的参数,该参数是一个java.util.List类型的对象。在<foreach>标签,通过#{item.xxx}来引用list的属性,并使用separator属性指定每条记录之间的分隔符。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

穆雄雄

哎,貌似还没开张来着呢~

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值