当前位置: 代码迷 >> SQL >> iBatis 动态创办sqlmap
  详细解决方案

iBatis 动态创办sqlmap

热度:208   发布时间:2016-05-05 15:21:35.0
iBatis 动态创建sqlmap

前段时间做一个项目,需要用户输入数据库的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;	}
?

?

  相关解决方案