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中$与#的区别解析

《MyBatis中$与#的区别解析》文章浏览阅读314次,点赞4次,收藏6次。MyBatis使用#{}作为参数占位符时,会创建预处理语句(PreparedStatement),并将参数值作为预处理语句... 目录一、介绍二、sql注入风险实例一、介绍#(井号):MyBATis使用#{}作为参数占位符时,会

mybatis执行insert返回id实现详解

《mybatis执行insert返回id实现详解》MyBatis插入操作默认返回受影响行数,需通过useGeneratedKeys+keyProperty或selectKey获取主键ID,确保主键为自... 目录 两种方式获取自增 ID:1. ​​useGeneratedKeys+keyProperty(推

Java中读取YAML文件配置信息常见问题及解决方法

《Java中读取YAML文件配置信息常见问题及解决方法》:本文主要介绍Java中读取YAML文件配置信息常见问题及解决方法,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要... 目录1 使用Spring Boot的@ConfigurationProperties2. 使用@Valu

一文详解SpringBoot中控制器的动态注册与卸载

《一文详解SpringBoot中控制器的动态注册与卸载》在项目开发中,通过动态注册和卸载控制器功能,可以根据业务场景和项目需要实现功能的动态增加、删除,提高系统的灵活性和可扩展性,下面我们就来看看Sp... 目录项目结构1. 创建 Spring Boot 启动类2. 创建一个测试控制器3. 创建动态控制器注

MyBatis-Plus 中 nested() 与 and() 方法详解(最佳实践场景)

《MyBatis-Plus中nested()与and()方法详解(最佳实践场景)》在MyBatis-Plus的条件构造器中,nested()和and()都是用于构建复杂查询条件的关键方法,但... 目录MyBATis-Plus 中nested()与and()方法详解一、核心区别对比二、方法详解1.and()

springboot项目打jar制作成镜像并指定配置文件位置方式

《springboot项目打jar制作成镜像并指定配置文件位置方式》:本文主要介绍springboot项目打jar制作成镜像并指定配置文件位置方式,具有很好的参考价值,希望对大家有所帮助,如有错误... 目录一、上传jar到服务器二、编写dockerfile三、新建对应配置文件所存放的数据卷目录四、将配置文

springboot如何通过http动态操作xxl-job任务

《springboot如何通过http动态操作xxl-job任务》:本文主要介绍springboot如何通过http动态操作xxl-job任务的问题,具有很好的参考价值,希望对大家有所帮助,如有错... 目录springboot通过http动态操作xxl-job任务一、maven依赖二、配置文件三、xxl-

Redis 配置文件使用建议redis.conf 从入门到实战

《Redis配置文件使用建议redis.conf从入门到实战》Redis配置方式包括配置文件、命令行参数、运行时CONFIG命令,支持动态修改参数及持久化,常用项涉及端口、绑定、内存策略等,版本8... 目录一、Redis.conf 是什么?二、命令行方式传参(适用于测试)三、运行时动态修改配置(不重启服务

nginx启动命令和默认配置文件的使用

《nginx启动命令和默认配置文件的使用》:本文主要介绍nginx启动命令和默认配置文件的使用,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录常见命令nginx.conf配置文件location匹配规则图片服务器总结常见命令# 默认配置文件启动./nginx

MyBatis ResultMap 的基本用法示例详解

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