修改了mybatis的xml中的sql不重启服务器如何动态加载更新
目录
一、背景
二、注意
三、代码
四、使用示例
五、其他参考博客
一、背景
开发一个报表功能,好几百行sql,每次修改完想自测下都要重启服务器,启动一次服务器就要3分钟,重启10次就要半小时,耗不起时间呀。于是在网上找半天,没发现能直接用的, 最后还是乖乖用了自己的业余时间,参考了网上内容写了个合适自己的类。
二、注意
1.本类在mybatis-plus-boot-starter 3.4.0, mybatis3.5.5下有效,其他版本没试过
2.部分idea版本修改了xml中的sql后,并不会直接写入到硬盘中,而是保留在内存中,需要手动ctrl+s或者切换到其他窗口才能触发写入新内容到硬盘,所以使用本类时要确认你修改的sql确实已经保存进硬盘里了
3.xml所在文件夹的绝对位置,需要你修改下,再使用本类
三、代码
用一个类就能实现开发阶段sql热更新
这个类可以配置启动一个线程,每10秒重新加载最近有修改过的sql
也可以调用一下接口重新修改过的sql
代码如下:
package com.gree; import com.baomidou.mybatisplus.core.MybatisMapperRegistry; import org.apache.ibatis.builder.xml.XMLMapperBuilder; import org.apache.ibatis.builder.xml.XMLMapperEntityResolver; import org.apache.ibatis.executor.ErrorContext; import org.apache.ibatis.executor.keygen.SelectKeyGenerator; import org.apache.ibatis.io.Resources; import org.apache.ibatis.logging.Log; import org.apache.ibatis.logging.LogFactory; import org.apache.ibatis.mapping.MappedStatement; import org.apache.ibatis.parsing.XNode; import org.apache.ibatis.parsing.XPathParser; import org.apache.ibatis.session.Configuration; import org.apache.ibatis.session.SqlSessionFactory; import org.springframework.core.io.FileSystemResource; import org.springframework.core.io.Resource; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; import java.io.File; import java.io.IOException; import java.lang.reflect.Field; import java.util.*; /** * 本类用于热部署mybatis xml中修改的sql * 注意: * 1.本类在mybatis-plus-boot-starter 3.4.0 和 mybatis3.5.5 下有效,其他版本没试过 * 2.部分idea版本修改了xml中的sql后,并不会直接写入到硬盘中,而是保留在内存中,需要手动ctrl+s或者切换到其他窗口才能触发写入新内容到硬盘,所以使用本类时要确认你修改的sql确实已经保存进硬盘里了 * 3.xml所在文件夹的绝对位置,需要你修改下,再使用本类 */ @RestController public class MybatisMapperRefresh { //xml所在文件夹的绝对位置(这里改成你的位置) private String mapperPath = "D:\\wjh\\Mome\\openGitCode\\mybatisRefreshDemo\\src\\main\\resources\\mapper"; //是否需要启动一个线程,每隔一段时间就刷新下 private boolean needStartThread = false; //刷新间隔时间(秒) private int sleepSeconds = 10; //项目启动时间(或加载本class的时间) private long startTime = new Date().getTime(); //上次执行更新xml的时间 private long lasteUpdateTime = 0; private static final Log logger = LogFactory.getLog(MybatisMapperRefresh.class); private SqlSessionFactory sqlSessionFactory; private Configuration configuration; /** * 构造函数,由spring调用生成bean * @param sqlSessionFactory */ public MybatisMapperRefresh( SqlSessionFactory sqlSessionFactory ) { this.sqlSessionFactory = sqlSessionFactory; this.configuration = sqlSessionFactory.getConfiguration(); if (needStartThread) { this.startThread(); } } /** * 调用这个接口刷新你的sql,接口会返回刷新了哪些xml * @return */ @RequestMapping("/sql/refresh") public List refreshMapper() { List refreshedList = new ArrayList(); try { refreshedList = refreshDir(); } catch (Exception e) { e.printStackTrace(); } return refreshedList; } /** * 启动一个线程,每间隔一段时间就更新下xml中的sql */ public void startThread() { new Thread(new Runnable() { @Override public void run() { while (true) { logger.warn("线程循环中!"); try { refreshDir(); } catch (Exception e) { e.printStackTrace(); } try { Thread.sleep(sleepSeconds * 1000); } catch (Exception e) { e.printStackTrace(); } } } }, "mybatis-plus MapperRefresh").start(); } /** * 刷新指定目录下所有xml文件 * * @throws Exception */ private List refreshDir() throws Exception { List refreshedList = new ArrayList(); try { //获取指定目录下,修改时间大于上次刷新时间,并且修改时间大于项目启动时间的xml List fileList = FileUtil.getAllFiles(mapperPath); ArrayList needUpdateFiles = new ArrayList(); for (File file : fileList) { long lastModified = file.lastModified(); if (file.isFile() && startTime
文章版权声明:除非注明,否则均为主机测评原创文章,转载或复制请以超链接形式并注明出处。