1.使用JDBC来完成同类多数据的连接,或不同类数据库之间的连接,通用XML文件配置来完成。
1.1 datebase_cfg.xml [数据库连接配置]
<?xml version="1.0" encoding="UTF-8"?> <database> <sqlserver> <driver>com.microsoft.sqlserver.jdbc.SQLServerDriver</driver><!-- 数据库驱动 --> <userName>sa</userName> <!-- 用户名 --> <userPass>123</userPass> <!-- 密码 --> <state>1</state> <!-- 开启1,关闭0 --><!-- 状态,是否开启 --> <dataBaseName>framemanager</dataBaseName> <!-- 默认数据库名 --> <baseURL>localhost</baseURL> <!-- 服务器地址 --> </sqlserver> <mysql> <driver>com.mysql.jdbc.Driver</driver> <userName>root</userName> <userPass>111111</userPass> <state>0</state> <!-- 开启2,关闭0 --> <dataBaseName>bsdev</dataBaseName> <baseURL>localhost</baseURL> </mysql> <oracle> <driver>oracle.jdbc.driver.OracleDriver</driver> <userName>root</userName> <userPass>root</userPass> <state>0</state> <!-- 开启3,关闭0 --> <dataBaseName>test</dataBaseName> <baseURL>localhost</baseURL> </oracle> </database>
1.2 GetConfig.java [数据库连接]
package com.smartcom.ma.util.DbUtils; import java.net.URL; import java.sql.CallableStatement; import java.sql.Connection; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.sql.SQLException; import java.sql.Statement; import org.dom4j.Document; import org.dom4j.Element; import org.dom4j.io.SAXReader; /************************************************* * 采用单例模式读取xml配置文件sys-config.xml * @author Liyongbin * *************************************************/ public class GetConfig { //静态的私有成员变量 private static GetConfig instance = new GetConfig(); private String DRIVER; //数据库驱动 private String URL; //连接字符串 private String USERNAME; //用户名 private String PASSWORD ; //用户密码 private String STATUS; //状态 private String DatabaseName=""; //数据库名 public enum DBname{ //定义枚举类型 DOCMANAGER,FRAMEMANAGER,WWWMANAGER ; ////定义多个SqlServer数据库名字枚举 } private Connection conn = null; private PreparedStatement pst = null; private CallableStatement cs= null; private ResultSet res = null; private Statement st = null; private Document doc; //公共的静态入口方法 public static GetConfig getInstance() { return instance; } /********************************************** * 私有的构造方法[读取配置文件] * @author Liyongbin [Apr 28, 2012 6:53:24 PM] * @return ***********************************************/ private GetConfig() { try { //获取当前项目在本地的物理路径 // String url = ConfigReader.class.getClass().getResource("/").getPath(); URL url = GetConfig.class.getResource("datebase_cfg.xml"); SAXReader reader = new SAXReader(); doc = reader.read(url.getFile()); // System.out.println(doc.asXML()); Element root = doc.getRootElement();//xml文件的根目录 // Server STATUS = root.element("sqlserver").element("state").getText(); if(null!=STATUS && "1".equals(STATUS)){ DRIVER = root.element("sqlserver").element("driver").getText(); USERNAME = root.element("sqlserver").element("userName").getText(); PASSWORD = root.element("sqlserver").element("userPass").getText(); //DatabaseName = root.element("sqlserver").element("dataBaseName").getText();//在后面设置 URL = "jdbc:sqlserver://" + root.element("sqlserver").element("baseURL").getText() + ":1433;databasename=" + DatabaseName; }else if(null!=STATUS && "0".equals(STATUS)){ STATUS = root.element("mysql").element("state").getText(); } // MySql if(null!=STATUS && "2".equals(STATUS)){ DRIVER = root.element("mysql").element("driver").getText(); USERNAME = root.element("mysql").element("userName").getText(); PASSWORD = root.element("mysql").element("userPass").getText(); DatabaseName = root.element("mysql").element("dataBaseName").getText(); URL = "jdbc:mysql://" + root.element("mysql").element("baseURL").getText() + ":3306/" + DatabaseName; }else if(null!=STATUS && "0".equals(STATUS)){ STATUS = root.element("oracle").element("state").getText(); } // Oracle if(null!=STATUS && "3".equals(STATUS)){ STATUS = root.element("oracle").element("state").getText(); DRIVER = root.element("oracle").element("driver").getText(); USERNAME = root.element("oracle").element("userName").getText(); PASSWORD = root.element("oracle").element("userPass").getText(); DatabaseName = root.element("oracle").element("dataBaseName").getText(); URL = "jdbc:oracle:thin:@" + root.element("oracle").element("baseURL").getText() + ":1521:" + DatabaseName; } if(null==STATUS || "0".equals(STATUS)){ //读取配置文件出错[无可用的数据库配置] } System.out.println(">>>>>>>>>>>>>>>>>>>>>>>>>>>>>DRIVER:"+DRIVER); System.out.println(">>>>>>>>>>>>>>>>>>>>>>>>>>>>>USERNAME:"+USERNAME); System.out.println(">>>>>>>>>>>>>>>>>>>>>>>>>>>>>PASSWORD:"+PASSWORD); System.out.println(">>>>>>>>>>>>>>>>>>>>>>>>>>>>>DatabaseName:"+DatabaseName); System.out.println(">>>>>>>>>>>>>>>>>>>>>>>>>>>>>URL:"+URL); } catch (Exception e) { System.out.println(e.getMessage()); e.printStackTrace(); } } /********************************************** * 获取数据库的连接[默认] * * @return ***********************************************/ public Connection getConn(DBname dbType){ System.out.println(">>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>dbType:"+dbType); try { Class.forName(DRIVER); if(URL.indexOf("jdbc:sqlserver")!=-1){//Sql Server URL = URL.substring(0,URL.lastIndexOf("=")+1); //去掉数据库名称,重新组装[仅适用于多个SqlServer数据库的情况] switch (dbType) { case FRAMEMANAGER: //框架 URL += "framemanager"; break; case WWWMANAGER: //网站 URL += "wwwmanager"; break; default: //知识管理[缺省] URL += "docmanager"; break; } }else if(URL.indexOf("jdbc:mysql")!=-1){//MySQL }else if(URL.indexOf("jdbc:oracle")!=-1){//Oracle } System.out.println(">>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>URL:"+URL); conn = java.sql.DriverManager.getConnection(URL, USERNAME, PASSWORD); conn.setAutoCommit(false); //关闭自动提交功能,改为人工提交事务 } catch (ClassNotFoundException e) { e.printStackTrace(); } catch (SQLException e) { e.printStackTrace(); } return conn; } /********************************************* * 获取MA数据库的连接[框架数据库] * @author Liyongbin [Apr 28, 2012 7:11:12 PM] * @return 框架数据库连接 *********************************************/ public Connection getMAConn(){ try { conn = getConn(DBname.FRAMEMANAGER); } catch (Exception e) { e.printStackTrace(); } return conn; } /********************************************* * 获取KM数据库的连接[知识管理系统] * @author Liyongbin [Apr 28, 2012 7:11:13 PM] * @return 知识管理数据库连接 *********************************************/ public Connection getKMConn(){ try { conn = getConn(DBname.DOCMANAGER); } catch (Exception e) { e.printStackTrace(); } return conn; } /********************************************* * 获取网站数据库的连接 * @author Liyongbin [Apr 28, 2012 7:11:15 PM] * @return 网站数据库连接 ********************************************/ public Connection getWWWConn(){ try { conn = getConn(DBname.WWWMANAGER); } catch (Exception e) { e.printStackTrace(); } return conn; } /********************************************** * 关闭数据库参数 * @author Liyongbin [Apr 29, 2012 7:25:31 AM] * @return **********************************************/ public void close(){ try { if(res != null){ res.close(); } if(pst != null){ pst.close(); } if(st != null){ st.close(); } if(cs != null){ cs.close(); } if(conn != null){ conn.close(); } } catch (SQLException e) { e.printStackTrace(); } } }
1.3 DBOperation.java [CRUD]
package com.smartcom.ma.util.DbUtils; import java.sql.CallableStatement; import java.sql.Connection; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.sql.ResultSetMetaData; import java.sql.SQLException; import java.sql.Statement; public class DBOperation { private static Connection conn = null; private static PreparedStatement pst = null; private static CallableStatement cs= null; private static ResultSet res = null; private static Statement st = null; /********************************************** * 执行sql语句的增删改 * @author Liyongbin [Apr 28, 2012 7:20:34 PM] * @return ***********************************************/ public static Integer executeSQL(String sql,String[] param) throws SQLException{ Integer result = 0; conn = null; pst = null; try { conn = GetConfig.getInstance().getConn(null); pst = conn.prepareStatement(sql); if(param != null){ for(int i = 0; i < param.length; i++){ pst.setString(i + 1, param[i]); } } result = pst.executeUpdate(); conn.commit();//提交事务 } catch (SQLException e) { conn.rollback();//回滚事务 e.printStackTrace(); }finally{ GetConfig.getInstance().close(); } return result; } /********************************************** * 普通sql查询 * @author Liyongbin [Apr 29, 2012 7:48:11 AM] * @param sql * @param param * @return ***********************************************/ public static Object[][] executeQuery(Connection conn,String sql,String[] param){ ResultSetMetaData metadata = null; //数据的结构数据 Object[][] rets =null; //输出结果 int columnCount=0; //行数 int rowCount = 0; //列数 try { //连接数据库 pst = conn.prepareStatement(sql,ResultSet.TYPE_SCROLL_SENSITIVE,ResultSet.CONCUR_READ_ONLY); //设置参数 if(param != null){ for(int i = 0; i < param.length; i++){ pst.setString(i + 1, param[i]); } } //执行查询 res = pst.executeQuery(); //取数据结构数据 metadata = res.getMetaData(); //取行数 columnCount = metadata.getColumnCount(); res.last(); //取列数 rowCount = res.getRow(); res.first(); //创建结果数组 rets = new Object[rowCount][columnCount]; //遍历数据集 for(int i=0;i<rowCount;res.next()){ for(int j=0;j<columnCount;j++){ rets[i][j] = res.getObject(j+1); } i++; } } catch (SQLException e) { e.printStackTrace(); }finally{ if(null!=conn){ try { conn.close(); } catch (SQLException e) { e.printStackTrace(); } } } return rets; } /********************************************** * 普通sql查询 * @author Liyongbin * @param sql * @param param * @return ***********************************************/ public static Object[][] executeQuery(String sql,String[] param){ try { Connection conn = GetConfig.getInstance().getConn(null); return executeQuery(conn,sql,param); } catch (Exception e) { e.printStackTrace(); }finally{ if(null!=conn){ try { conn.close(); } catch (SQLException e) { e.printStackTrace(); } } } return null; } /********************************************* * 获取MA数据库的连接[框架数据库] * @author Liyongbin [Apr 28, 2012 7:11:12 PM] * @return 框架数据库连接 *********************************************/ public static Connection getMAConn(){ Connection conn =null; try { conn = GetConfig.getInstance().getMAConn(); } catch (Exception e) { e.printStackTrace(); } return conn; } /********************************************* * 获取KM数据库的连接[知识管理系统] * @author Liyongbin [Apr 28, 2012 7:11:13 PM] * @return 知识管理数据库连接 *********************************************/ public Connection getKMConn(){ Connection conn =null; try { conn = GetConfig.getInstance().getKMConn(); } catch (Exception e) { e.printStackTrace(); } return conn; } /********************************************* * 获取网站数据库的连接 * @author Liyongbin [Apr 28, 2012 7:11:15 PM] * @return 网站数据库连接 ********************************************/ public Connection getWWWConn(){ Connection conn =null; try { conn = GetConfig.getInstance().getWWWConn(); } catch (Exception e) { e.printStackTrace(); } return conn; } }