尝试使用Jdom

本文涉及的产品
云数据库 RDS SQL Server,独享型 2核4GB
简介:

  毫无疑问java中的DOM操作还是比较难使用,他是一个庞大的API,很难驾驭。并且在是使用的时候需要消耗更多的内存和要依赖与更高的主频。

使用的类包有:

   编写一个简单的XML文件如下:

 

 
  1. <?xml version="1.0" encoding="UTF-8"?> 
  2. <sys> 
  3.     <jdbc> 
  4.         <jdbc-driver>com.mircosoft.sql.sqlServer.SQLServerDriver</jdbc-driver> 
  5.         <jdbc-url>jdbc:sqlserver://localhost:1433;dataName="ext"</jdbc-url>  
  6.         <jdbc-user>sa</jdbc-user> 
  7.         <jdbc-password>sa</jdbc-password> 
  8.     </jdbc> 
  9.     <person nation="zh_CN"> 
  10.         <person-object id="1"> 
  11.             <person-name>Zhubajie</person-name> 
  12.             <person-age>23</person-age> 
  13.             <person-address>Xi'an</person-address> 
  14.         </person-object> 
  15.         <person-object id="2"> 
  16.             <person-name>Shasidi</person-name> 
  17.             <person-age>24</person-age> 
  18.             <person-address>Xi'an</person-address> 
  19.         </person-object> 
  20.     </person> 
  21. </sys> 

1.如果将jdbc结点中的子节点的元素封装为一个数据对象,那么java操作数据库的数据库连接就可以通过配置相应的XML文件就可实现,这样就可一不用动java源代码。

2.如果将person当作一个集合的话,那么这个集合就有两个对象。

3.如果将person当作一个父类的话,那么有两个子类继承了person,子类的描述如:

<person-object id="XX">构成

4.如果单独去看待<person-object id="XX">的话,相当于一个实体类的一个实例对象,对象的人为标识用id来表示,对象有name,age,address属性。

    通过反射机制就可以通过读取XML文件的配置信息来实例化类对象,类似与Spring中的依赖注入中当然注入对象。

下面是一个读取的实例:

采用单例模式,因为对于配置文件的读取一般都是当应用程序加载或者运行某一时刻是才使用。


 
  1. package xiao.zhang.jdom; 
  2.  
  3. import java.io.FileInputStream; 
  4. import java.io.FileNotFoundException; 
  5. import java.io.IOException; 
  6. import java.util.ArrayList; 
  7. import java.util.Iterator; 
  8. import java.util.List; 
  9.  
  10. import org.jdom.DataConversionException; 
  11. import org.jdom.Document; 
  12. import org.jdom.Element; 
  13. import org.jdom.JDOMException; 
  14. import org.jdom.input.SAXBuilder; 
  15.  
  16.  
  17. public class ReadXml { 
  18.  
  19.     /** 
  20.      * 配置文件路径 
  21.      */ 
  22.     private static String FILE_PATH = "C://jdbc-config.xml"
  23.  
  24.     /** 
  25.      * 采用单例模式,创建一个读取ReadXml实例 
  26.      *  
  27.      */ 
  28.  
  29.     private static ReadXml readXmlInstance = new ReadXml(); 
  30.  
  31.     /** 
  32.      * 文档的根元素 
  33.      */ 
  34.     private Element rootElt = null
  35.  
  36.     /** 
  37.      * 文档对象 
  38.      *  
  39.      */ 
  40.  
  41.     private Document doc = null
  42.  
  43.     /** 
  44.      * 私有的方法 
  45.      */ 
  46.     private ReadXml() { 
  47.         SAXBuilder sb = new SAXBuilder(); 
  48.         try { 
  49.             // 获取到文档对象 
  50.             this.doc = sb.build(new FileInputStream(FILE_PATH)); 
  51.             // 获取到XML文档的根 
  52.             this.rootElt = doc.getRootElement(); 
  53.         } catch (FileNotFoundException e) { 
  54.             e.printStackTrace(); 
  55.         } catch (JDOMException e) { 
  56.             e.printStackTrace(); 
  57.         } catch (IOException e) { 
  58.             e.printStackTrace(); 
  59.         } 
  60.     } 
  61.  
  62.     /** 
  63.      * 获得读取XML文件的实例 
  64.      *  
  65.      * @return 
  66.      */ 
  67.     public static ReadXml getInstance() { 
  68.         return readXmlInstance; 
  69.     } 
  70.  
  71.     /** 
  72.      *  
  73.      * 读取链接数据库的配置文件 
  74.      *  
  75.      * @return 
  76.      */ 
  77.     public JDBC getJDBC() { 
  78.         JDBC jdbc = new JDBC(); 
  79.         Element jdbcElt = this.rootElt.getChild("jdbc"); 
  80.         List<?> jdcbChildList = jdbcElt.getChildren(); 
  81.         List<String> jdbcTextTrim = new ArrayList<String>(); 
  82.         for (Iterator<?> iter = jdcbChildList.iterator(); iter.hasNext();) { 
  83.             Element elt = (Element) iter.next(); 
  84.             jdbcTextTrim.add(elt.getTextTrim()); 
  85.         } 
  86.         jdbc.setDriver(jdbcTextTrim.get(0)); 
  87.         jdbc.setUrl(jdbcTextTrim.get(1)); 
  88.         jdbc.setUser(jdbcTextTrim.get(2)); 
  89.         jdbc.setPassword(jdbcTextTrim.get(3)); 
  90.  
  91.         return jdbc; 
  92.     } 
  93.  
  94.     /** 
  95.      *  
  96.      * 根据数据库配置文件来获得数据库连接的相关信息 
  97.      *  
  98.      * @return 
  99.      */ 
  100.     public JDBC getJdbcFromConf() { 
  101.         JDBC jdbc = new JDBC(); 
  102.         Element jdbcElt = this.rootElt.getChild("jdbc"); 
  103.         jdbc.setDriver(jdbcElt.getChildText("jdbc-driver")); 
  104.         jdbc.setPassword(jdbcElt.getChildText("jdbc-password")); 
  105.         jdbc.setUrl(jdbcElt.getChildText("jdbc-url")); 
  106.         jdbc.setUser(jdbcElt.getChildText("jdbc-user")); 
  107.         return jdbc; 
  108.     } 
  109.  
  110.     public List<Person> getPersonList() { 
  111.         List<Person> personList = new ArrayList<Person>(); 
  112.         Element personElt = this.rootElt.getChild("person"); 
  113.         // 获得Person的属性nation的值 
  114.         String nation = personElt.getAttribute("nation").getValue(); 
  115.         // 获得Person节点下的所有节点元素 
  116.         List<?> personEltList = new ArrayList<Object>(); 
  117.         personEltList = personElt.getChildren(); 
  118.         Person p = null
  119.         for (Iterator<?> iter = personEltList.iterator(); iter.hasNext();) { 
  120.             p = new Person(); 
  121.             Element elt = (Element) iter.next(); 
  122.             try { 
  123.                 p.setId(elt.getAttribute("id").getIntValue()); 
  124.                 p.setName(elt.getChildTextTrim("person-name")); 
  125.                 p.setNation(nation); 
  126.                 p.setAge(Integer.parseInt(elt.getChildTextTrim("person-age"))); 
  127.                 p.setAddress(elt.getChildTextTrim("person-address")); 
  128.                 personList.add(p); 
  129.             } catch (DataConversionException e) { 
  130.                 e.printStackTrace(); 
  131.             } 
  132.         } 
  133.         return personList; 
  134.  
  135.     } 
  136.     /** 
  137.      * @return the fILE_PATH 
  138.      */ 
  139.     public static String getFILE_PATH() { 
  140.         return FILE_PATH; 
  141.     } 
  142.  
  143.     /** 
  144.      * @return the rootElt 
  145.      */ 
  146.     public Element getRootElt() { 
  147.         return this.rootElt; 
  148.     } 
  149.  
  150.     /** 
  151.      * @return the doc 
  152.      */ 
  153.     public Document getDoc() { 
  154.         return this.doc; 
  155.     } 
  156.  
  157.     /** 
  158.      * @param fILE_PATH 
  159.      *            the fILE_PATH to set 
  160.      */ 
  161.     public static void setFILE_PATH(String fILE_PATH) { 
  162.         FILE_PATH = fILE_PATH; 
  163.     } 
  164.  
  165.     /** 
  166.      * @param rootElt 
  167.      *            the rootElt to set 
  168.      */ 
  169.     public void setRootElt(Element rootElt) { 
  170.         this.rootElt = rootElt; 
  171.     } 
  172.  
  173.     /** 
  174.      * @param doc 
  175.      *            the doc to set 
  176.      */ 
  177.     public void setDoc(Document doc) { 
  178.         this.doc = doc; 
  179.     } 

测试的方法:


 
  1. public static void main(String[] args) { 
  2.         ReadXml rx = ReadXml.getInstance(); 
  3.         JDBC jdbc = null
  4.         jdbc = rx.getJdbcFromConf(); 
  5.         System.out.println("getJdbcFromConf:" + jdbc.toString()); 
  6.         jdbc = rx.getJDBC(); 
  7.         System.out.println("getJDBC:" + jdbc.toString()); 
  8.         List personList = rx.getPersonList(); 
  9.         for (Iterator iter = personList.iterator(); iter.hasNext();) { 
  10.             System.out.println(((Person) iter.next()).toString()); 
  11.         } 
  12.     } 


测试读取数据库连接的信息结果:


 
  1. getJdbcFromConf:JDBC [driver=com.mircosoft.sql.sqlServer.SQLServerDriver, url=jdbc:sqlserver://localhost:1433;dataName="ext", user=sa, password=sa] 
  2. getJDBC:JDBC [driver=com.mircosoft.sql.sqlServer.SQLServerDriver, url=jdbc:sqlserver://localhost:1433;dataName="ext", user=sa, password=sa] 

测试读取person结点的信息:


 
  1. Person [nation=zh_CN, id=1, name=Zhubajie, age=23, address=Xi'an] 
  2. Person [nation=zh_CN, id=2, name=Shasidi, age=24, address=Xi'an] 

 



本文转自 secondriver 51CTO博客,原文链接:http://blog.51cto.com/aiilive/942717,如需转载请自行联系原作者

相关实践学习
使用SQL语句管理索引
本次实验主要介绍如何在RDS-SQLServer数据库中,使用SQL语句管理索引。
SQL Server on Linux入门教程
SQL Server数据库一直只提供Windows下的版本。2016年微软宣布推出可运行在Linux系统下的SQL Server数据库,该版本目前还是早期预览版本。本课程主要介绍SQLServer On Linux的基本知识。 相关的阿里云产品:云数据库RDS&nbsp;SQL Server版 RDS SQL Server不仅拥有高可用架构和任意时间点的数据恢复功能,强力支撑各种企业应用,同时也包含了微软的License费用,减少额外支出。 了解产品详情:&nbsp;https://www.aliyun.com/product/rds/sqlserver
相关文章
|
29天前
|
安全 Java 数据库连接
java.lang.NoClassDefFoundError: org/springframework/beans/factory/config/YamlProcessor$StrictMapAppe
java.lang.NoClassDefFoundError: org/springframework/beans/factory/config/YamlProcessor$StrictMapAppe
14 0
|
1月前
|
SpringCloudAlibaba Java Maven
【问题篇】Caused by: java.lang.NoClassDefFoundError: org/springframework/boot/context/properties/
【问题篇】Caused by: java.lang.NoClassDefFoundError: org/springframework/boot/context/properties/
13 2
|
4月前
|
Java
Junit4.12报错:java.lang.NoClassDefFoundError: org/hamcrest/SelfDescribing
Junit4.12报错:java.lang.NoClassDefFoundError: org/hamcrest/SelfDescribing
|
8月前
|
easyexcel Java API
POI及EasyExcel【Java提高】
POI及EasyExcel【Java提高】
283 0
|
Java Spring
java.lang.NoSuchMethodError: org.springframework.boot.builder.SpringApplicationBuilder 问题
java.lang.NoSuchMethodError: org.springframework.boot.builder.SpringApplicationBuilder 问题
157 0
java.lang.NoSuchMethodError: org.springframework.boot.builder.SpringApplicationBuilder 问题
|
XML JavaScript Java
|
JavaScript Java 数据格式
|
XML Java 数据格式
|
XML Java 数据格式