博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
java 加载sql xml文件_mybatis热部署加载*Mapper.xml文件
阅读量:6620 次
发布时间:2019-06-25

本文共 4170 字,大约阅读时间需要 13 分钟。

package com.pingpeng.misp.common;

import java.io.IOException;

import java.lang.reflect.Field;

import java.util.HashMap;

import java.util.Map;

import java.util.Set;

import org.apache.commons.logging.Log;

import org.apache.commons.logging.LogFactory;

import org.apache.ibatis.builder.xml.XMLMapperBuilder;

import org.apache.ibatis.session.Configuration;

import org.apache.ibatis.session.SqlSessionFactory;

import org.springframework.core.io.Resource;

import org.springframework.core.io.support.PathMatchingResourcePatternResolver;

public class SqlSessionCache {

private Log log  = LogFactory.getLog(SqlSessionCache.class);

private SqlSessionFactory sqlSessionFactory;

private Resource[] mapperLocations;

private String packageSearchPath;

private HashMap fileMapping = new HashMap();// 记录文件是否变化

public void refreshMapper() {

try {

Configuration configuration = this.sqlSessionFactory.getConfiguration();

// step.1 扫描文件

try {

this.scanMapperXml();

} catch (IOException e) {

log.error("packageSearchPath扫描包路径配置错误");

return;

}

System.out.println("==============刷新前mapper中的内容===============");

for (String name : configuration.getMappedStatementNames()) {

System.out.println(name);

}

// step.2 判断是否有文件发生了变化

if (this.isChanged()) {

// step.2.1 清理

this.removeConfig(configuration);

// step.2.2 重新加载

for (Resource configLocation : mapperLocations) {

try {

XMLMapperBuilder xmlMapperBuilder = new XMLMapperBuilder(configLocation.getInputStream(), configuration, configLocation.toString(), configuration.getSqlFragments());

xmlMapperBuilder.parse();

log.info("mapper文件[" + configLocation.getFilename() + "]缓存加载成功");

} catch (IOException e) {

log.error("mapper文件[" + configLocation.getFilename() + "]不存在或内容格式不对");

continue;

}

}

}

System.out.println("==============刷新后mapper中的内容===============");

for (String name : configuration.getMappedStatementNames()) {

System.out.println(name);

}

} catch (Exception e) {

e.printStackTrace();

}

}

public void setPackageSearchPath(String packageSearchPath) {

this.packageSearchPath = packageSearchPath;

}

public void setSqlSessionFactory(SqlSessionFactory sqlSessionFactory) {

this.sqlSessionFactory = sqlSessionFactory;

}

/**

* 扫描xml文件所在的路径

* @throws IOException

*/

private void scanMapperXml() throws IOException {

this.mapperLocations = new PathMatchingResourcePatternResolver().getResources(packageSearchPath);

}

/**

* 清空Configuration中几个重要的缓存

* @param configuration

* @throws Exception

*/

private void removeConfig(Configuration configuration) throws Exception {

Class> classConfig = configuration.getClass();

clearMap(classConfig, configuration, "mappedStatements");

clearMap(classConfig, configuration, "caches");

clearMap(classConfig, configuration, "resultMaps");

clearMap(classConfig, configuration, "parameterMaps");

clearMap(classConfig, configuration, "keyGenerators");

clearMap(classConfig, configuration, "sqlFragments");

clearSet(classConfig, configuration, "loadedResources");

}

@SuppressWarnings("rawtypes")

private void clearMap(Class> classConfig, Configuration configuration, String fieldName) throws Exception {

Field field = classConfig.getDeclaredField(fieldName);

field.setAccessible(true);

Map mapConfig = (Map) field.get(configuration);

mapConfig.clear();

}

@SuppressWarnings("rawtypes")

private void clearSet(Class> classConfig, Configuration configuration, String fieldName) throws Exception {

Field field = classConfig.getDeclaredField(fieldName);

field.setAccessible(true);

Set setConfig = (Set) field.get(configuration);

setConfig.clear();

}

/**

* 判断文件是否发生了变化

* @param resource

* @return

* @throws IOException

*/

private boolean isChanged() throws IOException {

boolean flag = false;

for (Resource resource : mapperLocations) {

String resourceName = resource.getFilename();

boolean addFlag = !fileMapping.containsKey(resourceName);// 此为新增标识

// 修改文件:判断文件内容是否有变化

Long compareFrame = fileMapping.get(resourceName);

long lastFrame = resource.contentLength() + resource.lastModified();

boolean modifyFlag = null != compareFrame && compareFrame.longValue() != lastFrame;// 此为修改标识

// 新增或是修改时,存储文件

if(addFlag || modifyFlag) {

fileMapping.put(resourceName, Long.valueOf(lastFrame));// 文件内容帧值

flag = true;

}

}

return flag;

}

}

转载地址:http://dfcpo.baihongyu.com/

你可能感兴趣的文章
xsi:schemaLocation详解
查看>>
Perl如何读写文件
查看>>
我的友情链接
查看>>
Hadoop源代码分析(四零)
查看>>
系统还原后无法打开资源管理器解决方法
查看>>
20个开源项目托管站点推荐
查看>>
windows系统启动缓慢解决办法
查看>>
蝙蝠侠最新截图----光影的典型例证
查看>>
PHP的FOREACH作用域笔记
查看>>
Linux中的内存管理
查看>>
20121227-----------广源B---------RIP协议V1编写动态路由---标题要长才有人注意
查看>>
python中针对序列A是否包含序列B的各种处理
查看>>
SNMP4J与ObjectSNMP对比分析之我见
查看>>
门面模式(Facade Pattern )
查看>>
【转】msysgit简单使用教程
查看>>
Virtualbox虚拟机安装 CentOS 5.3 DVD 版
查看>>
sql命令(二)-数据类型与操作数据表
查看>>
Java无死角测试
查看>>
Bazel教程:构建iOS应用[翻译]
查看>>
jQuery的deferred对象学习笔记
查看>>