首先看两段配置:
User实例配置
<mapper namespace="com.zj.logistics.bean.User">
<resultMap type="user" id="userResultMap">
<id property="userid" column="userid" />
<result property="username" column="username" />
<result property="password" column="password" />
<result property="deleteflag" column="deleteflag" />
<collection property="ordersList" column="userid" javaType="ArrayList" ofType="Orders"
select="com.zj.logistics.bean.Orders.findOrdersByUserId" />
</resultMap>
<select id="findUserById" parameterType="String" resultMap="userResultMap">
SELECT * FROM user u WHERE u.deleteflag = 0 AND u.userid = #{userid}
</select>
</mapper>
Orders实例配置:
<mapper namespace="com.zj.logistics.bean.Orders">
<resultMap type="orders" id="ordersResultMap">
<id property="orderid" column="orderid" />
<result property="status" column="status" />
<result property="cdate" column="cdate" />
<result property="note" column="note" />
<result property="deleteflag" column="deleteflag" />
<association property="user" column="userid" javaType="User"
select="com.zj.logistics.bean.User.findUserById" />
</resultMap>
<select id="findOrdersByUserId" parameterType="int" resultMap="ordersResultMap">
SELECT * FROM orders o WHERE o.deleteflag = 0 AND o.userid = #{userid}
</select>
</mapper>
很显然,参数类型不匹配。。但是,在mybatis加载的时候,不会报出异常。。更有意思的还在后面
这样配置后,当我们做单元测试时,调用user.xml中的findUserById的方法时,传递进去的是String类型的id,但是查询的结果有两种:
1)字符串id 以数字开头时,若数据库中存在记录,可以轻松查找。。
2) 字符串id 以字母开头时,会报出
Invalid value for getInt() 的异常
而且,异常的定位是在user中,看了很多眼,paramtype是string类型。。让人很难确定问题的原因
最终发现了user和orders的依赖关系,将orders中的int改为String-->OK
个人猜测,原因有一下几点:
1)如下图:
<mapper namespace="com.zj.logistics.bean.User">
<resultMap type="user" id="userResultMap">
<id property="userid" column="userid" />
<result property="username" column="username" />
<result property="password" column="password" />
<result property="deleteflag" column="deleteflag" />
<!-- 这时在orders的findOrdersByUserId方法中,已经将userid作为参数传入,将其类型绑定为int,在findbyuserid时,userid貌似不检测类型 -->
<collection property="ordersList" column="userid" javaType="ArrayList" ofType="Orders"
select="com.zj.logistics.bean.Orders.findOrdersByUserId" />
</resultMap>
</mapper>
可以总结为,在orders的findOrdersByUserId 中,将userid绑定为了int,在user的findByUserId方法中设定的参数起不到预定效果,所以才有了以上的异常。。
反之,如果在orders的findOrdersByUserId 中将参数userid的类型设定为String,而在user中将findByUserId方法中设定的参数改为int,测试的结果是查询正常。。
所以,基本确定,在mybatis进行一对多映射时,已经将userid的类型进行了绑定,在后来通过userid对user进行查找时,虽然你设定了是String类型,但是,最后mybatis还是会认为userid是int类型。。
我们最好的避免方法就是,在进行一对多映射时,要留意相关查询方法的参数类型。。一旦不一致,问题就很难定位了。。。
大家有什么意见,欢迎提出哈。。
分享到:
相关推荐
3. 防止表结构更新时代码失效:MBG可以检测表结构的变化,并根据变化更新生成的代码。 4. 支持多数据源:在一个配置文件中,可以定义多个`context`,分别处理不同的数据库。 5. 注释生成:MBG可以在生成的代码中添加...
3. **类型安全**:使用Guice的依赖注入,可以在编译时检测依赖关系,避免运行时因找不到依赖而引发的错误。 4. **简洁的API**:MyBatis-Guice提供了简洁的API,使得开发者可以专注于业务逻辑,而不是数据库操作的...
AOP可以自动检测到这些返回,并在适当的时候执行转换逻辑,无需在每个查询方法中手动处理。 **整合过程**: 1. **配置Elasticsearch连接**:在项目中,首先需要配置Elasticsearch的连接信息,包括节点地址、端口等...
1. 数据库元数据获取:工具会自动连接到数据库,读取表结构信息,如表名、字段名、数据类型等,作为生成代码的基础。 2. 自定义模板支持:用户可以预设或自定义模板,定义生成的代码结构和格式。 3. CRUD操作自动化...
2. **配置插件**:对于MyBatis,可以安装如`MyBatis Code Support`这样的插件,它可以增强IDE对MyBatis的支持,包括自动补全、语法高亮和错误检测。 3. **正确配置项目**:确保MyBatis的jar包已经被引入到项目的类...
工具自动检测并列出数据库中的所有表,这样开发者可以选择需要生成代码的表,极大地提高了工作效率。 一旦选择了要操作的表,该工具将自动分析表结构,包括字段名、字段类型、主键等信息。基于这些信息,工具会自动...
Mybatis的核心配置文件`mybatis-config.xml`用于配置全局属性,如类型别名、Mapper文件位置等。 ```xml ``` **4. 创建Mapper接口和XML文件** 创建Mapper接口,如`UserMapper.java`,并编写对应的XML...
- **结果映射**:MyBatis支持自动将查询结果映射为Java对象,简化了类型转换的过程。 #### 四、MyBatis架构与入门程序 - **架构概览**:MyBatis的核心组件包括SqlSessionFactory、SqlSession、Mapper接口等。 - **...
例如,当检测到Mybatis的相关依赖时,Spring Boot会自动配置Mybatis的SqlSessionFactory和MapperScannerConfigurer。 以上就是SpringBootMybatis.zip项目中涉及的关键技术点,通过理解和掌握这些知识点,你可以更好...
2. **容器管理事务**:MyBatis-Spring能够自动检测并使用Spring容器中已经配置好的事务管理器。 #### 五、使用SqlSession **SqlSessionSupport**与**SqlSessionTemplate**是MyBatis-Spring提供的两种用于执行SQL...
- `jackson-databind`:提供对基本Java类型和Java Bean的JSON绑定。 - `jackson-core`:包含JSON解析和生成的基础API。 Maven示例: ```xml <groupId>com.fasterxml.jackson.core</groupId> <artifactId>...
这样,IDE会自动检测到新添加的插件,并将其加载到环境中。 4. **验证安装**:启动后,你可以通过查看Eclipse或MyEclipse的“窗口” -> “首选项” -> “MyBatis Generator”来确认插件是否成功安装。如果能在首选...
- 实现原理是使用CGLIB生成目标对象的代理,当尝试访问延迟加载的属性时,代理对象会检测到当前属性为空,然后执行预先保存的查询SQL,获取关联数据,再将结果设置到对象中。 总之,MyBatis提供了一种灵活的方式来...
这通常包括指定数据源类型、连接池大小、事务超时时间等。同时,还需要在 Spring Boot 的配置文件(application.properties 或 YAML)中声明 Atomikos 的相关属性。 接下来,为了使 MyBatis 与 Atomikos 集成,我们...
- **@ExceptionHandler**:用于处理特定类型的异常。 #### 配置多环境 SpringBoot支持多环境配置,可以通过`spring.profiles.active`属性指定当前激活的环境配置文件。比如,在`application.properties`文件中配置...
Mybatis会自动检测这些日志框架的可用性,并按照优先级选择其中一个进行日志记录。这样做的好处是解耦了Mybatis与具体日志实现的依赖,同时也确保了日志记录的优雅集成。 **工厂模式**: 在Mybatis中,工厂模式主要...
前者会在启动时删除所有表并重建,后者则会检测并更新已有表结构,而不破坏原有数据。 - `mybatis.model.pack`: 指定用于创建表的对象所在的包名。 4. **运行模式**: - `create` 模式:系统启动后,所有表会被...
配置MyBatis的类型别名包,这样MyBatis就能识别实体类。另外,指定Mapper XML文件的位置,这些文件包含SQL查询语句。 6. **创建Mapper接口**: 创建与每个实体类对应的Mapper接口,接口中定义了数据库操作的方法...
基于springboot+mybatis+security+maven社区疫情防控管理系统 主要功能如下: 防疫管理模: 疫苗接种情况:是否接种第一针,第一针厂家,第一针接种时间,是否接种第二针,第二针厂家,第二针接种时间,姓名,备注...
3. **错误检测**:能够检测到`mapper.xml`文件中的常见错误,如未定义的参数类型、不匹配的方法签名等,并提供快速修复建议。 4. **代码提示**:除了自动补全外,还提供了代码片段的插入功能,例如常见的SQL查询语句...