mybatis resultMap 中的association标签,没有设置javaType会报错。

本文详细解析了在MyBatis中遇到的NullPointer异常原因,特别是<association>和<collection>标签未正确设置javaType导致的问题。通过实例展示了如何在XML映射文件中设置正确的javaType和ofType属性,避免此类错误。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

< resultMap > 中的< association >标签 没有设置 javaType 

org.apache.ibatis.exceptions.PersistenceException: 
### Error querying database.  Cause: org.apache.ibatis.reflection.ReflectionException: Error instantiating null with invalid types () or values (). Cause: java.lang.NullPointerException
### The error may exist in com/heima/dydao/DyOrderDao.xml
### The error may involve defaultParameterMap
### The error occurred while setting parameters
### SQL: select   o.id,o.user_id,o.ordernum,o.createtime,o.note,u.username,u.address from   morders o   left join users u on o.user_id=u.id
.

.

.
Caused by: java.lang.NullPointerException
    at org.apache.ibatis.reflection.factory.DefaultObjectFactory.instantiateClass(DefaultObjectFactory.java:60)
    ... 49 more

 解决方式,就是设置 javaType

 

collection标签:javaType 为一对多关联中的关系,如在用户用存在一个List<Order>,这样此处的javaType应为list,ofType指定泛型类型。

<collection property="orders" javaType="list" ofType="order">

<think>好的,我现在需要帮助用户了解MyBatisResultMap的映射规则和使用方法。首先,我得回忆一下MyBatis的相关知识,特别是ResultMap的部分。根据用户提供的引用内容,特别是引用1到4,里面提到了复合映射、ResultMap的配置问题、常见误以及注解的使用。 用户的问题集中在ResultMap的映射规则和用法,我需要先整理ResultMap的基本结构。ResultMap主要用于将数据库查询结果映射到Java对象,尤其是在字段名和属性名不一致,或者存在复杂类型(如嵌套对象、集合)时。根据引用1,复合映射可以处理多参数的情况,而引用3提到了一些常见的映射误,比如字段名不对应、未正确使用resultMap等。 接下来,我需要分步骤解释ResultMap的使用。首先是基本字段映射,当数据库字段和Java属性名不一致时,需要用<result>标签进行映射。例如,数据库字段user_name对应Java属性userName。引用4中提到了使用@TableId注解,这可能与主键映射相关,但MyBatis本身通常使用XML配置,而注解可能在其他框架如MyBatis-Plus中使用,需要区分清楚。 然后是主键映射,使用<id>标签,确保对象标识的正确性。如果存在联合主键,可能需要指定多个<id>元素,或者使用复合主键类。引用3中的误案例指出,有时候字段别名的问题会导致映射失败,因此需要注意column属性的正确性。 接下来是处理关联关系,比如一对一使用<association>,一对多使用<collection>。引用1中的复合映射可能涉及到这些关联映射,需要举例说明如何嵌套查询或结果映射。例如,订单对象关联用户对象,可以通过association配置用户信息。 自动映射也是一个重点,MyBatis默认开启autoMappingBehavior,可以自动映射同名属性。但如果存在不一致,需要手动配置。引用3中的用户遇到的问题可能是因为自动映射失效,或者手动映射配置误,比如column用了带表名的字段,导致无法匹配,解决方案是使用别名。 然后需要提到常见问题,如字段别名不一致、未正确使用resultMap而用了resultType、数据库字段与属性名格式差异(比如下划线转驼峰)。引用3中的案例显示用户可能误地在column中使用了库名.表名.字段名,导致映射失败,改用别名后解决。此外,MyBatis的映射配置需要严格对应,避免遗漏。 最后,结合引用中的示例,可能需要给出代码示例,比如如何配置一个包含基本字段、主键、关联对象的ResultMap。同时,强调在XML中正确引用resultMap,而不是resultType,并检查字段别名是否正确。 总结下来,回答的结构应该是:基本规则、主键处理、关联映射、自动映射机制、常见问题及解决方案。同时,引用相关的引用内容来支持各个点,比如引用3的问题作为常见误案例,引用1的复合映射作为关联关系的例子。需要确保回答清晰,步骤分明,帮助用户逐步理解和应用ResultMap。</think>### MyBatis ResultMap 映射规则及使用方法 #### 1. **基本映射规则** - **字段与属性映射**:通过`<result>`标签将数据库列(`column`)与Java对象属性(`property`)绑定。例如: ```xml <result column="user_name" property="userName" /> ``` 若字段名与属性名遵循**下划线转驼峰规则**(如`user_name` → `userName`),可开启全局自动映射: ```xml <settings> <setting name="mapUnderscoreToCamelCase" value="true"/> </settings> ``` - **主键映射**:使用`<id>`标签声明主键,提升性能并确保对象唯一性: ```xml <id column="id" property="id" /> ``` #### 2. **复杂类型映射** - **关联对象(一对一)**:通过`<association>`映射嵌套对象。例如订单关联用户: ```xml <association property="user" javaType="User"> <id column="user_id" property="id"/> <result column="user_name" property="name"/> </association> ``` - **集合(一对多)**:使用`<collection>`处理集合属性。例如用户拥有多个订单: ```xml <collection property="orders" ofType="Order"> <id column="order_id" property="id"/> <result column="order_amount" property="amount"/> </collection> ``` #### 3. **复合映射(多参数嵌套查询)** 当嵌套查询需要**多个参数**时,使用`column="{key1=col1, key2=col2}"`格式传递: ```xml <association property="dept" select="selectDepartment" column="{id=dept_id, name=dept_name}"/> ``` 对应的嵌套查询方法: ```java Department selectDepartment(@Param("id") Long id, @Param("name") String name); ``` #### 4. **自动映射与手动映射结合** - **自动映射**:默认行为(`autoMappingBehavior=PARTIAL`)会尝试自动映射非嵌套字段。 - **手动覆盖**:手动定义`<result>`会覆盖自动映射结果。 #### 5. **常见问题与解决** - **字段别名问题**:若SQL中使用`表名.字段名`(如`user.id`),需在ResultMap中通过别名简化: ```sql SELECT u.id AS uid, u.name AS uname FROM user u ``` ```xml <result column="uid" property="id"/> <result column="uname" property="name"/> ``` - **未正确引用ResultMap**:确保SQL标签中指定`resultMap`而非`resultType`: ```xml <select id="selectUser" resultMap="userResultMap"> SELECT * FROM user </select> ``` - **字段类型不匹配**:通过`jdbcType`和`typeHandler`显式指定类型转换(如日期格式)。 #### 6. **示例:完整ResultMap配置** ```xml <resultMap id="userResultMap" type="User"> <id column="id" property="id"/> <result column="user_name" property="userName"/> <association property="role" javaType="Role"> <id column="role_id" property="id"/> <result column="role_name" property="name"/> </association> <collection property="posts" ofType="Post"> <id column="post_id" property="id"/> <result column="post_title" property="title"/> </collection> </resultMap> ``` ### 引用说明 - 复合映射需通过`column`传递多参数[^1]。 - 字段别名误会导致映射失败(如使用`库名.表名.字段名`需改为别名)[^3]。 - 主键映射建议使用`@TableId`注解(需结合MyBatis-Plus)[^4]。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值