关于java DB的封装

之前的一个项目,需要对接客户的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类;
     ***/
    private ArrayList executesql(String connectionname, String sql){
        ArrayList list = new ArrayList();
        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 executesql(String sql){
        ArrayList list=executesql(defaultConnectionString,sql);
        return list;
    }
 
}

使用案例

String system="jttp";
String sql="select * from B";
DBUtil jdbcTest=new DBUtil(system);
Listlist= jdbcTest.executesql(sql);

因为主要对DB库只有查询操作,所以并未考虑插入、更新、删除操作。

谢谢观看

你可能感兴趣的:(关于java DB的封装)