测试Mybatis工程遇到的问题
映射配置文件:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.itheima.dao.IUserDao">
<!--配置查询所有-->
<select id="findAll" resultMap="com.itheima.domain.User">
SELECT * FROM user
</select>
</mapper>
报错信息:
Caused by: java.lang.IllegalArgumentException: Result Maps collection does not contain value for com.itheima.domain.User
at org.apache.ibatis.session.Configuration$StrictMap.get(Configuration.java:888)
at org.apache.ibatis.session.Configuration.getResultMap(Configuration.java:640)
at org.apache.ibatis.builder.MapperBuilderAssistant.getStatementResultMaps(MapperBuilderAssistant.java:344)
... 12 more
![13543313-780f5da462f7de72.png](https://i-blog.csdnimg.cn/blog_migrate/f1b0ed9a5e63fa860d0c18f146ae54d9.png)
基本映射 :(resultType)使用resultType进行输出映射,只有查询出来的列名和pojo中的属性名一致,该列才可以映射成功。(数据库,实体,查询字段,这些全部都得一一对应)高级映射 :(resultMap) 如果查询出来的列名和pojo的属性名不一致,通过定义一个resultMap对列名和pojo属性名之间作一个映射关系。(高级映射,字段名称可以不一致,通过映射来实现
resultType和resultMap功能类似 ,都是返回对象信息 ,但是resultMap要更强大一些 ,可自定义。因为resultMap要配置一下,表和类的一一对应关系,所以说就算你的字段名和你的实体类的属性名不一样也没关系,都会给你映射出来,但是,resultType就比较鸡肋了,必须字段名一样,比如说 cId和c_id 这种的都不能映射 。
参考:https://blog.csdn.net/xiao_xiao3601/article/details/92724587
————————————————————————————————————————————————
2020年1月17日17点16分 新bug
![13543313-bb15134cb3e2cee0.png](https://i-blog.csdnimg.cn/blog_migrate/ccba3aeeb995a8f56e935ea60ab900b5.png)
Caused by: java.lang.NoSuchMethodException: com.itheima.dao.IUserDao.<init>()
at java.base/java.lang.Class.getConstructor0(Class.java:3354)
at java.base/java.lang.Class.getDeclaredConstructor(Class.java:2558)
at org.apache.ibatis.reflection.factory.DefaultObjectFactory.instantiateClass(DefaultObjectFactory.java:62)
... 21 more
这个错误有点弱智 但归根结底 是resultMap的bug
报错信息是找不到方法,确实IUserDao里没有这个方法。
因为resultMap返回的是User类型,所以根本就不是 resultType="com.itheima.dao.IUserDao">
而是我返回的类型的全限定类名
<select id="findAll" resultType="com.itheima.domain.User">
SELECT * FROM user;
</select>