使用XML文件連接MySQL數據庫,database.conf.XML文件如下:
<database-conf>
<datasource>
<driver>com.MySQL.jdbc.Driver</driver>
<url>jdbc:MySQL://127.0.0.1:3306/J2EE14</url>
<user>bn</user>
<passWord>bn</passWord>
</datasource>
</database-conf>
新建一個Handler,用來解析該XML配置(ConfigParser.Java) :
package com.J2EE14.ch4;
import org.XML.sax.Attributes;
import org.XML.sax.helpers.DefaultHandler;
import org.XML.sax.SAXException;
import Java.util.PropertIEs;
/**
*ConfigParser擴展了DefaultHandler,它用於獲得數據庫的連接屬性
*/
public class ConfigParser extends DefaultHandler
{
//定義一個PropertIEs 用來存放屬性值
private PropertIEs props;
private String currentName;
private StringBuffer currentValue =new StringBuffer();
//構建器初始化props
public ConfigParser()
{
this.props=new PropertIEs();
}
public PropertIEs getProps()
{
return this.props;
}
//定義開始解析元素的方法. 這裡是將<xxx>中的名稱xxx提取出來
public void startElement(String uri,String localName,String qName,Attributes attributes)throws SAXException
{
currentValue.delete(0,currentValue.length());
this.currentName=qName;
}
//這裡是將<xxx></xxx>之間的值加入到currentValue
public void characters(char[] ch, int start, int length) throws SAXException {
currentValue.append(ch, start, length);
}
/**
*把XML配置文件的中相關的屬性保存到PropertIEs對象中
*/
public void endElement(String uri,String localName,String qName)throws SAXException
{
props.put(qName.toLowerCase(),currentValue.toString().trim());
}
}
用來解析XML的類,其他程序通過這個類來獲得數據庫的連接屬性(ParseDatabaseConfig
.Java):
package com.J2EE14.ch4;
import Java.util.PropertIEs;
import Javax.XML.parsers.SAXParser;
import Javax.XML.parsers.SAXParserFactory;
/**
*其它程序通過ParseDatabaseConfig來獲得數據庫的配置信息,
*這樣使得類之間的耦合松散
*/
public class ParseDatabaseConfig
{
//定義一個PropertIEs 用來存放屬性值
private PropertIEs props;
public PropertIEs getProps()
{
return this.props;
}
/**
*解析XML配置文件,把屬性保存起來
*/
public void parse(String filename)throws Exception
{
//將我們的解析器對象化
ConfigParser handler=new ConfigParser();
//獲取SAX工廠對象
SAXParserFactory factory=SAXParserFactory.newInstance();
factory.setNamespaceAware(false);
factory.setValidating(false);
//獲取SAX解析
SAXParser parser=factory.newSAXParser();
try
{
//將解析器和解析對象XML聯系起來,開始解析
parser.parse(filename,handler);
//獲取解析成功後的屬性
props=handler.getProps();
}
finally
{
factory=null;
parser=null;
handler=null;
}
}
}
最後是一個數據庫應用(MyDatabaseApplication
.Java):
package com.J2EE14.ch4;
import Java.util.PropertIEs;
import Java.sql.*;
/**
*MyDatabaseApplication是一個示例應用,它通過ParseDatabaseConfig
*來獲得數據庫的連接屬性以連接數據庫
*/
public class MyDatabaseApplication
{
private Connection con;
PropertIEs dbProps;
/**
*構造方法,獲得數據庫的連接屬性
*/
public MyDatabaseApplication()throws Exception
{
ParseDatabaseConfig databaseConfig=new ParseDatabaseConfig();
databaseConfig.parse("database.conf.XML");
this.dbProps=databaseConfig.getProps();
}
public Connection getConnection()throws Java.sql.SQLException
{
try
{
Class.forName(dbProps.getProperty("driver"));
}
catch(Java.lang.ClassNotFoundException e)
{
System.err.println("Not Found Driver:"+dbProps.getProperty("driver"));
}
//使用配置的屬性創建一個連接。
return Java.sql.DriverManager.getConnection(
dbProps.getProperty("url"),
dbProps.getProperty("user"),
dbProps.getProperty("passWord"));
}
/**
*測試方法
*/
public void doBusiness()
{
try
{
con=getConnection();
Statement stmt=con.createStatement();
System.out.println("創建一個表...");
stmt.execute("create table testconfig(id int not null,name varchar(20),constraint pk_testconfig primary key(id))");
System.out.println("在表中添加數據...");
stmt.execute("insert into testconfig values('001','hellking')");
ResultSet rst=stmt.executeQuery("select * from testconfig");
System.out.println("讀取表中的數據...");
while(rst.next())
{
System.out.println("id:"+rst.getInt("id"));
System.out.println("name:"+rst.getString("name"));
}
rst.close();
stmt.execute("drop table testconfig");
con.close();
}
catch(Java.sql.SQLException se)
{
System.err.println("連接數據庫或者操作發生錯誤");
se.printStackTrace(System.err);
}
finally
{
try
{
con.close();
}
catch(Exception e){}
}
}
public static void main(String[] args)
{
System.out.println("使用XML作為數據庫的配置。\n");
try
{
MyDatabaseApplication app=new MyDatabaseApplication();
app.doBusiness();
}
catch(Exception e)
{
System.err.println("發生異常");
}
}
}