mybatis xml文件热加载实现示例详解

下面我将为您详细讲解“mybatis xml文件热加载实现示例详解”的攻略。

一、什么是mybatis xml文件热加载?

mybatis xml文件热加载是指在mybatis项目运行时,可以动态修改对应的mapper.xml文件后,自动刷新SqlSessionFactory,实现数据库操作的实时更新,而不需要重新启动应用。

二、mybatis xml文件热加载实现步骤

下面将通过两条具体的实现示例,介绍mybatis xml文件热加载的实现步骤。

示例一:使用MapperScannerConfigurer实现mybatis xml文件热加载

步骤:

  1. 在mybatis-spring配置文件中添加MapperScannerConfigurer,扫描mapper接口,如下所示:
<bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
    <property name="basePackage" value="com.example.mapper" />
    <property name="sqlSessionFactoryBeanName" value="sqlSessionFactory" />
</bean>
  1. 在applicationContext.xml配置文件中添加MapperScannerConfigurer相关依赖:
<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource">
    <property name="driverClassName" value="${jdbc.driver}" />
    <property name="url" value="${jdbc.url}" />
    <property name="username" value="${jdbc.username}" />
    <property name="password" value="${jdbc.password}" />
</bean>

<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
    <property name="dataSource" ref="dataSource" />
    <property name="configLocation" value="classpath:mybatis-config.xml" />
    <property name="mapperLocations" value="classpath*:mapper/*.xml" />
</bean>

<bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
    <property name="basePackage" value="com.example.mapper" />
    <property name="sqlSessionFactoryBeanName" value="sqlSessionFactory" />
</bean>  
  1. 在mapper中添加代码实现xml热加载
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.DependsOn;
import org.springframework.core.io.Resource;
import org.springframework.core.io.support.PathMatchingResourcePatternResolver;
import org.springframework.core.io.support.ResourcePatternResolver;
import org.springframework.stereotype.Component;

import javax.annotation.PostConstruct;
import javax.sql.DataSource;
import java.io.IOException;
import java.io.InputStream;
import java.util.List;

@Configuration
@Component
@DependsOn("sqlSessionFactory")
public class ReloadMapperXmlConfiguration{

    private final SqlSessionFactory sqlSessionFactory;
    private final DataSource dataSource;

    @Autowired
    public ReloadMapperXmlConfiguration(@Qualifier("sqlSessionFactory") SqlSessionFactory sqlSessionFactory,
                                       @Qualifier("dataSource") DataSource dataSource) {
        this.sqlSessionFactory = sqlSessionFactory;
        this.dataSource = dataSource;
    }

    @PostConstruct
    public void initMapperXmlReload() throws IOException {
        ResourcePatternResolver resolver = new PathMatchingResourcePatternResolver();
        List<Resource> resources = TreeToList.tolist(resolver.getResources("classpath*:mapper/*.xml"));
        MapperXmlReload.reload(resources, dataSource, sqlSessionFactory);
    }
}
  1. 添加相关依赖包:
<!--mybatis-->
<dependency>
    <groupId>org.mybatis</groupId>
    <artifactId>mybatis-spring</artifactId>
    <version>2.0.4</version>
</dependency>
<!--commons-dbcp-->
<dependency>
    <groupId>commons-dbcp</groupId>
    <artifactId>commons-dbcp</artifactId>
    <version>1.4</version>
</dependency>
  1. 启动项目,修改Mapper.xml文件,保存并刷新浏览器,查看效果。

示例二:使用MapperFactoryBean实现mybatis xml文件热加载

步骤:

  1. 创建MapperFactoryBean类,用于热加载mybatis.xml文件:
public class HotSwapMapperFactoryBean<T> extends MapperFactoryBean<T> {

    private static final ResourcePatternResolver resourceResolver = new PathMatchingResourcePatternResolver();
    private final String mapperLocation;
    private SqlSessionFactory sqlSessionFactory;

    public HotSwapMapperFactoryBean(Class<T> mapperInterface, String mapperLocation) {
        super(mapperInterface);
        this.mapperLocation = mapperLocation;
    }

    @Override
    public void setSqlSessionFactory(SqlSessionFactory sqlSessionFactory) {
        super.setSqlSessionFactory(sqlSessionFactory);
        this.sqlSessionFactory = sqlSessionFactory;
        try {
            this.hotSwapReload();
        } catch (IOException e) {
            logger.error("IOException occurred.", e);
        }
    }

    public void hotSwapReload() throws IOException {
        Resource[] resources = resourceResolver.getResources(mapperLocation);
        HotSwapMapperXML hotSwapMapperXML = new HotSwapMapperXML();
        for (Resource r : resources) {
            hotSwapMapperXML.hotSwap(r.getInputStream(), sqlSessionFactory.getConfiguration());
        }
    }
}
  1. 创建自定义的MapperScannerConfigurer类,用于扫描Mapper接口:
public class HotSwapMapperScannerConfigurer extends MapperScannerConfigurer {

    private final String mapperLocation;

    public HotSwapMapperScannerConfigurer(String mapperLocation) {
        this.mapperLocation = mapperLocation;
    }

    @Override
    public void setSqlSessionFactory(SqlSessionFactory sqlSessionFactory) {
        super.setSqlSessionFactory(sqlSessionFactory);
        try {
            this.hotSwapReload();
        } catch (IOException e) {
            logger.error("IOException occurred.", e);
        }
    }

    public void hotSwapReload() throws IOException {
        ResourcePatternResolver resourceResolver = new PathMatchingResourcePatternResolver();
        Resource[] resources = resourceResolver.getResources(mapperLocation);
        HotSwapMapperXML hotSwapMapperXML = new HotSwapMapperXML();
        for (Resource r : resources) {
            hotSwapMapperXML.hotSwap(r.getInputStream(), getSqlSessionFactory().getConfiguration());
        }
    }
}
  1. 创建HotSwapMapperXML类,用于执行热加载:
public class HotSwapMapperXML {

    private static final XPathFactory xPathFactory = XPathFactory.newInstance();
    private static final TransformerFactory TRANSFORMER_FACTORY = TransformerFactory.newInstance();


    public void hotSwap(InputStream inputStream, Configuration configuration) throws IOException {
        try {
            DocumentBuilderFactory builderFactory = DocumentBuilderFactory.newInstance();
            DocumentBuilder builder = builderFactory.newDocumentBuilder();
            Document document = builder.parse(inputStream);

            XPath xPath = xPathFactory.newXPath();
            XPathExpression selectNodes = xPath.compile("//mapper");
            NodeList nodes = (NodeList) selectNodes.evaluate(document, XPathConstants.NODESET);

            for (int i = 0; i < nodes.getLength(); i++) {
                Node node = nodes.item(i);
                NamedNodeMap namedNodeMap = node.getAttributes();
                Node resourceNode = namedNodeMap.getNamedItem("resource");
                if (resourceNode != null) {
                    String resource = resourceNode.getNodeValue();
                    ResourcePatternResolver resolever = new PathMatchingResourcePatternResolver();
                    Resource[] resources = resolever.getResources(resource);
                    for (Resource mapperLocation : resources) {
                        InputStream resourceInputStream = mapperLocation.getInputStream();
                        try {
                            SQLMapperBuilder mapperBuilder = new XMLMapperBuilder(resourceInputStream, configuration, mapperLocation.toString(), configuration.getSqlFragments());
                            mapperBuilder.parse();
                        } finally {
                            resourceInputStream.close();
                        }
                    }
                    continue;
                }
                // ...
            }
        } catch (ParserConfigurationException | IOException | XPathExpressionException | SAXException e) {
            throw new IOException("Failed to parse mapping resource.", e);
        }
    }
}
  1. 在Mybatis XML配置文件中配置bean:
<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
    <property name="dataSource" ref="dataSource" />
    <property name="configLocation" value="classpath:mybatis-config.xml" />
    <property name="mapperLocations" value="classpath*:mapper/*.xml" />
</bean>

<bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
    <property name="basePackage" value="com.example.mapper" />
    <property name="sqlSessionFactoryBeanName" value="sqlSessionFactory" />
</bean>

<bean class="com.example.mapper.HotSwapMapperScannerConfigurer">
    <constructor-arg value="classpath*:mapper/*.xml" />
    <property name="sqlSessionFactoryBeanName" value="sqlSessionFactory"></property>
</bean>
  1. 启动项目,修改Mapper.xml文件,保存并刷新浏览器,查看效果。

三、总结

通过上述两条示例,我们可以实现mybatis xml文件的热加载操作,并且无需重新启动应用程序,只需要修改对应的xml文件即可实时更新数据库操作。可以大大提高开发效率。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:mybatis xml文件热加载实现示例详解 - Python技术站

(0)
上一篇 2023年5月30日
下一篇 2023年5月30日

相关文章

  • springboot 中文件上传下载实例代码

    关于“springboot 中文件上传下载实例代码”,我们可以从以下几个方面进行介绍和实例演示: 一、上传文件实例代码 1.1 添加依赖 在 pom.xml 文件中添加如下依赖: <dependency> <groupId>org.springframework.boot</groupId> <artifactId&…

    html 2023年5月31日
    00
  • C#对象与XMl文件之间的相互转换

    下面我为您提供“C#对象与XML文件之间的相互转换”的完整攻略。 1. 将C#对象转换为XML文件 我们可以通过使用C#中的XML序列化来将C#对象转换成XML文件。具体来说,以下是该过程的主要步骤: 1.1 定义需要序列化的类 在将对象转换为XML文件之前,您需要在C#中定义需要进行序列化的类。例如,我们定义一个名为“Person”的类,代码如下所示: […

    html 2023年5月31日
    00
  • bin文件怎么打开查看?路由器备份出来的bin文件读取方法图解

    以下是关于如何打开和查看bin文件的攻略: bin文件怎么打开查看? bin文件是一种二进制文件,通常用于存储程序或数据。如果您需要查看bin文件的内容,可以按照以下步骤操作: 下载Hex编辑器:首先,您需要下载一个Hex编辑器,例如WinHex、HxD等。 打开Hex编辑器:安装完成Hex编辑器后,打开它。 打开bin文件:在Hex编辑器中,选择“文件”-…

    html 2023年5月17日
    00
  • JSP语法Page指令

    JSP语法中Page指令用于定义JSP页面的一些特殊属性。 Page指令语法 Page指令必须包含在JSP页面的第一行,其语法格式如下: <%@ page 属性名1="属性值1" 属性名2="属性值2" … %> Page指令的属性值必须用双引号括起来,多个属性以逗号分隔,可以换行书写,但不要在属性值之…

    html 2023年5月30日
    00
  • XML基本概念XPath、XSLT与XQuery函数介绍

    XML是一种可扩展标记语言,常被用来传输和存储数据。XPath、XSLT和XQuery是XML的三种常用技术,用于处理、转换、查询XML数据。下面将详细讲解相关的基本概念和函数。 XPath基本概念 XPath是一种用于在XML文档中找到信息的语言。它可以用来定位XML文档中的任何元素或属性。XPath使用路径表达式来选取XML文档中的节点或节点集。例如,/…

    html 2023年5月30日
    00
  • iframe标签用法详解(属性、透明、自适应高度)

    本文将详细讲解iframe标签的用法,包括其属性、如何设置透明度、如何实现自适应高度等。下面我们将逐一介绍。 1. iframe标签的基本用法 iframe(内联框架)是HTML中的一种标签,用于在网页中嵌入其他网页或文档。使用iframe可以在页面中嵌套显示其他页面的内容,实现网页的框架分割、拉取外部数据等功能。 以下是iframe标签的基本语法: &lt…

    html 2023年5月30日
    00
  • 深入XPath的详解以及Java示例代码分析

    深入XPath的详解以及Java示例代码分析 什么是XPath? XPath(XML路径语言)是XML文档的查询语言,可以用来在XML中定位和选择数据。XPath通过路径表达式来选取XML文档中的节点或节点集,这些路径表达式类似于在文件系统中的目录路径。XPath是一种非常强大的查询语言,可以快速高效地从海量的XML文档中查找所需的信息。 XPath的基本数…

    html 2023年5月30日
    00
  • PHP解决URL中文GBK乱码问题的两种方法

    下面是详细讲解“PHP解决URL中文GBK乱码问题的两种方法”的完整攻略。 问题背景 在使用PHP开发Web应用过程中,经常会遇到URL中含有中文字符导致GBK乱码的问题。这种问题会影响网站的用户体验,所以需要解决。 方法一:采用urlencode和urldecode urlencode和urldecode分别用于将字符串编码为可在URL中传输的形式,以及将…

    html 2023年5月31日
    00
合作推广
合作推广
分享本页
返回顶部