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

项目中,学姐提出了一个需求,想在网站登录时可以选择一个年份,项目中所有的数据都有这个年份的筛选,于是便想到挨个修改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了,体力活。
如果以后有新的发现,再来更新这篇博文。

  • 4
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
MyBatis是一个开源的持久层框架,它可以帮助开发者简化数据库操作的编写。而Log4j是一个Java日志框架,可以用于记录应用程序的日志信息。在MyBatis使用Log4j可以方便地记录SQL语句的执行情况以及其他相关信息。 要在MyBatis使用Log4j,首先需要在项目中引入Log4j的相关依赖。可以通过在项目的pom.xml文件中添加以下依赖来引入Log4j: ```xml <dependency> <groupId>log4j</groupId> <artifactId>log4j</artifactId> <version>1.2.17</version> </dependency> ``` 引入依赖后,需要在项目的配置文件中配置Log4j的相关信息。可以创建一个名为log4j.properties的文件,并在其中配置日志输出的格式、级别等信息。以下是一个简单的log4j.properties配置示例: ```properties # 设置日志输出级别为DEBUG log4j.rootLogger=DEBUG, stdout # 配置输出到控制台 log4j.appender.stdout=org.apache.log4j.ConsoleAppender log4j.appender.stdout.layout=org.apache.log4j.PatternLayout log4j.appender.stdout.layout.ConversionPattern=%d [%t] %-5p %c - %m%n ``` 配置完成后,可以在MyBatis的配置文件中指定使用Log4j作为日志输出工具。在mybatis-config.xml文件中添加以下配置: ```xml <configuration> <!-- 其他配置 --> <!-- 配置使用Log4j作为日志输出工具 --> <settings> <setting name="logImpl" value="LOG4J"/> </settings> <!-- 其他配置</configuration> ``` 配置完成后,MyBatis会将SQL语句的执行情况以及其他相关信息输出到Log4j的日志文件中。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值