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