之前的一个项目,需要对接客户的5个数据库(oracle库、sqlserver库)。最开始是使用阿里连接池(druid)来连接,既简单又方便,但是会有一个问题,就是项目启动的时候会检查连接,如果连接超时,项目就无法启动。客户不满意这样的配置,因为他们有时候会关掉一些没用的库,他们希望项目启动的时候不要去初始化连接,不要因为一个无效的DB连接而影响到整个项目无法启动,而是DB连接要用到的时候才去连。
于是,就有了下面的操作,用了最简单的最原始的连接池,并且对数据进行了封装。
集中放置DB连接信息
用一个config.properties文件来专门放置DB连接信息
#oracle
jttp.driver=oracle.jdbc.driver.OracleDriver
jttp.url=jdbc:oracle:thin:@XXX.XX.XX.XX:1521:XXXX
jttp.username=XX
jttp.password=XX
#sqlServer
sqlserverSapRf.driver=com.microsoft.jdbc.sqlserver.SQLServerDriver
sqlserverSapRf.url=jdbc:sqlserver://XXX.XXX.X.XX:XXXX;databaseName=XXX
sqlserverSapRf.username=XX
sqlserverSapRf.password=XXXX
开始封装
重要的部分来了。
import jodd.util.PropertiesUtil;
import java.io.IOException;
import java.io.InputStream;
import java.sql.*;
import java.util.*;
public class DBUtil {
private String defaultConnectionString="";
/***
构造函数用于获取选择datasource;
***/
public DBUtil() {
defaultConnectionString="";
}
public DBUtil(String datasource) {
defaultConnectionString=datasource;
}
/***
数据库连接函数;
***/
private Connection customConnection(String driver,String connectionstr,String username,String password){
Connection conn=null;
try {
Class.forName(driver);
conn =DriverManager.getConnection(connectionstr,username,password);
} catch (ClassNotFoundException e) {
e.printStackTrace();
} catch (SQLException e) {
e.printStackTrace();
}
return conn;
}
/***
此函数用于列出所有的数据源
***/
public Connection datasource (String connectionname){//数据源选择connectionname为空,是默认数据源
Connection conn=null;
conn=customConnection(getValue(connectionname+".driver"),
getValue(connectionname+".url"),getValue(connectionname+".username"),getValue(connectionname+".password"));
return conn;
}
//获取propoties中的值
public String getValue(String key){
Properties prop = new Properties();
InputStream in = new PropertiesUtil().getClass().getResourceAsStream("/config.properties");
try {
prop.load(in);
} catch (IOException e) {
e.printStackTrace();
}
return prop.getProperty(key);
}
/***
sql语句执行函数,参数说明,返回数据统一装入ArrayList<HashMap>类;
***/
private ArrayList<HashMap> executesql(String connectionname, String sql){
ArrayList<HashMap> list = new ArrayList<HashMap>();
Connection conn=null;
Statement stmt=null;
ResultSet rs=null;
int count=0;
int colsnum=0;
ResultSetMetaData rsmd=null;
try {
conn=datasource(connectionname);
stmt = conn.createStatement();
String sqltype=sql.substring(0,7).toLowerCase();//判断sql类型,是插入,还是更新,还是查询
if(sqltype.substring(0,7).indexOf("select")>-1){//如果是select类型
rs = stmt.executeQuery(sql);
rsmd =rs.getMetaData();
colsnum=rsmd.getColumnCount();
while(rs.next()){
HashMap hm=new HashMap();
for(int i=1;i<=colsnum;i++){
String columnname=rsmd.getColumnName(i);
String value=rs.getString(columnname);
hm.put(columnname,value);
}
list.add(hm);
}
rs.close();
}else{
count = stmt.executeUpdate(sql);
HashMap hm=new HashMap();
hm.put("count",count);
list.add(hm);
}
stmt.close();
conn.close();
} catch (SQLException e) {
e.printStackTrace();
}
return list;
}
public ArrayList<HashMap> executesql(String sql){
ArrayList<HashMap> list=executesql(defaultConnectionString,sql);
return list;
}
}
使用案例
String system="jttp";
String sql="select * from B";
DBUtil jdbcTest=new DBUtil(system);
List<HashMap>list= jdbcTest.executesql(sql);
因为主要对DB库只有查询操作,所以并未考虑插入、更新、删除操作。
谢谢观看
网友评论