Mybatis 动态读取配置文件driver、url、username、username

项目的结构:

Mybatis 动态读取配置文件driver、url、username、username_第1张图片


部署到tomcat的时候,是打成jar包:希望能够从config.xml中取到mybatis的相关配置

DB是sqlserver2016!!!

Mybatis 动态读取配置文件driver、url、username、username_第2张图片



	
		
	


代码中mybatis配置:

Mybatis 动态读取配置文件driver、url、username、username_第3张图片

Mybatis 动态读取配置文件driver、url、username、username_第4张图片


正常情况下只要在db.properties中配好响应的参数即为实现动态配置,但是现在问题是你只能从jar外读取到配置,即从config.xml中取出配置!


以下是具体的解决方案:

①读取配置

/**
	 * 初始化jar的时候动态读取jar包以外的配置文件
	 * 解析的时候自动去掉CDMA
	 * @param xml
	 */
	@SuppressWarnings("unchecked")
	public static DBConfig readXmlConfig(String xml){
		DBConfig config = new DBConfig();
		try { 
			Element root = null;
			SAXBuilder builder = new SAXBuilder();
			File file = new File(xml);
			Document doc = builder.build(file);
			root = doc.getRootElement();
			List list = root.getChildren("sqlserver");

			if(list!=null&&list.size()>0){
				
				List list1 = list.get(0).getChildren("db");
				for (Element element : list1) {
					config.setUrl(element.getAttributeValue("url"));
					config.setUser(element.getAttributeValue("user"));
					config.setPassword(element.getAttributeValue("pwd"));
					config.setDriver(element.getAttributeValue("driver"));
				}
			}
		} catch (JDOMException e) {
			e.printStackTrace();
		}  catch (IOException e) {
			e.printStackTrace();
		}catch (Exception e) {
			e.printStackTrace();
		}

		return config;
	}



②赋值到Mybatis

//这里必须要为properties文件中的参数赋值
			Properties properties = new DBProperUtils().properties;

			properties.setProperty("driver", driver);
			properties.setProperty("url", url);
			properties.setProperty("username", username);
			properties.setProperty("password", password);

			OutputStream fos = new FileOutputStream(DBProperUtils.iniPath);
			properties.store(fos,"");  
			fos.close();
			
			String resource = "/mybatis-config.xml";	
			InputStream fis2 = getClass().getResourceAsStream(resource); 

			sqlSessionFactory = new SqlSessionFactoryBuilder().build(fis2,properties);


这里有两处关键的地方,对比一下说明:

对比一:用Resources.getResourceAsReader读取配置文件

String resource = "domain/configuration.xml";  
Reader reader = Resources.getResourceAsReader(resource);  //这样读不要/
SqlSessionFactory ssf = new SqlSessionFactoryBuilder().build(reader); 


对比二:用流的形式getClass().getResourceAsStream加载

String resource = "/mybatis-config.xml";
InputStream fis2 = getClass().getResourceAsStream(resource); //这样读要/
sqlSessionFactory = new SqlSessionFactoryBuilder().build(fis2,properties);


在研究的时候用流动态赋值了db.properties,然后用对比一的方式加载,一定要项目刷新一下才能更新到,网上搜了很多例子,但都不是我想要的

然后经过领导的点拨后,知道原理,赋值到db.properties用流取出来的时候也用流读取,这个问题就迎刃而解了!


其它延伸问题:

用Mybatis调存储过程,存储过程有两个动作,insert后select,然后用Mybatis跟sqlserver交互,然后发现一个问题,如果mapper中标签是select就只能做select动作,如果是insert,那又只能做insert动作,就是没法两个结果一起执行掉


		   
	

Mybatis用的版本是:mybatis-3.2.0.jar

最终确认问题是:没有关闭!没有关闭!没有关闭!sqlSession.close(); 

Mybatis 动态读取配置文件driver、url、username、username_第5张图片

/*
	 * 【==测试②==】
	 * Author:xiebin
	 * Comment: 执行insert后,在执行select
	 * Date:2016-11-01
	 * 测试从外部读取mybatis配置文件
	 */
	public Map testInsertAndSelect(){
		Map returnMapObject = new HashMap();
		try
		{
			TransactionManagerDao dao = sqlSession.getMapper(TransactionManagerDao.class);
			Map dataMap = dao.testInsertAndSelect(9545, "谢彬", 1, 1, 1);
					
			returnMapObject.put("ErrorCode", 0);
			returnMapObject.put("data", dataMap);
		}catch(Exception e){
			returnMapObject.put("ErrorCode", ErrorCode.QUERY_EXCEPTION_ERROR);
			returnMapObject.put("ErrorMsg", e);
		}finally {
			sqlSession.close();  
			sqlSession.clearCache();
        }  
		return returnMapObject;
		
	}


你可能感兴趣的:(Mybatis,Java,SQL,Server)