前段时间做一个项目,需要用户输入数据库的url等,然后对这个数据库进行一些操作,当然那些数据库里面需要有一些表,还有字段等也跟我们的定义相符。
?
一般用iBatis都是事先配置好,系统启动的时候就会创建好连接池和SqlMap,但是我们这个应用就需要动态创建。我用的办法是,提供一个标准的sql-map-config文件作为模板,用户在页面上创建新的数据库以后,就操作这个sql-map-config文件,修改里面的url等信息,然后另存。然后再使用SqlMapClientBuilder.buildSqlMapClient(reader)的方法读这个配置文件生成新的sqlmap。
?
对于多个这种sqlmap,可以在创建以后保存到一个map里,根据url之类的信息生成一个key值,每次用的时候直接从map里面取。
?
其中,作为模板的sql-map-config文件如下,datasource里面只加了必要的参数,具体其他配置可以再根据需要添加:
?
?
<?xml version="1.0" encoding="UTF-8"?><!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 useStatementNamespaces="true" /> <typeAlias type="com.XXXX" alias="User" /> <transactionManager type="JDBC"> <dataSource type="SIMPLE"> <property name="JDBC.Driver" value="cubrid.jdbc.driver.CUBRIDDriver" /> <property name="JDBC.ConnectionURL" value=""/> <property name="JDBC.Username" value=""/> <property name="JDBC.Password" value=""/> </dataSource> </transactionManager> <sqlMap resource="sqlmap/user.xml" /></sqlMapConfig>
?
相应的java修改xml文件,并创建sql的代码如下:
?
?
public static SqlMapClient getSqlMap(String url, String user, String password) { LOG.debug("Creating sqlmap fo url:{}, user:{}, password:{}", new String[]{url, user, password}); String template = "template-sql-map-config.xml"; SqlMapClient sqlmap = null; try { SAXReader saxReader = new SAXReader(); Document document = saxReader.read(Resources.getResourceAsReader(template)); List urlNodeList = document.selectNodes("//property[@name='JDBC.ConnectionURL']" ); Element urlElement = (Element)urlNodeList.get(0); urlElement.addAttribute("value", url); urlNodeList = document.selectNodes("//property[@name='JDBC.Username']" ); Element userElement = (Element)urlNodeList.get(0); userElement.addAttribute("value", user); urlNodeList = document.selectNodes("//property[@name='JDBC.Password']" ); Element pwdElement = (Element)urlNodeList.get(0); pwdElement.addAttribute("value", password); String newConfigFileName = "temp_" + template; File classesPath = Resources.getResourceAsFile(template).getParentFile(); File tmpConfigFIle = File.createTempFile(newConfigFileName, ".xml", classesPath); XMLWriter xmlWriter = new XMLWriter(new FileOutputStream(tmpConfigFIle)); xmlWriter.write(document); xmlWriter.close(); Reader reader = Resources.getResourceAsReader(tmpConfigFIle.getName()); tmpConfigFIle.deleteOnExit(); sqlmap = SqlMapClientBuilder.buildSqlMapClient(reader); } catch (Exception e) { LOG.error(e.getMessage(), e); } return sqlmap; }?
?