ibatis 2.3 问题
这几天一直在看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的,不是任意顺序的。这个以后要注意啦。。。