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的整体架构分为三层: 1.基础支持层 该层包括:数据源模块、事务管理模块、缓存模块、Binding模块、反射模块、类型转换模块、日志模块、资源加载模块、解析器模块 2.核心处理层 该层包括:配置解析、参数映射、SQL解析、SQL执行、结果集映射、插件 3.接口层 该层包括:SqlSession 基础支持层 该层保护mybatis的基础模块,它们为核心处理层提供了良好的支撑。

第10章 中断和动态时钟显示

第10章 中断和动态时钟显示 从本章开始,按照书籍的划分,第10章开始就进入保护模式(Protected Mode)部分了,感觉从这里开始难度突然就增加了。 书中介绍了为什么有中断(Interrupt)的设计,中断的几种方式:外部硬件中断、内部中断和软中断。通过中断做了一个会走的时钟和屏幕上输入字符的程序。 我自己理解中断的一些作用: 为了更好的利用处理器的性能。协同快速和慢速设备一起工作

动态规划---打家劫舍

题目: 你是一个专业的小偷,计划偷窃沿街的房屋。每间房内都藏有一定的现金,影响你偷窃的唯一制约因素就是相邻的房屋装有相互连通的防盗系统,如果两间相邻的房屋在同一晚上被小偷闯入,系统会自动报警。 给定一个代表每个房屋存放金额的非负整数数组,计算你 不触动警报装置的情况下 ,一夜之内能够偷窃到的最高金额。 思路: 动态规划五部曲: 1.确定dp数组及含义 dp数组是一维数组,dp[i]代表

代码随想录冲冲冲 Day39 动态规划Part7

198. 打家劫舍 dp数组的意义是在第i位的时候偷的最大钱数是多少 如果nums的size为0 总价值当然就是0 如果nums的size为1 总价值是nums[0] 遍历顺序就是从小到大遍历 之后是递推公式 对于dp[i]的最大价值来说有两种可能 1.偷第i个 那么最大价值就是dp[i-2]+nums[i] 2.不偷第i个 那么价值就是dp[i-1] 之后取这两个的最大值就是d

Spring+MyBatis+jeasyui 功能树列表

java代码@EnablePaging@RequestMapping(value = "/queryFunctionList.html")@ResponseBodypublic Map<String, Object> queryFunctionList() {String parentId = "";List<FunctionDisplay> tables = query(parent

Mybatis中的like查询

<if test="templateName != null and templateName != ''">AND template_name LIKE CONCAT('%',#{templateName,jdbcType=VARCHAR},'%')</if>

matlab读取NC文件(含group)

matlab读取NC文件(含group): NC文件数据结构: 代码: % 打开 NetCDF 文件filename = 'your_file.nc'; % 替换为你的文件名% 使用 netcdf.open 函数打开文件ncid = netcdf.open(filename, 'NC_NOWRITE');% 查看文件中的组% 假设我们想读取名为 "group1" 的组groupName

JavaWeb【day09】--(Mybatis)

1. Mybatis基础操作 学习完mybatis入门后,我们继续学习mybatis基础操作。 1.1 需求 需求说明: 根据资料中提供的《tlias智能学习辅助系统》页面原型及需求,完成员工管理的需求开发。 通过分析以上的页面原型和需求,我们确定了功能列表: 查询 根据主键ID查询 条件查询 新增 更新 删除 根据主键ID删除 根据主键ID批量删除

Anaconda 中遇到CondaHTTPError: HTTP 404 NOT FOUND for url的问题及解决办法

最近在跑一个开源项目遇到了以下问题,查了很多资料都大(抄)同(来)小(抄)异(去)的,解决不了根本问题,费了很大的劲终于得以解决,记录如下: 1、问题及过程: (myenv) D:\Workspace\python\XXXXX>conda install python=3.6.13 Solving environment: done.....Proceed ([y]/n)? yDownloa

MyBatis 切换不同的类型数据库方案

下属案例例当前结合SpringBoot 配置进行讲解。 背景: 实现一个工程里面在部署阶段支持切换不同类型数据库支持。 方案一 数据源配置 关键代码(是什么数据库,该怎么配就怎么配) spring:datasource:name: test# 使用druid数据源type: com.alibaba.druid.pool.DruidDataSource# @需要修改 数据库连接及驱动u