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

2024-03-26 08:59

本文主要是介绍Mybatis 动态读取配置文件driver、url、username、username,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

项目的结构:



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

DB是sqlserver2016!!!


<?xml version="1.0" encoding="utf-8"?>
<config><sqlserver><db user="sa" pwd="sa" url="jdbc:sqlserver://localhost;Database=test" driver="com.microsoft.sqlserver.jdbc.SQLServerDriver"/></sqlserver>
</config>


代码中mybatis配置:




正常情况下只要在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<Element> list = root.getChildren("sqlserver");if(list!=null&&list.size()>0){List<Element> 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动作,就是没法两个结果一起执行掉

<select id="test" resultType="ReturnSql"><![CDATA[  {call testSelectAndInsert(#{0,mode=IN,jdbcType=INTEGER},#{1,mode=IN,jdbcType=INTEGER},#{2,mode=IN,jdbcType=INTEGER},#{3,mode=IN,jdbcType=INTEGER},#{4,mode=IN,jdbcType=INTEGER},#{5,mode=IN,jdbcType=VARCHAR},#{6,mode=IN,jdbcType=NVARCHAR},#{7,mode=IN,jdbcType=VARCHAR},#{8,mode=IN,jdbcType=VARCHAR})}  ]]>  </select>
<insert id="test" resultType="ReturnSql"><![CDATA[  {call testSelectAndInsert(#{0,mode=IN,jdbcType=INTEGER},#{1,mode=IN,jdbcType=INTEGER},#{2,mode=IN,jdbcType=INTEGER},#{3,mode=IN,jdbcType=INTEGER},#{4,mode=IN,jdbcType=INTEGER},#{5,mode=IN,jdbcType=VARCHAR},#{6,mode=IN,jdbcType=NVARCHAR},#{7,mode=IN,jdbcType=VARCHAR},#{8,mode=IN,jdbcType=VARCHAR})}  ]]>  </insert>

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

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


/** 【==测试②==】* Author:xiebin* Comment: 执行insert后,在执行select* Date:2016-11-01* 测试从外部读取mybatis配置文件*/public Map<String, Object> testInsertAndSelect(){Map<String,Object> returnMapObject = new HashMap<String, Object>();try{TransactionManagerDao dao = sqlSession.getMapper(TransactionManagerDao.class);Map<String, Object> 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 动态读取配置文件driver、url、username、username的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/847970

相关文章

MyBatis ResultMap 的基本用法示例详解

《MyBatisResultMap的基本用法示例详解》在MyBatis中,resultMap用于定义数据库查询结果到Java对象属性的映射关系,本文给大家介绍MyBatisResultMap的基本... 目录MyBATis 中的 resultMap1. resultMap 的基本语法2. 简单的 resul

Mybatis的分页实现方式

《Mybatis的分页实现方式》MyBatis的分页实现方式主要有以下几种,每种方式适用于不同的场景,且在性能、灵活性和代码侵入性上有所差异,对Mybatis的分页实现方式感兴趣的朋友一起看看吧... 目录​1. 原生 SQL 分页(物理分页)​​2. RowBounds 分页(逻辑分页)​​3. Page

MyBatis Plus 中 update_time 字段自动填充失效的原因分析及解决方案(最新整理)

《MyBatisPlus中update_time字段自动填充失效的原因分析及解决方案(最新整理)》在使用MyBatisPlus时,通常我们会在数据库表中设置create_time和update... 目录前言一、问题现象二、原因分析三、总结:常见原因与解决方法对照表四、推荐写法前言在使用 MyBATis

Mybatis Plus Join使用方法示例详解

《MybatisPlusJoin使用方法示例详解》:本文主要介绍MybatisPlusJoin使用方法示例详解,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,... 目录1、pom文件2、yaml配置文件3、分页插件4、示例代码:5、测试代码6、和PageHelper结合6

SpringBoot读取ZooKeeper(ZK)属性的方法实现

《SpringBoot读取ZooKeeper(ZK)属性的方法实现》本文主要介绍了SpringBoot读取ZooKeeper(ZK)属性的方法实现,强调使用@ConfigurationProperti... 目录1. 在配置文件中定义 ZK 属性application.propertiesapplicati

MyBatis设计SQL返回布尔值(Boolean)的常见方法

《MyBatis设计SQL返回布尔值(Boolean)的常见方法》这篇文章主要为大家详细介绍了MyBatis设计SQL返回布尔值(Boolean)的几种常见方法,文中的示例代码讲解详细,感兴趣的小伙伴... 目录方案一:使用COUNT查询存在性(推荐)方案二:条件表达式直接返回布尔方案三:存在性检查(EXI

Java调用C#动态库的三种方法详解

《Java调用C#动态库的三种方法详解》在这个多语言编程的时代,Java和C#就像两位才华横溢的舞者,各自在不同的舞台上展现着独特的魅力,然而,当它们携手合作时,又会碰撞出怎样绚丽的火花呢?今天,我们... 目录方法1:C++/CLI搭建桥梁——Java ↔ C# 的“翻译官”步骤1:创建C#类库(.NET

Python中文件读取操作漏洞深度解析与防护指南

《Python中文件读取操作漏洞深度解析与防护指南》在Web应用开发中,文件操作是最基础也最危险的功能之一,这篇文章将全面剖析Python环境中常见的文件读取漏洞类型,成因及防护方案,感兴趣的小伙伴可... 目录引言一、静态资源处理中的路径穿越漏洞1.1 典型漏洞场景1.2 os.path.join()的陷

MyBatis编写嵌套子查询的动态SQL实践详解

《MyBatis编写嵌套子查询的动态SQL实践详解》在Java生态中,MyBatis作为一款优秀的ORM框架,广泛应用于数据库操作,本文将深入探讨如何在MyBatis中编写嵌套子查询的动态SQL,并结... 目录一、Myhttp://www.chinasem.cnBATis动态SQL的核心优势1. 灵活性与可

Mybatis嵌套子查询动态SQL编写实践

《Mybatis嵌套子查询动态SQL编写实践》:本文主要介绍Mybatis嵌套子查询动态SQL编写方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录前言一、实体类1、主类2、子类二、Mapper三、XML四、详解总结前言MyBATis的xml文件编写动态SQL