项目中有个需求,要将一个源数据库的记录迁移到目的数据库,目的端数据库的IP,端口,数据库名,用户名和密码都是从一个配置表里临时查出来的,这就需要在运行时去配置Ibatis的sql-map-config.xml的数据源.
Google到Ibatis支持的数据源配置方式其中一种就是通过property文件读取连接配置信息.
sql-map-config.xml中代码如下:
<sqlMapConfig> <settings cacheModelsEnabled="true" enhancementEnabled="true" lazyLoadingEnabled="true" maxRequests="32" maxSessions="10" maxTransactions="5" useStatementNamespaces="false" /> <properties resource="database.properties"/> <transactionManager type="JDBC"> <dataSource type="SIMPLE"> <property value="${driver}" name="JDBC.Driver"/> <property value="${url}" name="JDBC.ConnectionURL"/> <property value="${username}" name="JDBC.Username"/> <property value="${password}" name="JDBC.Password"/> </dataSource> </transactionManager>
之前把<properties resource="config.properties"/> 放到<setting>标签和<transactionManager >之间, 得到了一个XML解析错误, 提示:
Exception in thread "main" java.lang.RuntimeException: Error occurred. Cause: com.ibatis.common.xml.NodeletException: Error parsing XML. Cause: org.xml.sax.SAXParseException: The content of element type "sqlMapConfig" must match "(properties?,settings?,resultObjectFactory?,typeAlias*,typeHandler*,transactionManager?,sqlMap+)+".
at com.ibatis.sqlmap.engine.builder.xml.SqlMapConfigParser.parse(SqlMapConfigParser.java:49)
看了半天才晓得标签是有顺序的, 必须按错误消息的的顺序写标签才行. 汗......
config.properties里的配置:
driver=oracle.jdbc.driver.OracleDriver url=jdbc:oracle:thin:@192.168.56.101:1521:XE username=practice password=practice
读取sql-map-config.xml的java代码不变:
java.io.Reader reader = com.ibatis.common.resources.Resources.getResourceAsReader ("misp/migrate/sql-map-config.xml");
SqlMapClient sqlClient = SqlMapClientBuilder.buildSqlMapClient(reader);
当然, 在读取sql-map-config.xml之前,应该先将连接配置用Properties类写入到config.properties文件里去.