mysql中jdbc正确的关闭顺序,04 jdbc中关闭连接的方式

之前在02jdbc web项目使用jdbc示例及不同版本调用jdbc的差异https://blog.csdn.net/sinat_41132860/article/details/84981142

中调用jdbc的方式是有问题的,当时的代码如下

import java.sql.Connection;

import java.sql.DriverManager;

import java.sql.ResultSet;

import java.sql.Statement;

public class JdbcTest01 {

public static void main(String[]args) throws Exception {

//注册驱动,以反射方式加载驱动

Class.forName("com.mysql.cj.jdbc.Driver");

//获取连接Connection

Connection conn=DriverManager.getConnection("jdbc:mysql://localhost:3306/study1?useSSL=false&serverTimezone=UTC", "root", "root");

///得到执行sequel语句的对象Statement

Statement stmt=conn.createStatement();

//执行sql语句,并返回结果

ResultSet rs=stmt.executeQuery("select * from employee");

处理结果

while(rs.next()) {

System.out.println(rs.getObject("employeenumber"));

System.out.println(rs.getObject("employeename"));

System.out.println(rs.getObject("departmentnumber"));

System.out.println(rs.getObject("salary"));

System.out.println(rs.getObject("hiredate"));

System.out.println("-================");

}

//关闭Connection

rs.close();

stmt.close();

conn.close();

}

}

如果在关闭连接之前代码抛出异常,那么显然关闭连接的代码不会再执行

解决此问题的两种方式

1为了保证一定能关闭连接,可以讲关闭连接的代码放到finally代码块中,如下:

package jdbc;

import java.sql.Connection;

import java.sql.DriverManager;

import java.sql.ResultSet;

import java.sql.SQLException;

import java.sql.Statement;

public class JdbcTest01 {

public static void main(String[]args) {

Connection conn=null;

Statement stmt=null;

ResultSet rs=null;

//注册驱动,以反射方式加载驱动

try {

Class.forName("com.mysql.cj.jdbc.Driver");

//获取连接Connection

conn=DriverManager.getConnection("jdbc:mysql://localhost:3306/study1?useSSL=false&serverTimezone=UTC", "root", "root");

///得到执行sequel语句的对象Statement

stmt=conn.createStatement();

//执行sql语句,并返回结果

rs=stmt.executeQuery("select * from employee");

处理结果

while(rs.next()) {

System.out.println(rs.getObject("employeenumber"));

System.out.println(rs.getObject("employeename"));

System.out.println(rs.getObject("departmentnumber"));

System.out.println(rs.getObject("salary"));

System.out.println(rs.getObject("hiredate"));

System.out.println("-================");

}

} catch (ClassNotFoundException e) {

// TODO Auto-generated catch block

e.printStackTrace();

} catch (SQLException e) {

// TODO Auto-generated catch block

e.printStackTrace();

}finally {

//关闭Connection

try {

if (rs!=null) {

rs.close();

}

if (stmt!=null) {

stmt.close();

}

if (conn!=null) {

conn.close();

}

} catch (SQLException e) {

// TODO Auto-generated catch block

e.printStackTrace();

}

}

}

}

说明

1 try语句块内部声明的变量,try语句块访问不到,所以为了保证finally语句块中能访问到rs,stmt,conn要在try语句块外部声明

2 关闭资源前检查资源是否为空,若不为空才需要关闭,如果直接关闭资源,当上面某一步出现异常而资源为null时,会出现空指针异常

2 jdk7和 JDBC4.1之后的正确关闭资源

Connection、Statement、ResultSet都继承了AutoCloseable接口,因此可以使用try-with-resources的方式关闭这些资源,即之前IO流时用的jdk新写法,不用显示关闭资源:

package jdbc;

import java.sql.Connection;

import java.sql.DriverManager;

import java.sql.ResultSet;

import java.sql.SQLException;

import java.sql.Statement;

public class JdbcTest01 {

public static void main(String[]args) {

//注册驱动,以反射方式加载驱动

try {

Class.forName("com.mysql.cj.jdbc.Driver");

} catch (ClassNotFoundException e1) {

e1.printStackTrace();

}

try (

//获取连接Connection

Connection conn=DriverManager.getConnection("jdbc:mysql://localhost:3306/study1?useSSL=false&serverTimezone=UTC", "root", "root");

///得到执行sequel语句的对象Statement

Statement stmt=conn.createStatement();

//执行sql语句,并返回结果

ResultSet rs=stmt.executeQuery("select * from employee");

//处理结果

){

while(rs.next()) {

System.out.println(rs.getObject("employeenumber"));

System.out.println(rs.getObject("employeename"));

System.out.println(rs.getObject("departmentnumber"));

System.out.println(rs.getObject("salary"));

System.out.println(rs.getObject("hiredate"));

System.out.println("-================");

}

} catch (SQLException e1) {

e1.printStackTrace();

}

}

}

说明:try后面小括号中最后一行代码的分号加不加都可以

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值