`

mybatis类型检测的不足

 
阅读更多

首先看两段配置:

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类型。。

 

我们最好的避免方法就是,在进行一对多映射时,要留意相关查询方法的参数类型。。一旦不一致,问题就很难定位了。。。

 

大家有什么意见,欢迎提出哈。。

 

 

 

 

 

1
1
分享到:
评论

相关推荐

    mybatis generator生成器

    3. 防止表结构更新时代码失效:MBG可以检测表结构的变化,并根据变化更新生成的代码。 4. 支持多数据源:在一个配置文件中,可以定义多个`context`,分别处理不同的数据库。 5. 注释生成:MBG可以在生成的代码中添加...

    mybatis-guice-3.6.zip

    3. **类型安全**:使用Guice的依赖注入,可以在编译时检测依赖关系,避免运行时因找不到依赖而引发的错误。 4. **简洁的API**:MyBatis-Guice提供了简洁的API,使得开发者可以专注于业务逻辑,而不是数据库操作的...

    elasticsearch+Mybatis+Aop

    AOP可以自动检测到这些返回,并在适当的时候执行转换逻辑,无需在每个查询方法中手动处理。 **整合过程**: 1. **配置Elasticsearch连接**:在项目中,首先需要配置Elasticsearch的连接信息,包括节点地址、端口等...

    mybatis_tool.rar

    1. 数据库元数据获取:工具会自动连接到数据库,读取表结构信息,如表名、字段名、数据类型等,作为生成代码的基础。 2. 自定义模板支持:用户可以预设或自定义模板,定义生成的代码结构和格式。 3. CRUD操作自动化...

    MyBatis和IBatis配置文件中的自动补全功能

    2. **配置插件**:对于MyBatis,可以安装如`MyBatis Code Support`这样的插件,它可以增强IDE对MyBatis的支持,包括自动补全、语法高亮和错误检测。 3. **正确配置项目**:确保MyBatis的jar包已经被引入到项目的类...

    mybatis代码快速生成工具

    工具自动检测并列出数据库中的所有表,这样开发者可以选择需要生成代码的表,极大地提高了工作效率。 一旦选择了要操作的表,该工具将自动分析表结构,包括字段名、字段类型、主键等信息。基于这些信息,工具会自动...

    Spring+Mybatis+Druid示例整合Demo2

    Mybatis的核心配置文件`mybatis-config.xml`用于配置全局属性,如类型别名、Mapper文件位置等。 ```xml ``` **4. 创建Mapper接口和XML文件** 创建Mapper接口,如`UserMapper.java`,并编写对应的XML...

    mybatis第一阶段

    - **结果映射**:MyBatis支持自动将查询结果映射为Java对象,简化了类型转换的过程。 #### 四、MyBatis架构与入门程序 - **架构概览**:MyBatis的核心组件包括SqlSessionFactory、SqlSession、Mapper接口等。 - **...

    springBootMybatis.zip

    例如,当检测到Mybatis的相关依赖时,Spring Boot会自动配置Mybatis的SqlSessionFactory和MapperScannerConfigurer。 以上就是SpringBootMybatis.zip项目中涉及的关键技术点,通过理解和掌握这些知识点,你可以更好...

    mybatis-spring中文配置

    2. **容器管理事务**:MyBatis-Spring能够自动检测并使用Spring容器中已经配置好的事务管理器。 #### 五、使用SqlSession **SqlSessionSupport**与**SqlSessionTemplate**是MyBatis-Spring提供的两种用于执行SQL...

    Spring+SpringMVC+MyBatis返回json所需jar包

    - `jackson-databind`:提供对基本Java类型和Java Bean的JSON绑定。 - `jackson-core`:包含JSON解析和生成的基础API。 Maven示例: ```xml &lt;groupId&gt;com.fasterxml.jackson.core&lt;/groupId&gt; &lt;artifactId&gt;...

    mybatis插件

    这样,IDE会自动检测到新添加的插件,并将其加载到环境中。 4. **验证安装**:启动后,你可以通过查看Eclipse或MyEclipse的“窗口” -&gt; “首选项” -&gt; “MyBatis Generator”来确认插件是否成功安装。如果能在首选...

    mybatis相关面试问题.docx

    - 实现原理是使用CGLIB生成目标对象的代理,当尝试访问延迟加载的属性时,代理对象会检测到当前属性为空,然后执行预先保存的查询SQL,获取关联数据,再将结果设置到对象中。 总之,MyBatis提供了一种灵活的方式来...

    springboot + mybatis + atomikos 多数据源分布式事物管理

    这通常包括指定数据源类型、连接池大小、事务超时时间等。同时,还需要在 Spring Boot 的配置文件(application.properties 或 YAML)中声明 Atomikos 的相关属性。 接下来,为了使 MyBatis 与 Atomikos 集成,我们...

    SpringBoot整合Mybatis笔记

    - **@ExceptionHandler**:用于处理特定类型的异常。 #### 配置多环境 SpringBoot支持多环境配置,可以通过`spring.profiles.active`属性指定当前激活的环境配置文件。比如,在`application.properties`文件中配置...

    03 mybatis高级(1)3

    Mybatis会自动检测这些日志框架的可用性,并按照优先级选择其中一个进行日志记录。这样做的好处是解耦了Mybatis与具体日志实现的依赖,同时也确保了日志记录的优雅集成。 **工厂模式**: 在Mybatis中,工厂模式主要...

    Mybatis自动创建表和更新表结构

    前者会在启动时删除所有表并重建,后者则会检测并更新已有表结构,而不破坏原有数据。 - `mybatis.model.pack`: 指定用于创建表的对象所在的包名。 4. **运行模式**: - `create` 模式:系统启动后,所有表会被...

    Spring + Spring Boot + MyBatis + MongoDB的整合教程

    配置MyBatis的类型别名包,这样MyBatis就能识别实体类。另外,指定Mapper XML文件的位置,这些文件包含SQL查询语句。 6. **创建Mapper接口**: 创建与每个实体类对应的Mapper接口,接口中定义了数据库操作的方法...

    基于springboot+mybatis+security+maven社区疫情防控管理系统

    基于springboot+mybatis+security+maven社区疫情防控管理系统 主要功能如下: 防疫管理模: 疫苗接种情况:是否接种第一针,第一针厂家,第一针接种时间,是否接种第二针,第二针厂家,第二针接种时间,姓名,备注...

    mybatis插件-eclispe插件-xml插件【正式版下载】

    3. **错误检测**:能够检测到`mapper.xml`文件中的常见错误,如未定义的参数类型、不匹配的方法签名等,并提供快速修复建议。 4. **代码提示**:除了自动补全外,还提供了代码片段的插入功能,例如常见的SQL查询语句...

Global site tag (gtag.js) - Google Analytics