解闷ibatis与spring的配置( There is no statement named XXX in this SqlMap)

本文记录了解决ibatis与spring整合时出现的ThereisnostatementnamedXXXinthisSqlMap错误的过程。通过调整配置文件,成功定位并解决了问题。

公司的spring+ struts+ ibatis的框架,用得很熟了。想自己写一个demo,可是在spring和ibatis配置的时候,出现了令人纠结的问题。

报错提示: There is no statement named XXX in this SqlMap。

其实看字面上的意思就知道是,ibatis的xml配置文件没找到或者xml配置文件出错。但是令人蛋疼的是,公司的项目与demo的配置一模一样,为什么神马会如此让我不堪呢?

ibatis与spring的整合配置部分如下:

spring配置文件,

<bean id="sqlMapClient" class="org.springframework.orm.ibatis.SqlMapClientFactoryBean"> <property name="configLocation" value="classpath:config/sql-map-config.xml" /> <property name="mappingLocations" value="classpath:cn/xiaoqiang/ibatis/sqlmap/*/*.xml" /> <property name="dataSource" ref="dataSource" /> </bean>


sql-map-config.xml,

<sqlMapConfig> <settings cacheModelsEnabled="true" enhancementEnabled="true" lazyLoadingEnabled="true" maxRequests="32" maxSessions="10" maxTransactions="5" useStatementNamespaces="true" /> </sqlMapConfig>


因为公司的项目结构很庞大,故用 mappingLocations 配置ibatis的映射文件,并使用了 * 通配符。这个做法省了些麻烦,就不必要在sql-map-config.xml文件中加入类似于:

<sqlMap resource="config/User.xml"/> 的引入映射文件了。

但是呢,在我的demo项目中,只有一个ibatis的 User.xml映射文件,基于以上配置,故报了 There is no statement named XXX in this SqlMap 的错误。玛德,让哥蛋疼很

久。错误很明显,但又找不出具体原因。只能逐一排查,路径啊、字符少了或是多了、数据源啊等。最后,灵光一现,换一种配置方法,竟然OK了。该方法是: 注释掉spring

配置文件中的:

<property name="mappingLocations" value="classpath:cn/xiaoqiang/ibatis/sqlmap/*/*.xml" /> ,然后在 sql-map-config.xml文件中加入

<sqlMap resource="config/User.xml"/> 。

总结: 当你陷入问题时,不要浮躁,心平气和的进行换位思考,柳暗花明又一村。

<think>好的,我现在需要解决用户遇到的ibatis报错:“no result map named commonj.sdo.DataObject in this SqlMap”。用户提到引用了几个资料,其中引用[1]和[2]涉及SQL映射文件中的resultMap配置,而引用[3]是关于结果映射不匹配的错误。首先,我需要分析这个错误的原因。 首先,错误信息明确指出在SqlMap中找不到名为commonj.sdo.DataObject的结果映射。这表明在SQL查询中指定了resultMap或resultClass,但配置不正确。查看用户提供的引用[1]中的SQL映射文件,发现他们使用了resultClass="commonj.sdo.DataObject",而没有定义对应的resultMap。这可能是因为直接使用了resultClass而不是resultMap,或者resultMap的名称不匹配。 接着,考虑commonj.sdo.DataObject是否是ibatis支持的类型。可能的问题在于框架无法自动映射结果集到该类型,尤其是如果未正确定义resultMap的话。比如在引用[1]中,虽然有一个resultMap的id是"resultMap",但select语句使用的是resultClass,而不是引用该resultMap。正确的做法应该是使用resultMap属性指向已定义的resultMap,或者确保resultClass正确配置。 另外,用户可能在配置文件中遗漏了resultMap的定义,或者resultMap的idSQL语句中引用的名称不一致。例如,在引用[1]的示例中,resultMap的id是"resultMap",但如果在select语句中错误地引用了不同的名称,比如commonj.sdo.DataObject,就会导致找不到对应的resultMap。同时,如果参数类型或结果类型配置有误,也可能导致此类错误。 还需要检查SQL映射文件的语法是否正确,比如XML结构、标签闭合等,避免因格式错误导致配置未被正确解析。此外,确认ibatis配置文件是否正确定义了SQL映射文件的位置,确保相关映射被正确加载。 解决方案方面,首先应检查SQL语句中的resultMap或resultClass是否正确配置。如果使用resultClass,需确保该类能被ibatis识别并正确映射。如果使用自定义的resultMap,需在SQL映射文件中正确定义,并在select标签中通过resultMap属性引用。例如,用户可能在select标签中误用了resultClass,而应该使用resultMap="resultMap",同时确保resultMap中的属性映射正确。 另外,可能需要显式定义resultMap,将数据库列Java对象的属性对应起来,特别是当列名属性名不一致时。例如,在引用[1]的resultMap中,将TYPEID列映射到typeId属性,如果其他查询需要更多的映射,需要逐一配置,否则会导致自动映射失败。 最后,验证配置后,建议清理和重建项目,确保所有配置文件被正确加载,避免缓存导致的旧配置残留。如果仍有问题,检查ibatis的日志输出,查看更详细的错误信息,帮助定位具体原因。</think>### 关于 "no result map named commonj.sdo.DataObject" 报错的原因及解决方案 #### **错误原因分析** 1. **未正确定义`resultMap`** iBatis 要求在使用自定义结果映射时需在 SQL 映射文件中显式定义`<resultMap>`。如果 SQL 语句(如`<select>`)中引用了未定义的`resultMap`名称(例如`commonj.sdo.DataObject`),则会触发此错误[^1]。 2. **误用`resultClass`替代`resultMap`** 若尝试通过`resultClass="commonj.sdo.DataObject"`直接映射结果,但未配置对应的字段映射规则,iBatis 可能无法自动处理复杂类型(如 SDO 对象),导致映射失败[^2]。 3. **XML 配置语法错误** 映射文件中的标签闭合不完整、属性拼写错误(如`resultMap`写成`resultmap`)或未正确关联`parameterClass`/`resultClass`,均会导致解析失败[^1][^3]。 --- #### **解决方案** ##### 1. **显式定义`resultMap`** 在 SQL 映射文件中添加针对`commonj.sdo.DataObject`的映射规则: ```xml <resultMap id="dataObjectResultMap" class="commonj.sdo.DataObject"> <result column="TYPEID" property="typeId" javaType="string" /> <!-- 添加其他字段映射 --> </resultMap> ``` 并在查询语句中引用该`resultMap`: ```xml <select id="select_data_test" parameterClass="java.util.HashMap" resultMap="dataObjectResultMap"> select * from $tablename$ </select> ``` ##### 2. **验证`resultClass`兼容性** 如果坚持使用`resultClass`,需确保: - `commonj.sdo.DataObject`是 iBatis 支持的基础类型或已注册的别名。 - 数据库字段名对象属性名完全一致(或通过配置`mapUnderscoreToCamelCase`自动转换)。 ##### 3. **检查 XML 语法和配置加载** - 确认映射文件的 XML 结构正确(如标签闭合、命名空间声明)。 - 在 iBatis配置文件中确认已加载当前 SQL 映射文件: ```xml <sqlMap resource="path/to/your/sqlmap.xml"/> ``` ##### 4. **调试日志分析** 开启 iBatis 的详细日志输出,观察 SQL 解析过程是否成功加载`resultMap`。若存在缓存问题,清理项目构建文件并重启服务。 --- #### **关联问题参考** - 类似错误如 `BindingException: Invalid bound statement` 通常由 XML 文件未正确编译到类路径引起[^3]。 - 字段数量不匹配问题(如`Column count doesn't match value count`)需检查 SQL 语句参数占位符是否一致[^3]。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值