Mybatis设置全局变量及使用dom4j写入xml文件

来源:互联网 发布:桑蚕丝裙子淘宝网天猫 编辑:程序博客网 时间:2024/05/29 19:06

项目中,学姐提出了一个需求,想在网站登录时可以选择一个年份,项目中所有的数据都有这个年份的筛选,于是便想到挨个修改Mapper层SQL语句实在太麻烦,能不能给Mybatis设置一个全局变量来供所有的SQL使用,这样便能简单不少。(本博文并不是这个需求的解决方案,看完别骂街)
在mybatis的配置文件中,sqlSessionFactory节点下面添加一个节点

<property name="configLocation" value="classpath:mybatis-configuration.xml" />

然后在相同路径下添加mybatis-configuration.xml配置文件

<?xml version="1.0" encoding="UTF-8"?><!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Config 3.0//EN" "http://mybatis.org/dtd/mybatis-3-config.dtd"><configuration>  <properties>    <property name="graduateYear" value="2018"/>  </properties></configuration>

然后可以在所有的mapper.xml文件中使用WHERE语句时使用这个参数,用${graduateYear}来调用,不同于其他参数#{变量名}
这样便是在mybatis设置全局变量的做法

但是,刚都说了要选择毕业年份,肯定不能将其写死,于是便需要通过外部程序写入xml配置文件中,找了好久找到了一个API叫做dom4j(dom for Java)来写入

先在pom.xml文件中添加以下jar依赖

        <dependency>            <groupId>dom4j</groupId>            <artifactId>dom4j</artifactId>            <version>1.6.1</version>        </dependency>

然后在controller中添加以下代码

        //获取当前文件路径(该文件为controller)        String path = String.valueOf(getClass().getResource("/"));        //因为使用的是IDEA,所以输出路径是项目文件夹中的target文件,但我并不想写入编译后的,所以分割字符串,获取项目路径        int index = path.indexOf("target");        //获取项目路径        String newPath = path.substring(6,index);        //读取原xml文件        Document doc=new SAXReader().read(new File(newPath + "src/main/resources/mybatis-configuration.xml"));        //获取根节点下的properties节点        Element propertiesElem = doc.getRootElement().element("properties");        //再获取properties节点下的property节点        Element propertyElem = propertiesElem.element("property");        //获取property节点的属性value        Attribute graduateYear = propertyElem.attribute("value");        //将属性value的值设为year(year为定义的变量,从页面获取)        graduateYear.setValue(year);        //声明输出路径(与读路径相同,即修改源文件)        FileOutputStream out =new FileOutputStream(newPath + "src/main/resources/mybatis-configuration.xml");        // 指定文本的写出的格式:        OutputFormat format=OutputFormat.createPrettyPrint();   //漂亮格式:有空格换行        format.setEncoding("UTF-8");        //1.创建写出对象        XMLWriter writer=new XMLWriter(out,format);        //2.写出Document对象        writer.write(doc);        //3.关闭流        writer.close();

到此,写入功能完成。

再来看最初的那个需求,就是通过页面获取变量毕业年份,传入xml文件将其定义为全局变量在mapper里面使用,但是我发现,无论如何是行不通的
不管我写入的xml是变异后的classes文件夹中还是原文件中,mapper调用的常量始终是服务器启动时原文件中的值。所以说,所有的resources文件夹中的配置文件是在服务器启动的时候加载一次,之后始终不变,所以这个需求通过这个方法可能是不可行的。之后再找mybatis动态加载的方法也没有找到太好的,所以这个问题依然遗留,可能需要通过定义程序中的变量来挨个修改mapper了,体力活。
如果以后有新的发现,再来更新这篇博文。

原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 科目三老是跑偏怎么办 面试官说你不好怎么办 面试紧张心态调整不过来怎么办 面试官问缺乏经验怎么办 办好入职手续后就想辞职怎么办 新店长入职应该怎么办 刚入职怀孕了辞职店长不同意怎么办 派遣证丢了怎么办补办 出国留学回来怎么办派遣证 报到证坏了一边怎么办 江苏报到证丢了怎么办 河南报到证丢了怎么办 报到证丢失10年怎么办 退休时无派遣证怎么办 档案里没有派遣证怎么办 档案中派遣证丢失怎么办 中专毕业后想读大学该怎么办 软考准考证丢了怎么办 面试薪资要低了怎么办 应聘等通知没有电话回复怎么办 学生信息表里的籍贯不对怎么办? 小学生信息表里的籍贯不对怎么办? 钉钉下班没打卡怎么办 如果在厂里饭卡丢了怎么办 工作上做错了事想辞职怎么办 结婚辞职怀孕感觉做错了怎么办 换新手机了钉钉怎么办 公众号申请链接无效怎么办 指纹打卡机时间调错已打卡怎么办 智慧云平台先锋讲座打不开怎么办 下雨穿套裙工装好冷怎么办 国家债务违约不要国际融资怎么办 欠钱的确还不起怎么办 生完孩孑后手发账握不死手怎么办 工作调动没啥消息怎么办 裁剪刀老是推歪怎么办 衣服上粘胶水了怎么办 衣服钻掉了有胶怎么办 衣服上贴纸掉了怎么办 裤子沾上502胶水怎么办 衣服上沾泡沫胶怎么办