利用JDOM写一个较为灵活的JDBC工具类

本文介绍了一种利用XML配置文件和JDBC工具类来简化数据库操作的方法。通过单例设计模式和JDOM解析XML配置,使得更换数据库时只需修改配置文件,极大提升了代码复用性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

知识点:单例设计模式,利用JDOM对XML文件进行解析

JDBC编程中,对于一些常用的操作,比如获得数据库连接,关闭数据库连接,CURD操作等,通常都会封装在一个工具类中,以利于代码利用。
我们总是希望只书写一次代码就毕其功于一役。或者说当应用环境改变时只通过少量修改便
可以原封不动的使用我们的代码。下面利用三个类实现一个较为灵活的JDBC工具类。
它可以利用XML配置文件进行数据库连接常用信息的配置,在数据库版本或类型改变时只需要修改XML配置文件即可以最大限度的复用原有代码。

1.JdbcInfo类:该类实际上是一个实体bean,封装了数据库连接所需要一些信息,如驱动类,数据库密码等。
2.JdbcConfigure类:该类利用JDOM对XML配置文件进行解析,并将解析结果写入JdbcInfo实例中。用单例设计模式实现。
3.JdbcUtils类:JDBC工具类具体实现

//JdbcInfo.java
//JdbcInfo代码非常简单,只有一些set,get方法
package cn.jvfans.jdbc.utils;
public class JdbcInfo
{
    private String driverClassName="";
    private String user="";
    private String password="";
    private String url="";
    
public String getDriverClassName() {
  return driverClassName;
}
public void setDriverClassName(String driverClassName) {
  this.driverClassName = driverClassName;
}
public String getUser() {
  return user;
}
public void setUser(String user) {
  this.user = user;
}
public String getPassword() {
  return password;
}
public void setPassword(String password) {
  this.password = password;
}
public String getUrl() {
  return url;
}
public void setUrl(String url) {
  this.url = url;
}

public String toString() {//重写了toString方法,重写toString是良好的编程习惯
   return "JdbcInfo(driverClassName="+this.driverClassName
          +",user="+this.user
          +",password="+this.password
          +",url="+this.url+")";
}
}
//JdbcConfigure.java
package cn.jvfans.jdbc.utils;
//书写Java代码时,最好不要出现import *.*的形式,而要给出具体的类,利用IDE非常省事
import java.io.IOException;
import org.jdom.Document;//熟悉JDOM常用类
import org.jdom.Element;
import org.jdom.JDOMException;
import org.jdom.input.SAXBuilder;
//读取JDBC配置文件,采用单例设计模式实现
public class JdbcConfigure
{
    private static JdbcConfigure instance=null;//单例模式的模板代码
    //XML配置文件名,以常量定义
    private final static String CONFIG_FILE_NAME="jdbc-configure.xml";
    private Element rootElt=null;
    private JdbcInfo jdbcInfo=new JdbcInfo();
  
  //该方法结果可以返回给JdbcUtils类使用,实现了数据的传递
  public JdbcInfo getJdbcInfo() {
     return jdbcInfo;
   }
   private JdbcConfigure()//单例模式一定会有一个私有构造方法
   {
    SAXBuilder builder=new SAXBuilder();
     try {
      Document doc=builder.build(Thread.currentThread().getContextClassLoader().getResourceAsStream(CONFIG_FILE_NAME));
      this.rootElt=doc.getRootElement();
      initJdbcInfo();
     } catch (JDOMException e) {
   // TODO Auto-generated catch block
   e.printStackTrace();
  } catch (IOException e) {
   // TODO Auto-generated catch block
   e.printStackTrace();
  }
   }
  
   private void initJdbcInfo()//读取XML文件的核心方法,读取结果已写入JdbcInfo实例中
   {
     Element driverClassElt=rootElt.getChild("driver-class");
     jdbcInfo.setDriverClassName(driverClassElt.getText());
    
     Element userElt=rootElt.getChild("user");
     jdbcInfo.setUser(userElt.getText());
    
     Element passwordElt=rootElt.getChild("password");
     jdbcInfo.setPassword(passwordElt.getText());
    
     Element urlElt=rootElt.getChild("url");
     jdbcInfo.setUrl(urlElt.getText());
   }
  
   public static  JdbcConfigure getInstance()//单例设计模式的核心方法
   {
    if (instance==null)
    {
     instance=new JdbcConfigure();
    }
    return instance;
   }
}

//JdbcUtils.java
package cn.jvfans.jdbc.utils;
import java.sql.*;
//JDBC工具类,该类一个实例都不会产生,当然也可以用单例模式实现
public class JdbcUtils {
private static JdbcInfo jdbcInfo = JdbcConfigure.getInstance()
   .getJdbcInfo();//java代码:极尽此乃之能事
static {//静态代码块在类一加载时便执行,且在其生命周期中只执行一次
  try {
   Class.forName(jdbcInfo.getDriverClassName());//只需要注册一次,所以把它放在静态代码块内
  } catch (ClassNotFoundException e) {
   throw new  ExceptionInInitializerError(e);//抛出 ExceptionInInitializerError 表明在计算静态初始值或静态变量的初始值期间发生异常
  }
}
private JdbcUtils() {//私有构造方法,外界无法产生它的实例
  
}
public static Connection getConnection() throws SQLException {//所有方法都是静态的,通过类名调用即可
  return DriverManager.getConnection(jdbcInfo.getUrl(), jdbcInfo
    .getUser(), jdbcInfo.getPassword());
}
public static void free(ResultSet rs, Statement stmt, Connection conn) {//关闭连接,释放资源
  if (rs != null) {
   try {
    rs.close();
   } catch (SQLException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
   } finally {
    rs = null;
   }
  }
    if (stmt != null) {
   try {
    stmt.close();
   } catch (SQLException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
   } finally {
    stmt = null;
   }
  }
  if (conn != null) {
   try {
    conn.close();
   } catch (SQLException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
   } finally {
    conn = null;
   }
  }
}
  //其它方法略,可以是CURD操作,也可以是其它一些实用方法
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值