JAVA中如何通过XML来配置数据库的连接参数? 感觉应该差不多吧...你也应该在事先在XML文档中写好连接数据库所使用的参数..然后在应用程序中通过DOM/JDOM/SAX等读取XML文档中的数据来连接数据库 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 想法是好的,在SPRING框架中可以很好的实现 好了.我解决了~~真TNND是个麻烦的问题...从网上找了一堆不完整的代码,东拼西凑.总算完成了我的想法...稍后我把总结出来的经验和源代码贴上来...这可真TNND是个麻烦东西.... 将数据库链接的那些参数写入固定格式的XML文件,然后运行程序时候读XML,后台拼接字符串我做过一个类似的,至少是可行的import javax.servlet.*;import javax.servlet.http.*;import java.io.*;import java.util.*;import javax.xml.parsers.*;import javax.xml.transform.*;import org.w3c.dom.*;import org.xml.sax.*;import javax.xml.transform.dom.DOMSource;import javax.xml.transform.stream.StreamResult;public class CreateXMLForEnterServelet extends HttpServlet { private static final String CONTENT_TYPE = "text/html; charset=GBK"; //Initialize global variables public void init() throws ServletException { } //Process the HTTP Get request public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { response.setContentType(CONTENT_TYPE); PrintWriter out = response.getWriter(); //获取传递过来的值 String databaseType = request.getParameter("select"); String userName = request.getParameter("userName"); String userPassword = request.getParameter("userPassword"); String dbName = request.getParameter("dbName"); String dbSouse = request.getParameter("dbSouces"); int port = Integer.parseInt(request.getParameter("portNum")); Document doc; Element root; try { DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance(); DocumentBuilder db = dbf.newDocumentBuilder(); String path = request.getRealPath("/"); File file = new File( path + "/" + "DBInfo.xml"); if(!file.exists()) { doc = db.newDocument(); root = doc.createElement("DBInfo"); doc.appendChild(root); } else { doc = db.parse(file); root = doc.getDocumentElement(); } //添加子节点 Element rowNode = doc.createElement(databaseType); root.appendChild(rowNode); Node node = doc.createElement("Driver"); Node nodestr = doc.createElement("ConnectString"); Node serverName = doc.createElement("ServerName"); Node nodeName = doc.createElement("UserName"); Node nodePWD = doc.createElement("PassWord"); Node nodePort = doc.createElement("Port"); Node nodeDB = doc.createElement("DataBase"); rowNode.appendChild(node); rowNode.appendChild(nodestr); rowNode.appendChild(serverName); rowNode.appendChild(nodeDB); rowNode.appendChild(nodeName); rowNode.appendChild(nodePWD); rowNode.appendChild(nodePort); String nodeValue;//Driver String nodeConStr;//连接字符串 if(databaseType.equals("ORACLE")) { nodeValue = "oracle.jdbc.driver.OracleDriver"; nodeConStr = "jdbc:oracle:thin"; } else { nodeValue = "com.microsoft.jdbc.sqlserver.SQLServerDriver"; nodeConStr = "jdbc:microsoft:sqlserver"; } Text text = doc.createTextNode(nodeValue); Text textstr = doc.createTextNode(nodeConStr); Text textName = doc.createTextNode(userName); Text textPWD = doc.createTextNode(userPassword); Text textServer = doc.createTextNode(dbName); Text textPort = doc.createTextNode(String.valueOf(port)); Text textDB = doc.createTextNode(dbSouse); node.appendChild(text); nodestr.appendChild(textstr); nodeName.appendChild(textName); nodePWD.appendChild(textPWD); serverName.appendChild(textServer); nodePort.appendChild(textPort); nodeDB.appendChild(textDB); DOMSource doms = new DOMSource(doc); StreamResult sr = null; TransformerFactory tff = TransformerFactory.newInstance(); Transformer tf = tff.newTransformer(); sr = new StreamResult(file); tf.transform(doms,sr); out.println("<h1>Create XMLFile Is Ok!!</h1>"); request.getRequestDispatcher("index.jsp").forward(request,response); } catch(Exception ex) { out.println("<h1>生成 XML 配置文件时出现错误:</h1><br/><h4>"+ex+"</h4>"); out.println("<br/><br/>"); out.print("<a href='index.jsp'>【点这里回到首页】</a>"); } out.close(); } //Process the HTTP Post request public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { doGet(request, response); } //Clean up resources public void destroy() { }} 楼上的,强!不过你这样写也还是只限于Oracle 和 MSSQL , 其实你更应该读个已经存在的XML,自己写个DTD文件来固定格式,这样才是真正意义的扩展,可以添加任意类型的DB。不过现在Spring已经解决了 我解决了...我用JBULIDER 2006写的...我的代码如下:mysqlConfig.xml[BanUBB]<?xml version="1.0" encoding="UTF-8"?> <!-- 自行修改下列参数! servername --> 服务器名称或地址 serverport --> 服务器端口 databasename --> 数据库名 username --> 数据库帐号 password --> 数据库密码 --> <reportenv> <datasource> <servername>127.0.0.1</servername> <serverport>3306</serverport> <databasename>ragnarok</databasename> <username>root</username> <password>hackcity</password> </datasource> </reportenv> [/BanUBB]ConfigParser.java [BanUBB]package roadmin.Conn; import java.util.Properties; import org.xml.sax.Attributes; import org.xml.sax.SAXException; import org.xml.sax.helpers.DefaultHandler; class ConfigParser extends DefaultHandler { //定义一个Properties 用来存放属性值 private Properties props; private String currentSet; 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); } // 在遇到</xxx>结束后,将之前的名称和值一一对应保存在props中 public void endElement(String uri, String localName, String qName) throws SAXException { props.put(qName.toLowerCase(), currentValue.toString().trim()); } } [/BanUBB]ParseXML.java [BanUBB]package roadmin.Conn; import java.util.Properties; import javax.xml.parsers.SAXParser; import javax.xml.parsers.SAXParserFactory; class ParseXML { // 定义一个Properties 用来存放属性值 private Properties props; public Properties getProps() { return this.props; } 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; } } } [/BanUBB]ReadConfigXml.java[BanUBB]package roadmin.Conn; import java.util.Properties; public class ReadConfigXml { private Properties props; public ReadConfigXml(String url) { ParseXML myRead = new ParseXML(); try { myRead.parse(url); props = new Properties(); props = myRead.getProps(); } catch (Exception e) { e.printStackTrace(); } } public String getServerName() { return props.getProperty("servername"); } public String getServerPort() { return props.getProperty("serverport"); } public String getDatabaseName() { return props.getProperty("databasename"); } public String getUserName() { return props.getProperty("username"); } public String getPassWord() { return props.getProperty("password"); } } [/BanUBB]DataBase.java [BanUBB]package roadmin.Conn; import java.sql.*; import roadmin.Conn.ReadConfigXml; import javax.servlet.ServletContext; public class DataBase { private Connection Conn; public DataBase() { } public static DataBase newInstance() { return new DataBase(); } public Connection getConn() { ReadConfigXml xml = new ReadConfigXml("../RoAdmin/WEB-INF/classes/mysqlConfig.xml"); String dbhost = xml.getServerName(); String dbName = xml.getDatabaseName(); String dbUser = xml.getUserName(); String dbPass = xml.getPassWord(); String dbDriver = "org.gjt.mm.mysql.Driver"; String dbURL = "jdbc:mysql://" + dbhost + "/" + dbName + "?user=" + dbUser + "&password=" + dbPass + "&autoRec&failOverRead"; try { Class.forName(dbDriver); Conn = DriverManager.getConnection(dbURL); } catch (SQLException ex) { ex.printStackTrace(); } catch (ClassNotFoundException ex1) { ex1.printStackTrace(); } return Conn; } }[/BanUBB] 补充一下:ReadConfigXml.java 和 DataBase.java 是我自己被充的.前面两个类是网上流传的... 关于JS 获取数据 上传上来的文件是字节流格式的,我怎么能获取到这个文件的名称 标签判断字符串长度 求本书 严蔚敏数据结构与抽象(Java语言版)PDF derby数据库开发问题 webwork 一个action传参数给另一个action [雷锋贴]2007备战系分的请加入 沈阳的前辈们进~~问点关于培训班的事~~ hibernate的注解 请问如何调用*.jar文件? Tomcat window2000下自动启动出现乱码问题? 用hbm2java创建源文件失败,提示原因...
真TNND是个麻烦的问题...
从网上找了一堆不完整的代码,东拼西凑.总算完成了我的想法...
稍后我把总结出来的经验和源代码贴上来...这可真TNND是个麻烦东西....
我做过一个类似的,至少是可行的import javax.servlet.*;
import javax.servlet.http.*;
import java.io.*;
import java.util.*;
import javax.xml.parsers.*;
import javax.xml.transform.*;
import org.w3c.dom.*;
import org.xml.sax.*;
import javax.xml.transform.dom.DOMSource;
import javax.xml.transform.stream.StreamResult;public class CreateXMLForEnterServelet extends HttpServlet {
private static final String CONTENT_TYPE = "text/html; charset=GBK"; //Initialize global variables
public void init() throws ServletException {
} //Process the HTTP Get request
public void doGet(HttpServletRequest request, HttpServletResponse response) throws
ServletException, IOException {
response.setContentType(CONTENT_TYPE);
PrintWriter out = response.getWriter();
//获取传递过来的值
String databaseType = request.getParameter("select");
String userName = request.getParameter("userName");
String userPassword = request.getParameter("userPassword");
String dbName = request.getParameter("dbName");
String dbSouse = request.getParameter("dbSouces");
int port = Integer.parseInt(request.getParameter("portNum"));
Document doc;
Element root;
try
{
DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
DocumentBuilder db = dbf.newDocumentBuilder();
String path = request.getRealPath("/");
File file = new File( path + "/" + "DBInfo.xml");
if(!file.exists())
{
doc = db.newDocument();
root = doc.createElement("DBInfo");
doc.appendChild(root);
}
else
{
doc = db.parse(file);
root = doc.getDocumentElement();
}
//添加子节点
Element rowNode = doc.createElement(databaseType);
root.appendChild(rowNode);
Node node = doc.createElement("Driver");
Node nodestr = doc.createElement("ConnectString");
Node serverName = doc.createElement("ServerName");
Node nodeName = doc.createElement("UserName");
Node nodePWD = doc.createElement("PassWord");
Node nodePort = doc.createElement("Port");
Node nodeDB = doc.createElement("DataBase"); rowNode.appendChild(node);
rowNode.appendChild(nodestr);
rowNode.appendChild(serverName);
rowNode.appendChild(nodeDB);
rowNode.appendChild(nodeName);
rowNode.appendChild(nodePWD);
rowNode.appendChild(nodePort); String nodeValue;//Driver
String nodeConStr;//连接字符串
if(databaseType.equals("ORACLE"))
{
nodeValue = "oracle.jdbc.driver.OracleDriver";
nodeConStr = "jdbc:oracle:thin";
}
else
{
nodeValue = "com.microsoft.jdbc.sqlserver.SQLServerDriver";
nodeConStr = "jdbc:microsoft:sqlserver";
}
Text text = doc.createTextNode(nodeValue);
Text textstr = doc.createTextNode(nodeConStr);
Text textName = doc.createTextNode(userName);
Text textPWD = doc.createTextNode(userPassword);
Text textServer = doc.createTextNode(dbName);
Text textPort = doc.createTextNode(String.valueOf(port));
Text textDB = doc.createTextNode(dbSouse); node.appendChild(text);
nodestr.appendChild(textstr);
nodeName.appendChild(textName);
nodePWD.appendChild(textPWD);
serverName.appendChild(textServer);
nodePort.appendChild(textPort);
nodeDB.appendChild(textDB); DOMSource doms = new DOMSource(doc); StreamResult sr = null; TransformerFactory tff = TransformerFactory.newInstance();
Transformer tf = tff.newTransformer();
sr = new StreamResult(file);
tf.transform(doms,sr);
out.println("<h1>Create XMLFile Is Ok!!</h1>");
request.getRequestDispatcher("index.jsp").forward(request,response);
}
catch(Exception ex)
{
out.println("<h1>生成 XML 配置文件时出现错误:</h1><br/><h4>"+ex+"</h4>");
out.println("<br/><br/>");
out.print("<a href='index.jsp'>【点这里回到首页】</a>"); } out.close(); } //Process the HTTP Post request
public void doPost(HttpServletRequest request, HttpServletResponse response) throws
ServletException, IOException {
doGet(request, response);
} //Clean up resources
public void destroy() {
}
}
不过你这样写也还是只限于Oracle 和 MSSQL , 其实你更应该读个已经存在的XML,自己写个DTD文件来固定格式,这样才是真正意义的扩展,可以添加任意类型的DB。不过现在Spring已经解决了
我的代码如下:
mysqlConfig.xml
[BanUBB]
<?xml version="1.0" encoding="UTF-8"?>
<!--
自行修改下列参数!
servername --> 服务器名称或地址
serverport --> 服务器端口
databasename --> 数据库名
username --> 数据库帐号
password --> 数据库密码
-->
<reportenv>
<datasource>
<servername>127.0.0.1</servername>
<serverport>3306</serverport>
<databasename>ragnarok</databasename>
<username>root</username>
<password>hackcity</password>
</datasource>
</reportenv>
[/BanUBB]ConfigParser.java [BanUBB]
package roadmin.Conn;
import java.util.Properties;
import org.xml.sax.Attributes;
import org.xml.sax.SAXException;
import org.xml.sax.helpers.DefaultHandler;
class ConfigParser extends DefaultHandler {
//定义一个Properties 用来存放属性值
private Properties props;
private String currentSet;
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);
}
// 在遇到</xxx>结束后,将之前的名称和值一一对应保存在props中
public void endElement(String uri, String localName, String qName) throws
SAXException {
props.put(qName.toLowerCase(), currentValue.toString().trim());
}
} [/BanUBB]
ParseXML.java [BanUBB]
package roadmin.Conn;
import java.util.Properties;
import javax.xml.parsers.SAXParser;
import javax.xml.parsers.SAXParserFactory;
class ParseXML {
// 定义一个Properties 用来存放属性值
private Properties props;
public Properties getProps() {
return this.props;
}
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;
}
}
} [/BanUBB]ReadConfigXml.java[BanUBB]
package roadmin.Conn;
import java.util.Properties;
public class ReadConfigXml {
private Properties props;
public ReadConfigXml(String url) {
ParseXML myRead = new ParseXML();
try {
myRead.parse(url);
props = new Properties();
props = myRead.getProps();
} catch (Exception e) {
e.printStackTrace();
}
}
public String getServerName() {
return props.getProperty("servername");
}
public String getServerPort() {
return props.getProperty("serverport");
}
public String getDatabaseName() {
return props.getProperty("databasename");
}
public String getUserName() {
return props.getProperty("username");
}
public String getPassWord() {
return props.getProperty("password");
}
} [/BanUBB]DataBase.java [BanUBB]
package roadmin.Conn;
import java.sql.*;
import roadmin.Conn.ReadConfigXml;
import javax.servlet.ServletContext;
public class DataBase {
private Connection Conn;
public DataBase() {
}
public static DataBase newInstance() {
return new DataBase();
}
public Connection getConn() {
ReadConfigXml xml = new ReadConfigXml("../RoAdmin/WEB-INF/classes/mysqlConfig.xml");
String dbhost = xml.getServerName();
String dbName = xml.getDatabaseName();
String dbUser = xml.getUserName();
String dbPass = xml.getPassWord();
String dbDriver = "org.gjt.mm.mysql.Driver";
String dbURL = "jdbc:mysql://" + dbhost + "/" + dbName + "?user="
+ dbUser + "&password=" + dbPass
+ "&autoRec&failOverRead";
try {
Class.forName(dbDriver);
Conn = DriverManager.getConnection(dbURL);
} catch (SQLException ex) {
ex.printStackTrace();
} catch (ClassNotFoundException ex1) {
ex1.printStackTrace();
}
return Conn;
}
}
[/BanUBB]