这几天一直在看ibatis相关的东西。
昨晚想写个demo例子试着玩一下,谁知道一玩就出了问题。
配置文件如下:
<?xml version="1.0" encoding="UTF-8"?>
<!-- !DOCTYPE指定文件使用DTD进行校验 <!DOCTYPE 根元素 PUBLIC "注册//组织//类型 标签//定义 语言" "文档类型定义位置" -->
<!DOCTYPE sqlMapConfig PUBLIC "-//ibatis.apache.org//DTD SQL Map Config 2.0//EN"
"http://ibatis.apache.org/dtd/sql-map-config-2.dtd">
<sqlMapConfig>
<settings enhancementEnabled="true" maxTransactions="32"
maxRequests="512" maxSessions="128" cacheModelsEnabled="true"
lazyLoadingEnabled="false" statementCachingEnabled="false"
useStatementNamespaces="true" />
<!-- 引用JDBC属性的配置文件 -->
<properties resource="com/mobel/entity/SqlMap.properties" />
<!-- 使用JDBC的事务管理 -->
<transactionManager type="JDBC">
<!-- 数据源 -->
<dataSource type="SIMPLE">
<property name="JDBC.Driver" value="${driver}" />
<property name="JDBC.ConnectionURL" value="${url}" />
<property name="JDBC.Username" value="${username}" />
<property name="JDBC.Password" value="${password}" />
</dataSource>
</transactionManager>
<!-- 这里可以写多个实体的映射文件 -->
<sqlMap resource="com/mobel/entity/Student.xml" />
</sqlMapConfig>
执行测试程序后,报错如下:
Exception in thread "main" java.lang.ExceptionInInitializerError
at com.mobel.test.TestIbatis.main(TestIbatis.java:18)
Caused by: java.lang.RuntimeException: Error occurred. Cause: com.ibatis.common
.xml.NodeletException: Error parsing XML. Cause: org.xml.sax.SAXParseException;
lineNumber: 26; columnNumber: 16; 元素类型为 "sqlMapConfig" 的内容必须匹配 "(properties?,se
ttings?,resultObjectFactory?,typeAlias*,typeHandler*,transactionManager?,sqlMap+
)+"。
at com.ibatis.sqlmap.engine.builder.xml.SqlMapConfigParser.parse(SqlMapConfigPa
rser.java:120)
at com.ibatis.sqlmap.client.SqlMapClientBuilder.buildSqlMapClient(SqlMapClientB
uilder.java:63)
看了下错误,开始理解为sqlMapConfig中的配置有问题,可是查了半天,也没发现配置文件哪里有问题。
今天下载了所有相关的源代码进行调试,总是调式到properties节点时报异常,所以试着把properties节点删了再试,发现竟然成功了。
突然想起是不是顺序有影响,然后调整下配置文件的顺序,将settings放在properties之后,问题解决。
最终配置文件如下:
<?xml version="1.0" encoding="UTF-8"?>
<!-- !DOCTYPE指定文件使用DTD进行校验 <!DOCTYPE 根元素 PUBLIC "注册//组织//类型 标签//定义 语言" "文档类型定义位置" -->
<!DOCTYPE sqlMapConfig PUBLIC "-//ibatis.apache.org//DTD SQL Map Config 2.0//EN"
"http://ibatis.apache.org/dtd/sql-map-config-2.dtd">
<sqlMapConfig>
<!-- 引用JDBC属性的配置文件 -->
<properties resource="com/mobel/entity/SqlMap.properties" />
<settings enhancementEnabled="true" maxTransactions="32"
maxRequests="512" maxSessions="128" cacheModelsEnabled="true"
lazyLoadingEnabled="false" statementCachingEnabled="false"
useStatementNamespaces="true" />
<!-- 使用JDBC的事务管理 -->
<transactionManager type="JDBC">
<!-- 数据源 -->
<dataSource type="SIMPLE">
<property name="JDBC.Driver" value="${driver}" />
<property name="JDBC.ConnectionURL" value="${url}" />
<property name="JDBC.Username" value="${username}" />
<property name="JDBC.Password" value="${password}" />
</dataSource>
</transactionManager>
<!-- 这里可以写多个实体的映射文件 -->
<sqlMap resource="com/mobel/entity/Student.xml" />
</sqlMapConfig>
总结:
究其原因,是因为自己DTD语法不熟悉,没有完全理解sql-map-config-2.dtd的含义导致的。
<!ELEMENT sqlMapConfig (properties?, settings?, resultObjectFactory?, typeAlias*, typeHandler*, transactionManager?, sqlMap+)+> <!ATTLIST sqlMapConfig xmlns:fo CDATA #IMPLIED >
sqlMapConfig的定义是限定了顺序的啊!是sequence的,不是任意顺序的。这个以后要注意啦。。。
来源:https://www.cnblogs.com/zuoca/archive/2013/05/17/ibatis23_DTD.html