知识点:单例设计模式,利用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操作,也可以是其它一些实用方法
}
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操作,也可以是其它一些实用方法
}