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日

相关文章

  • 使用JAXBContext 设置xml节点属性

    使用JAXBContext设置XML节点属性的完整攻略如下: 1. 定义Java类 首先需要定义一个Java类来表示XML文件中的节点。比如我们定义一个名为”Person”的类来表示XML中的person节点。代码如下: @XmlRootElement(name = "person") @XmlAccessorType(XmlAccess…

    html 2023年5月30日
    00
  • android读写中文如何避免乱码详解

    当在Android中读写中文时,为避免乱码问题,有以下两种方法可以实现: 指定字符集编码方式 在Android中读写中文时,最好指定字符集编码方式,以避免出现乱码问题。常见的字符集编码方式包括UTF-8、GBK、GB2312等,可以根据自己的需求选择合适的编码方式。具体实现可以参考以下示例: String content = "这是要写入的中文内容…

    html 2023年5月31日
    00
  • C++实现读写ini配置文件的示例代码

    首先,INI文件是一种非常常见的配置文件格式,它用于存储应用程序的配置信息。在C++中,使用WinAPI中的GetPrivateProfileString和WritePrivateProfileString函数可以方便地读取和写入INI文件。 下面是使用C++实现读写INI配置文件的示例代码和详细攻略: 读取INI配置文件 第一步:包含相关头文件 #incl…

    html 2023年5月30日
    00
  • 热血传奇道士骨龙获取攻略

    以下是“热血传奇道士骨龙获取攻略”的完整攻略: 热血传奇道士骨龙获取攻略 骨龙是热血传奇中的一种BOSS,它是道士职业的专属BOSS。骨龙的攻击力和防御力都非常高,是一种非常强大的BOSS。下面是热血传奇道士骨龙获取攻略。 准备工作 在挑战骨龙之前,需要做好以下准备工作: 道士等级要求:道士等级需要达到60级以上。 道士装备要求:需要穿戴高级装备,如紫色装备…

    html 2023年5月18日
    00
  • 一文详解如何在Vue3+Vite中使用JSX

    下面我将详细讲解如何在Vue3+Vite中使用JSX。 什么是JSX? JSX是一种JavaScript的语法扩展,它允许你在JavaScript中编写类似于HTML的代码。JSX可以让我们在Vue3中更直观地编写组件的模板,与Vue2的模板语法相比,更加灵活高效。 如何在Vue3中使用JSX? 安装依赖 首先,我们需要安装@vue/babel-plugin…

    html 2023年5月30日
    00
  • Android Studio怎么解决导入项目的中文注释乱码的问题?

    下面是针对“Android Studio怎么解决导入项目的中文注释乱码的问题”的完整攻略。 确认编码格式为UTF-8 首先要确定代码和注释的编码格式是否为UTF-8,如果不是,则会导致中文注释乱码。具体步骤如下: 打开Android Studio,选择File > Settings > Editor > File Encodings。 将全…

    html 2023年5月31日
    00
  • 优酷土豆要出平板电脑了!优酷土豆平板电脑怎么样?

    以下是“优酷土豆要出平板电脑了!优酷土豆平板电脑怎么样?”的完整攻略: 优酷土豆要出平板电脑了!优酷土豆平板电脑怎么样? 优酷土豆是中国最大的视频网站之一,近日宣布将推出自己的平板电脑。以下是关于优酷土豆平板电脑的一些信息和评价,以便用户更好地了解这款产品。 优酷土豆平板电脑的特点 优酷土豆平板电脑的特点如下: 采用了最新的Android操作系统,支持多种应…

    html 2023年5月18日
    00
  • java操作xml的方法汇总及解析

    Java操作XML的方法汇总及解析 在Java中,我们可以使用多种方式来操作XML文件。下面将介绍常见的几种方式及其优缺点。 DOM方式 DOM(Document Object Model)是一种基于树形结构的XML解析方式,它将整个XML文件解析到内存中,并形成一棵树,我们可以通过访问树节点的方式来操作XML。 优点: 可以对XML进行增删改查等操作 可以…

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