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映射器配置小结》本文详解MyBatis映射器配置,重点讲解字段映射的三种解决方案(别名、自动驼峰映射、resultMap),文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定... 目录select中字段的映射问题使用SQL语句中的别名功能使用mapUnderscoreToCame

Java使用Javassist动态生成HelloWorld类

《Java使用Javassist动态生成HelloWorld类》Javassist是一个非常强大的字节码操作和定义库,它允许开发者在运行时创建新的类或者修改现有的类,本文将简单介绍如何使用Javass... 目录1. Javassist简介2. 环境准备3. 动态生成HelloWorld类3.1 创建CtC

mybatis-plus如何根据任意字段saveOrUpdateBatch

《mybatis-plus如何根据任意字段saveOrUpdateBatch》MyBatisPlussaveOrUpdateBatch默认按主键判断操作类型,若需按其他唯一字段(如agentId、pe... 目录使用场景方法源码方法改造首先在service层定义接口service层接口实现总结使用场景my

MyBatis ParameterHandler的具体使用

《MyBatisParameterHandler的具体使用》本文主要介绍了MyBatisParameterHandler的具体使用,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参... 目录一、概述二、源码1 关键属性2.setParameters3.TypeHandler1.TypeHa

MyBatis-plus处理存储json数据过程

《MyBatis-plus处理存储json数据过程》文章介绍MyBatis-Plus3.4.21处理对象与集合的差异:对象可用内置Handler配合autoResultMap,集合需自定义处理器继承F... 目录1、如果是对象2、如果需要转换的是List集合总结对象和集合分两种情况处理,目前我用的MP的版本

MySQL的配置文件详解及实例代码

《MySQL的配置文件详解及实例代码》MySQL的配置文件是服务器运行的重要组成部分,用于设置服务器操作的各种参数,下面:本文主要介绍MySQL配置文件的相关资料,文中通过代码介绍的非常详细,需要... 目录前言一、配置文件结构1.[mysqld]2.[client]3.[mysql]4.[mysqldum

使用Java读取本地文件并转换为MultipartFile对象的方法

《使用Java读取本地文件并转换为MultipartFile对象的方法》在许多JavaWeb应用中,我们经常会遇到将本地文件上传至服务器或其他系统的需求,在这种场景下,MultipartFile对象非... 目录1. 基本需求2. 自定义 MultipartFile 类3. 实现代码4. 代码解析5. 自定

MyBatis-Plus 与 Spring Boot 集成原理实战示例

《MyBatis-Plus与SpringBoot集成原理实战示例》MyBatis-Plus通过自动配置与核心组件集成SpringBoot实现零配置,提供分页、逻辑删除等插件化功能,增强MyBa... 目录 一、MyBATis-Plus 简介 二、集成方式(Spring Boot)1. 引入依赖 三、核心机制

MySQL 数据库表操作完全指南:创建、读取、更新与删除实战

《MySQL数据库表操作完全指南:创建、读取、更新与删除实战》本文系统讲解MySQL表的增删查改(CURD)操作,涵盖创建、更新、查询、删除及插入查询结果,也是贯穿各类项目开发全流程的基础数据交互原... 目录mysql系列前言一、Create(创建)并插入数据1.1 单行数据 + 全列插入1.2 多行数据

MyBatis的xml中字符串类型判空与非字符串类型判空处理方式(最新整理)

《MyBatis的xml中字符串类型判空与非字符串类型判空处理方式(最新整理)》本文给大家介绍MyBatis的xml中字符串类型判空与非字符串类型判空处理方式,本文给大家介绍的非常详细,对大家的学习或... 目录完整 Hutool 写法版本对比优化为什么status变成Long?为什么 price 没事?怎