gpt4 book ai didi

java - 这是数据库连接和可自动关闭资源的正确实现吗?

转载 作者:行者123 更新时间:2023-11-29 10:15:05 24 4
gpt4 key购买 nike

我有一个程序,它从 MySQL 数据库表中读取数据,迭代结果集并返回列表中特定 userId 的行数据。在所有可用的互联网资源的帮助下,我设法创建了一些可行的东西,但我不确定我的实现是否正确。下面是我的 DbConnection 和 DaoImpl 类。

DbConnection.java

    /**
* This class is responsible for creating a new database connection using the declared URL, USER and PASSWORD.
*/

package dbconnection;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;

public class DbConnection implements AutoCloseable {
public static final String DB_URL = "jdbc:mysql://localhost:3306/test?autoReconnect=true&useSSL=false";
public static final String USER = "root";
public static final String PWD = "root";

private Connection conn;

/**
* An empty constructor that takes no arguments and creates a new Connection using DriverManager.getConnection.
* The connection is initiated inside a try-with resources with SQLException catch.
*/

public DbConnection() {
try {
conn = DriverManager.getConnection(DB_URL, USER, PWD);
System.out.println("Connection Established.");
} catch (SQLException e) {
System.out.println("Couldn't Connect!! " + e.getMessage());
}
}


//Return the current connection
public Connection getConn() {
return conn;
}


//close
public void close() {
try {
if (conn != null) {
conn.close();
System.out.println("Connection Closed");
}
} catch (SQLException e) {
System.out.println("Couldn't close Connection " + e.getMessage());
}

}
}

TiedostoDaoImpl.java

 import dbconnection.DbConnection;
import pojos.Tiedosto;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;

public class TiedostoDaoImpl implements TiedostoDAO {
final String TABLE_TIEDOSTO = "tiedosto";
final String COLUMN_TIEDOSTO_NAME = "nimi";
final String COLUMN_TIEDOSTO_SIZE = "koko_tavua";
final String COLUMN_TIEDOSTO_CONTENT = "sisalto";
final String COLUMN_TIEDOSTO_CUSTOMER_ID = "hlo_id";
final String COLUMN_TIEDOSTO_MINIOUPLOAD = "minioupload";

final String QUERY_TIEDOSTO = "SELECT " + COLUMN_TIEDOSTO_NAME + ", " + COLUMN_TIEDOSTO_CUSTOMER_ID + ", " + COLUMN_TIEDOSTO_SIZE + ", " + COLUMN_TIEDOSTO_CONTENT +
" FROM " + TABLE_TIEDOSTO + " WHERE " + COLUMN_TIEDOSTO_CUSTOMER_ID + " = ?";

final String UPDATE_TIEDOSTO = "UPDATE " + TABLE_TIEDOSTO + " SET " + COLUMN_TIEDOSTO_MINIOUPLOAD + " = 1 WHERE " + COLUMN_TIEDOSTO_CUSTOMER_ID + " = ?";


private DbConnection dbConnection = new DbConnection();
private Connection databaseConnection;

public TiedostoDaoImpl() {
try {
databaseConnection = dbConnection.getConn();
} catch (Exception e) {
System.out.println("Problem Connecting to Database! " + e.getMessage());
}
}


//This method queries tiedosto table and returns the data as a List.
@Override
public List<Tiedosto> getDetails(int userId) throws SQLException {
List<Tiedosto> files;
try (PreparedStatement selectFromTiedosto = databaseConnection.prepareStatement(QUERY_TIEDOSTO)) {
selectFromTiedosto.setInt(1, userId);
try (ResultSet results = selectFromTiedosto.executeQuery()) {
files = new ArrayList<>();
while (results.next()) {
Tiedosto myFile = new Tiedosto();
myFile.setCustomerId(results.getInt(COLUMN_TIEDOSTO_CUSTOMER_ID));
myFile.setFileName(results.getString(COLUMN_TIEDOSTO_NAME));
myFile.setFileSize(results.getInt(COLUMN_TIEDOSTO_SIZE));
myFile.setContent(results.getBlob(COLUMN_TIEDOSTO_CONTENT));
files.add(myFile);
}
}
}
return files;
}

当我运行该程序时,我得到如下输出: enter image description here

当我运行程序时,它显示“连接已建立”并返回数据,但它没有说明任何有关关闭连接的信息。我需要知道我是否正确地执行了整个事情。有人可以帮忙吗?

最佳答案

您需要在 try-with-resource 语句中包含 DbConnection,也许类似于...

try (DbConnection db = new DbConnection(); PreparedStatement selectFromTiedosto = db.getConn().prepareStatement(QUERY_TIEDOSTO)) {
// ...
} catch (SQLException ex) {
e.printStackTrace();
}

这将自动关闭DbConnectionPreparedStatement(尽管关闭连接无论如何都会自动关闭PreparedStatement)。

缺点,每次以这种方式使用它时,都会创建一个到数据库的新连接,这可能需要一些时间。使用关闭 Hook 或连接池可能更可取,具体取决于您实际在做什么

关于java - 这是数据库连接和可自动关闭资源的正确实现吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50229256/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com