Java 关闭方法中与数据库相关的资源

Java 关闭方法中与数据库相关的资源,java,mysql,sql,database,resources,Java,Mysql,Sql,Database,Resources,@Joeblade建议我将数据库连接逻辑移动到一个单独的方法,如果不是一个单独的类的话,因为用户界面类中已经有很多用户界面代码,所以添加db代码对可读性没有帮助。如果需要的话,这也将有助于重用db代码。我做到了。但现在,我的问题是关于关闭资源 static Connection getConnection() { return connection; } public ResultSet Execute_Query(String queryIn) throws SQLExceptio

@Joeblade建议我将数据库连接逻辑移动到一个单独的方法,如果不是一个单独的类的话,因为用户界面类中已经有很多用户界面代码,所以添加db代码对可读性没有帮助。如果需要的话,这也将有助于重用db代码。我做到了。但现在,我的问题是关于关闭资源

static Connection getConnection() {
    return connection;
} 

public ResultSet Execute_Query(String queryIn) throws SQLException {
    ResultSet resSet = null;        
    try {               
        connection = TableWithBottomLine.getConnection();
        Statement stmt = null;
        stmt = connection.createStatement();
        resSet = stmt.executeQuery(queryIn);                    
    } catch (SQLException e) {
        e.printStackTrace();
    }               
    return resSet;
}

public String textForLabel() throws SQLException{

    List<Float> floatArrayList = new ArrayList<Float>();

        String query ="SELECT f.Flat, f.Mobile, f.Food, f.Alcohol, f.Transport, f.Outdoor, f.Pauls_stuff, f.Stuff FROM finance.fin f WHERE f.tbl_Date >= DATE_FORMAT( NOW( ) ,  '%Y-%m-10' ) + INTERVAL IF( DAY( NOW( ) ) >10, 0 , -1 ) MONTH AND f.tbl_Date <= CURDATE( ) ";

        try {               
            ResultSet rs = null;
            rs = Execute_Query(query);          

            while (rs.next()){
              floatArrayList.add(rs.getFloat("Flat"));
              floatArrayList.add(rs.getFloat("Mobile"));
              floatArrayList.add(rs.getFloat("Food"));
              floatArrayList.add(rs.getFloat("Alcohol"));
              floatArrayList.add(rs.getFloat("Transport"));
              floatArrayList.add(rs.getFloat("Outdoor"));
              floatArrayList.add(rs.getFloat("Pauls_stuff"));
              floatArrayList.add(rs.getFloat("Stuff"));
            }           
       } catch(SQLException ee){
           ee.printStackTrace();
         }
// Irrelevant stuff down below.....
静态连接getConnection(){
回路连接;
} 
公共结果集执行_查询(字符串查询)引发SQLException{
ResultSet-reset=null;
试试{
connection=TableWithBottomLine.getConnection();
语句stmt=null;
stmt=connection.createStatement();
reset=stmt.executeQuery(查询);
}捕获(SQLE异常){
e、 printStackTrace();
}               
返回女贞子;
}
公共字符串textForLabel()引发SQLException{
List floatArrayList=新建ArrayList();

String query=“选择f.Flat、f.Mobile、f.Food、f.酒精、f.Transport、f.Outdoor、f.Pauls_stuff、f.fin中的f.tbl_Date>=Date_格式(现在(),“%Y-%m-10”)+如果(DAY(现在())>10,0,-1)个月和f.tbl_Date使用try with resources会更好

首先获取连接详细信息,并在try中准备语句

      String query ="SELECT f.Flat, f.Mobile, f.Food, f.Alcohol, f.Transport, f.Outdoor, f.Pauls_stuff, f.Stuff FROM finance.fin f WHERE f.tbl_Date >= DATE_FORMAT( NOW( ) ,  '%Y-%m-10' ) + INTERVAL IF( DAY( NOW( ) ) >10, 0 , -1 ) MONTH AND f.tbl_Date <= CURDATE( ) ";
        try (Connection connection = DriverManager.getConnection(url);
    Statement stmt=connection.createStatement();) {
        try (ResultSet rs = stmt.executeQuery(query); ) {
                while(rs.next()) {
    floatArrayList.add(rs.getFloat("Flat"));
                  floatArrayList.add(rs.getFloat("Mobile"));
                  floatArrayList.add(rs.getFloat("Food"));
                  floatArrayList.add(rs.getFloat("Alcohol"));
                  floatArrayList.add(rs.getFloat("Transport"));
                  floatArrayList.add(rs.getFloat("Outdoor"));
                  floatArrayList.add(rs.getFloat("Pauls_stuff"));
                  floatArrayList.add(rs.getFloat("Stuff"));
                }           
           } 
}catch(SQLException ee){
               ee.printStackTrace();
    }

String query=“选择f.平面、f.移动、f.食品、f.酒精、f.运输、f.户外、f.保尔斯大学的东西、f.来自finance.fin的东西,其中f.tbl_Date>=Date_格式(现在(),“%Y-%m-10”)+间隔如果(现在())>10,0,-1)个月和f.tbl_Date尝试类似的方法

} catch (SQLException e) {
   e.printStackTrace();
} finally {
   connection.close();
}

finally语句将确保调用“connection.close();”,即使代码引发异常。

移动所有数据库逻辑,而不仅仅是连接建立代码

List<Float> listMyStuff() {
    ArrayList<Float> list = new ArrayList<Float>();
    Connection con = null;
    Statement statement = null;
    ResultSet rs = null;

    try {
        con = DriverManager.getConnection(MY_DB_URL);
        statement = con.createStatement();
        rs = statement.executeQuery(MY_SQL);
        while(rs.next()) {
            list.add(rs.getFloat("Flat"));
            list.add(rs.getFloat("Mobile"));
            list.add(rs.getFloat("Food"));
            list.add(rs.getFloat("Alcohol"));
            list.add(rs.getFloat("Transport"));
            list.add(rs.getFloat("Outdoor"));
            list.add(rs.getFloat("Pauls_stuff"));
            list.add(rs.getFloat("Stuff"));            
        }
    }
    catch(SQLException e) {
        e.printStackTrace();
        //Do something else!?!?
    }
    finally {
        if(rs != null) { try{ rs.close(); }catch(Throwable t){} }
        if(statement != null) { try{ statement.close(); }catch(Throwable t){} }
        if(con != null) { try{ con.close(); }catch(Throwable t){} }
    }

    return list;
}
List listMyStuff(){
ArrayList=新建ArrayList();
连接con=null;
Statement=null;
结果集rs=null;
试一试{
con=DriverManager.getConnection(MY_DB_URL);
statement=con.createStatement();
rs=语句.executeQuery(MY_SQL);
while(rs.next()){
添加(rs.getFloat(“Flat”));
添加(rs.getFloat(“移动”);
添加(rs.getFloat(“食品”));
添加(rs.getFloat(“酒精”);
添加(rs.getFloat(“运输”));
添加(rs.getFloat(“户外”);
添加(rs.getFloat(“Pauls_stuff”);
添加(rs.getFloat(“Stuff”);
}
}
捕获(SQLE异常){
e、 printStackTrace();
//做点别的!?!?
}
最后{
如果(rs!=null){try{rs.close();}catch(Throwable t){}
if(statement!=null){try{statement.close();}catch(Throwable t){}
如果(con!=null){try{con.close();}catch(Throwable t){}
}
退货清单;
}

你看到我的要求了吗?是的,'但是现在,我的问题是关于关闭资源的。'使用代码中的finally关闭你想要的资源。我弄错了吗?我们不要在这里进行讨论。我将通过问你一个简单的问题来告诉你是否弄错了:你的答案是第一个问题还是第二个问题我问的是什么?:)很抱歉,如果我显得咄咄逼人,我不是想开始讨论。这是第二个问题的答案。我想在网上找到一个可能对你有很大帮助的连接工厂的例子。如果我找到了,我会留下评论。很抱歉,我只是找不到一个连接工厂的好例子。但作为一个建议,请使用这个'连接。回滚()'当您的代码引发异常时,它将撤消以前的代码使用该连接在数据库中所做的操作。感谢您的解决方案。有人建议我将数据库连接逻辑移出同一个方法。我这样做了,您将再次将其拉回到一起…好。.将上述代码添加到以字符串为参数的方法中。否w通过从另一个类将查询作为param传递来调用该方法。现在,您的数据库操作将从用户界面中移出。在方法中没有类似方法的东西。方法中只能有对象,这些对象可能包含方法,并且除了lamba构造外,它们的作用域不同,或多或少是孤立的Eded。谢谢。我编辑了标题。你让它变得更糟了,你的代码中没有一个lambda-因此作用域不同。谢谢。这是一个将数据库逻辑与UI或业务逻辑分离的好例子。现在,请告诉我一些事情,如果我的程序中有几个查询,我是否每次都要为它们创建一个特定的方法每个查询或者我可以创建一个通用方法并重用它吗?