Java——采用DOM4J+单例模式实现XML文件的读取

x33g5p2x  于2021-03-13 发布在 其他  
字(4.1k)|赞(0)|评价(0)|浏览(437)

大家对XML并不陌生,它是一种可扩展标记语言,常常在项目中作为配置文件被使用。XML具有高度扩展性,只要遵循一定的规则,XML的可扩展性几乎是无限的,而且这种扩展并不以结构混乱或影响基础配置为代价。项目中合理的使用配置文件可以大大提高系统的可扩展性,在不改变核心代码的情况下,只需要改变配置文件就可以实现功能变更,这样也符合编程开闭原则。

但是我们把数据或者信息写到配置文件中,其他类或者模块要怎样读取呢?这时候我们就需要用到XML API。 DOM4Jj就是一个十分优秀的JavaXML API,具有性能优异、功能强大和极其易使用的特点,下面我们就以java程序连接Oracle数据库为例,简单看一下如何使用配置文件提高程序的可扩展性以及DOM4J如何读取配置文件。

未使用配置文件的程序

  1. /*
  2. * 封装数据库常用操作
  3. */
  4. public class DbUtil {
  5. /*
  6. * 取得connection
  7. */
  8. public static Connection getConnection(){
  9. Connection conn=null;
  10. try {
  11. Class.forName("oracle.jdbc.driver.OracleDriver");
  12. String url = "jdbc:oracle:thin:@localhost:1525:bjpowernode";
  13. String username = "drp1";
  14. String password = "drp1";
  15. conn=DriverManager.getConnection(url, username, password);
  16. } catch (ClassNotFoundException e) {
  17. // TODO Auto-generated catch block
  18. e.printStackTrace();
  19. } catch (SQLException e) {
  20. // TODO Auto-generated catch block
  21. e.printStackTrace();
  22. }
  23. return conn;
  24. }
  25. }

我们可以看到上面代码中DriverName、url等信息都是都是写死在代码中的,如果数据库信息有变更的话我们必须修改DbUtil类,这样的程序扩展性极低,是不可取的。

我们可以把DriverName、url等信息保存到配置文件中,这样如果修改的话只需要修改配置文件就可以了,程序代码根本不需要修改。

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <config>
  3. <db-info>
  4. <driver-name>oracle.jdbc.driver.OracleDriver</driver-name>
  5. <url>jdbc:oracle:thin:@localhost:1525:bjpowernode</url>
  6. <user-name>drp1</user-name>
  7. <password>drp1</password>
  8. </db-info>
  9. </config>

然后我们还需要建立一个配置信息类来用来存取我们的属性值

  1. /*
  2. * jdbc配置信息
  3. */
  4. public class JdbcConfig {
  5. private String driverName;
  6. private String url;
  7. private String userName;
  8. private String password;
  9. public String getDriverName() {
  10. return driverName;
  11. }
  12. public void setDriverName(String driverName) {
  13. this.driverName = driverName;
  14. }
  15. public String getUrl() {
  16. return url;
  17. }
  18. public void setUrl(String url) {
  19. this.url = url;
  20. }
  21. public String getUserName() {
  22. return userName;
  23. }
  24. public void setUserName(String userName) {
  25. this.userName = userName;
  26. }
  27. public String getPassword() {
  28. return password;
  29. }
  30. public void setPassword(String password) {
  31. this.password = password;
  32. }
  33. @Override
  34. public String toString() {
  35. // TODO Auto-generated method stub
  36. return this.getClass().getName()+"{driverName:" + driverName + ",url:" + url + ",userName:" + userName + "}";
  37. }
  38. }

接下来就是用DOM4J读取XML信息,并把相应的属性值保存到JdbcConfig中

  1. /*
  2. * DOM4J+单例模式解析sys-config.xml文件
  3. */
  4. public class XmlConfigReader {
  5. //懒汉式(延迟加载lazy)
  6. private static XmlConfigReader instance=null;
  7. //保存jdbc相关配置信息
  8. private JdbcConfig jdbcConfig=new JdbcConfig();
  9. private XmlConfigReader(){
  10. SAXReader reader=new SAXReader();
  11. InputStream in=Thread.currentThread().getContextClassLoader().getResourceAsStream("sys-config.xml");
  12. try {
  13. Document doc=reader.read(in);
  14. //取得jdbc相关配置信息
  15. Element driverNameElt=(Element)doc.selectObject("/config/db-info/driver-name");
  16. Element urlElt=(Element)doc.selectObject("/config/db-info/url");
  17. Element userNameElt=(Element)doc.selectObject("/config/db-info/user-name");
  18. Element passwordElt=(Element)doc.selectObject("/config/db-info/password");
  19. //设置jdbc相关配置信息
  20. jdbcConfig.setDriverName(driverNameElt.getStringValue());
  21. jdbcConfig.setUrl(urlElt.getStringValue());
  22. jdbcConfig.setUserName(userNameElt.getStringValue());
  23. jdbcConfig.setPassword(passwordElt.getStringValue());
  24. } catch (DocumentException e) {
  25. // TODO Auto-generated catch block
  26. e.printStackTrace();
  27. }
  28. }
  29. public static synchronized XmlConfigReader getInstance(){
  30. if (instance==null){
  31. instance=new XmlConfigReader();
  32. }
  33. return instance;
  34. }
  35. /*
  36. * 返回jdbc相关配置
  37. */
  38. public JdbcConfig getJdbcConfig(){
  39. return jdbcConfig;
  40. }
  41. public static void main(String[] args){
  42. JdbcConfig jdbcConfig=XmlConfigReader.getInstance().getJdbcConfig();
  43. System.out.println(jdbcConfig);
  44. }
  45. }

然后我们的数据库操作类就可以使用XML文件中的属性值了

  1. /*
  2. * 封装数据库常用操作
  3. */
  4. public class DbUtil {
  5. /*
  6. * 取得connection
  7. */
  8. public static Connection getConnection(){
  9. Connection conn=null;
  10. try {
  11. JdbcConfig jdbcConfig=XmlConfigReader.getInstance().getJdbcConfig();
  12. Class.forName(jdbcConfig.getDriverName());
  13. conn=DriverManager.getConnection(jdbcConfig.getUrl(), jdbcConfig.getUserName(), jdbcConfig.getPassword());
  14. } catch (ClassNotFoundException e) {
  15. // TODO Auto-generated catch block
  16. e.printStackTrace();
  17. } catch (SQLException e) {
  18. // TODO Auto-generated catch block
  19. e.printStackTrace();
  20. }
  21. return conn;
  22. }
  23. }

现在我们可以看出来DriverName、url等信息都是通过jdbcConfig直接获得的,而jdbcConfig中的数据是通过DOM4J读取的XML,这样数据库信息有变动我们只需要通过记事本修改XML文件整个系统就可以继续运行,真正做到了程序的可扩展,以不变应万变。

相关文章