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的,不是任意顺序的。这个以后要注意啦。。。

 

posted @ 2013-05-17 21:26  dumbdonkey  阅读(1679)  评论(1编辑  收藏  举报