我是JDBC新手......
Student类具有Constructor,add(),update()和delete()等方法......
在构造函数中打开一个连接。在下面的代码帮助我
中写conn.close()和pstmt.close()的位置class Student
{
Connection conn;
PreparedStatement pstmt;
ResultSet rs;
public Student()
{
try
{
Class.forName("com.mysql.jdbc.Driver");
conn=DriverManager.getConnection("jdbc:mysql://localhost:3306/test","root","root");
}
catch(Exception e)
{
System.out.println("Error :"+e.getMessage());
}
}
public void add(int rollno,String name)
{
try
{
pstmt = conn.prepareStatement("insert into student values (?, ?)");
pstmt.setInt(1,rollno);
pstmt.setString(2, name);
int i = pstmt.executeUpdate();
if (i != 0) {
System.out.println("Record Inserted");
} else {
System.out.println("Record Not Inserted");
}
}
catch(Exception e)
{
System.out.println("Error :"+e.getMessage());
}
}
public void update(int rollno,String name)
{
try
{
pstmt = conn.prepareStatement("update student set name=? where rollno=?");
pstmt.setString(1, name);
pstmt.setInt(2,rollno);
int i = pstmt.executeUpdate();
if (i != 0) {
System.out.println("Record Updated");
} else {
System.out.println("Record Not Updated");
}
}
catch(Exception e)
{
System.out.println("Error :"+e.getMessage());
}
}
public void delete(int rollno)
{
try
{
pstmt = conn.prepareStatement("delete from student where rollno=?");
pstmt.setInt(1,rollno);
int i = pstmt.executeUpdate();
if (i != 0) {
System.out.println("Record Deleted");
} else {
System.out.println("Record Not Deleted");
}
}
catch(Exception e)
{
System.out.println("Error :"+e.getMessage());
}
}
}
答案 0 :(得分:1)
根据您发布的示例代码,您尝试执行的所有操作(例如Add
Update
和Delete
都会使用全局创建的相同连接对象并初始化在你的构造函数" Student()"。 This is not a standard practice
根据标准,您不应该这样做,您应该在每个操作上创建新的连接作为local
变量,例如'添加'更新'并且'删除' seperately
另外请记住,如果您使用的是Bean管理的交易'然后你需要在关闭之前提交事务。否则在finally块
中添加conn.commit();
以下是您的方法应如何
的简单示例public void add(int rollno,String name)
{
Connection conn = null;
PreparedStatement pstmt = null;
try
{
pstmt = conn.prepareStatement("insert into student values (?, ?)");
pstmt.setInt(1,rollno);
pstmt.setString(2, name);
int i = pstmt.executeUpdate();
if (i != 0) {
System.out.println("Record Inserted");
} else {
System.out.println("Record Not Inserted");
}
} catch(Exception e) {
System.out.println("Error :"+e.getMessage());
} finally {
if(pstmt!=null) {
pstmt.close();
}
if(conn!=null) {
conn.comit(); // Add this line ONLY if you use bean managed transaction
conn.close();
}
}
}
答案 1 :(得分:0)
我想你应该添加另一个方法来关闭连接,并在完成操作时在你的对象上调用它。
public void closeConnection() {
conn.close();
}
同样最好创建另一种方法来打开连接,而不是从构造函数中打开它。
答案 2 :(得分:0)
首先,我不打开构造函数中的连接,因为它可能导致很多连接在没有被使用的情况下长时间打开,并且因为连接是有限的资源,所以你应该保持它们的开放性。尽可能少的时间。
我会在每个使用它的方法中打开和关闭连接(和准备好的语句)(add
,update
,delete
等等。这样,只有在需要时才会打开连接。
答案 3 :(得分:0)
您可以使用try-catch-finally块并关闭finally中的连接。
Connection con;
try
{
con = new Connection(...);
}
catch (Exception e)
{
//Error Handling
}
finally
{
connection.close();
}
或者您使用try-with-resource并让VM负责关闭连接(在这种情况下,您不需要将Connection声明为字段,但每个操作都有一个):
try(Connection con = new Connection(...))
{
}
catch()
{
}
答案 4 :(得分:0)
在finally
块之后添加catch
块以关闭PreparedStatement
和Connection
对象。像
catch (Exception d) {
//do whatever you want when exception occurs
}
finally {
//close resultset
//close prepared statement
//close connection object
}
finally
确保在控件返回之前关闭资源。即使您在return
块中使用try
,也会关闭资源。