Java 语言中xml和bean之间的相互转换(Try-with-resources)

本文分享了Java对象与XML文件互相转换的实用代码,详细介绍了如何使用JAXB进行序列化和反序列化,以及如何利用try-with-resources语句简化资源管理。

       XML 指可扩展标记语言,XML 被设计用来传输和存储数据,常用的场景是数据交换和信息配置。虽然后期随着信息技术的发展在数据交换场景的地位远不如从前,但是作为信息配置工具,特别是配置信息多和配置信息复杂的场景,依然有着比较广泛的应用。
       然后闲话不多说,先上一段Java版本的xml和对象相互转换的代码。

/**
     * java对象转换为xml文件
     * @param xmlPath  xml文件路径
     * @param load    java对象.Class
     * @return    xml文件的String
     * @throws JAXBException    
     */
    public static <T> String beanToXml(Object obj,Class<T> load) throws JAXBException{
    	try {
    		JAXBContext context = JAXBContext.newInstance(load);
            Marshaller marshaller = context.createMarshaller();
            marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);
            marshaller.setProperty(Marshaller.JAXB_ENCODING, "UTF-8");
            StringWriter writer = new StringWriter();
            marshaller.marshal(obj,writer);
            return writer.toString();
       } catch (JAXBException e) {
           logger.trace(e);
           throw e;
       }
    }
    /**
     * xml文件配置转换为对象
     * @param xmlPath  xml文件路径
     * @param load    java对象.Class
     * @return    java对象
     * @throws JAXBException    
     * @throws IOException
     */
    @SuppressWarnings("unchecked")
	public static <T> T  xmlToBean(String xmlPath,Class<T>  load, Object... arguments) throws JAXBException, IOException{
       
        try (FileInputStream  xmlFile = new FileInputStream (xmlPath)){
        	 if (arguments.length > 0) {
        		xmlPath = MessageFormat.format(xmlPath, arguments);
             }
        	 logger.trace("read xmlPath=" + xmlPath);
        	 JAXBContext context = JAXBContext.newInstance(load);  
             Unmarshaller unmarshaller = context.createUnmarshaller(); 
             return (T)unmarshaller.unmarshal(xmlFile);
        } catch (JAXBException e) {
            logger.trace(e);
            throw e;
        }
    }

      XML和Java对象的转换,网络上源码案例很多,这个地方贴出来主要还是想记录一下Try-with-resources的使用。


JDK7之后,Java多了个新的语法:try-with-resources语句,可以理解为是一个声明一个或多个资源的 try语句(用分号隔开),一个资源作为一个对象,并且这个资源必须要在执行完关闭的,try-with-resources语句确保在语句执行完毕后,每个资源都被自动关闭 。任何实现了** java.lang.AutoCloseable**的对象, 包括所有实现了 java.io.Closeable 的对象, 都可以用作一个资源。

        在Java7以前,程序中使用的资源需要被明确地关闭,这个体验有点繁琐。而且这里有一个问题 ,如果文件流打开后,程序出现异常,然后finally里面关闭资源也出现了异常,那么哪个异常会根据调用栈往外传播?


         try-with-resources使用方法很简单try (FileInputStream  xmlFile = new FileInputStream (xmlPath)){}。在try关键字后面的括号中声明FileInputStream 类型变量并赋值,无需额外捕获IO异常以及关闭流。另外,对于上面提出的问题,如果try-with-resources结构中抛出一个异常,同时FileInputStreami被关闭时(调用了其close方法)也抛出一个异常,try-with-resources结构中抛出的异常会向外传播,而FileInputStreami被关闭时抛出的异常被抑制了。这样开发人员也就能更多的精力关注应用需求上了。

 

### 正确使用 `Resources.getResourceAsStream` 加载 MyBatis 配置文件 在 MyBatis 中,`Resources.getResourceAsStream` 是加载配置文件(如 `mybatis-config.xml`)的常用方法。以下是详细说明示例代码: #### 加载配置文件的核心方法 通过 `Resources.getResourceAsStream` 方法可以读取类路径下的资源文件。此方法返回一个 `InputStream` 对象,用于后续构建 `SqlSessionFactory` 实例[^2]。 #### 示例代码 以下是一个完整的示例,展示如何使用 `Resources.getResourceAsStream` 加载 `mybatis-config.xml` 文件并初始化 `SqlSessionFactory`: ```java import org.apache.ibatis.io.Resources; import org.apache.ibatis.session.SqlSessionFactory; import org.apache.ibatis.session.SqlSessionFactoryBuilder; import java.io.IOException; import java.io.InputStream; public class MyBatisConfigLoader { public static void main(String[] args) { String resource = "mybatis-config.xml"; // 指定配置文件名称 InputStream inputStream = null; try { inputStream = Resources.getResourceAsStream(resource); // 使用 Resources 加载配置文件 SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream); // 构建 SqlSessionFactory 实例 System.out.println("SqlSessionFactory 初始化成功!"); } catch (IOException e) { e.printStackTrace(); } finally { if (inputStream != null) { try { inputStream.close(); // 确保关闭 InputStream 以释放资源 } catch (IOException e) { e.printStackTrace(); } } } } } ``` #### 关键点解析 1. **配置文件路径** 确保 `mybatis-config.xml` 文件位于类路径下(通常是 `src/main/resources` 目录)。如果文件不在正确位置,`Resources.getResourceAsStream` 将无法找到该文件。 2. **异常处理** 在加载配置文件时,可能会抛出 `IOException` 异常。因此,建议使用 `try-catch` 块捕获并处理异常。 3. **资源释放** 使用完 `InputStream` 后,务必调用其 `close` 方法以释放系统资源。为避免资源泄漏,可以在 `finally` 块中关闭流[^2]。 4. **Spring 集成场景** 如果在 Spring 或 Spring Boot 环境中使用 MyBatis,通常不需要手动加载 `mybatis-config.xml` 文件。可以通过 `SqlSessionFactoryBean` 自动配置 `SqlSessionFactory`,如下所示[^1]: ```xml <bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean"> <property name="dataSource" ref="dataSource" /> <property name="mapperLocations" value="classpath:mybatis/mapper/*.xml" /> <property name="configLocation" value="classpath:mybatis/mybatis-config.xml" /> </bean> ``` #### 注意事项 - 如果使用注解方式配置 Mapper 接口,则可以省略 XML 映射文件。 - 确保 `mybatis-config.xml` 文件内容正确无误,例如数据库连接信息、Mapper 扫描路径等配置必须完整。 --- ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值