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

简介: 1

描述一下问题:

已知有两个表,一个是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严格意义上来说对应的是结果集里面的列名,而不是数据库中的列,比如起别名的话就对应的是别名,不是原来的列,切记切记!!!

欢迎关注:雄雄的小课堂

相关文章
|
2月前
|
XML Java 数据库连接
MyBatis的常见配置
MyBatis 常见配置包括数据库连接、类型别名、映射器等核心模块,合理配置可提升开发效率与系统性能。主要内容涵盖核心配置文件结构、关键配置项详解及配置优先级说明。
308 4
|
3月前
|
SQL XML Java
通过MyBatis的XML配置实现灵活的动态SQL查询
总结而言,通过MyBatis的XML配置实现灵活的动态SQL查询,可以让开发者以声明式的方式构建SQL语句,既保证了SQL操作的灵活性,又简化了代码的复杂度。这种方式可以显著提高数据库操作的效率和代码的可维护性。
258 18
|
8月前
|
Oracle 关系型数据库 Java
【YashanDB知识库】Mybatis-Plus适配崖山配置
【YashanDB知识库】Mybatis-Plus适配崖山配置
|
4月前
|
SQL XML Java
MyBatis Mapper中使用limit参数的查询问题
总结而言,MyBatis中使用 `limit`参数的查询可以高度定制并且灵活,基于方法签名和XML映射文件的组合来达成多样化的查询需求。通过参数化查询和动态SQL,MyBatis可以有效地处理各种复杂情境下的数据库操作,并且将SQL语句的维护与业务代码的编写相分离,提升代码的可维护性和可阅读性。
435 13
|
8月前
|
Java 数据库连接 微服务
微服务——MyBatis配置——事务管理
本段内容主要介绍了事务管理的两种类型:JDBC 和 MANAGED。JDBC 类型直接利用数据源连接管理事务,依赖提交和回滚机制;而 MANAGED 类型则由容器全程管理事务生命周期,例如 JEE 应用服务器上下文,默认会关闭连接,但可根据需要设置 `closeConnection` 属性为 false 阻止关闭行为。此外,提到在使用 Spring + MyBatis 时,无需额外配置事务管理器,因为 Spring 模块自带的功能可覆盖上述配置,且这两种事务管理器类型均无需设置属性。
132 0
|
8月前
|
Java 数据库连接 数据库
微服务——MyBatis配置——多环境配置
在 MyBatis 中,多环境配置允许为不同数据库创建多个 SqlSessionFactory。通过传递环境参数给 SqlSessionFactoryBuilder,可指定使用哪种环境;若忽略,则加载默认环境。`environments` 元素定义环境配置,包括默认环境 ID、事务管理器和数据源类型等。每个环境需唯一标识,确保默认环境匹配其中之一。代码示例展示了如何构建工厂及配置 XML 结构。
138 0
|
8月前
|
缓存 Java 数据库连接
微服务——MyBatis配置——常见配置
本文介绍了 MyBatis 的常见配置及其加载顺序。属性配置优先级为:方法参数传递的属性 &gt; resource/url 属性中配置 &gt; properties 元素中指定属性。同时列举了多个关键配置项,如 `cacheEnabled`(全局缓存开关)、`lazyLoadingEnabled`(延迟加载)、`useGeneratedKeys`(使用 JDBC 自动生成主键)等,并详细说明其作用、有效值及默认值。这些配置帮助开发者优化 MyBatis 的性能与行为。
136 0
|
5月前
|
SQL Java 数据库
解决Java Spring Boot应用中MyBatis-Plus查询问题的策略。
保持技能更新是侦探的重要素质。定期回顾最佳实践和新技术。比如,定期查看MyBatis-Plus的更新和社区的最佳做法,这样才能不断提升查询效率和性能。
222 1
|
8月前
|
Java 数据库连接 数据库
微服务——SpringBoot使用归纳——Spring Boot集成MyBatis——MyBatis 介绍和配置
本文介绍了Spring Boot集成MyBatis的方法,重点讲解基于注解的方式。首先简述MyBatis作为持久层框架的特点,接着说明集成时的依赖导入,包括`mybatis-spring-boot-starter`和MySQL连接器。随后详细展示了`properties.yml`配置文件的内容,涵盖数据库连接、驼峰命名规范及Mapper文件路径等关键设置,帮助开发者快速上手Spring Boot与MyBatis的整合开发。
1074 0
|
8月前
|
缓存 Java 数据库连接
MyBatis篇-常见配置
本文介绍了 MyBatis 的常见配置及事务管理相关内容。首先概述了 MyBatis 属性加载顺序,方法参数属性优先级最高。接着列举了几个常见配置属性,如 cacheEnabled、lazyLoadingEnabled 等,并说明其作用与默认值。在多环境配置部分,讲解如何通过 SqlSessionFactoryBuilder 指定环境,以及 environments 元素的配置细节。最后讨论了两种事务管理模式:JDBC 和 MANAGED,分别适用于不同场景,并指出在使用 Spring 模块时无需额外配置事务管理器。