java连接数据库,关闭问题
publicstaticResultSetselect(Stringsql)和publicstaticintchange(Stringsql)两个函数中为什么不能执行db...
public static ResultSet select(String sql)和public static int change(String sql)两个函数中为什么不能执行dbclose()。
public class Db {
private static Connection con=null;
private static Statement st=null;
private static ResultSet rs=null;
private static void dbconn()
{
try {
Class.forName("com.mysql.jdbc.Driver");
} catch (ClassNotFoundException e1) {
// TODO 自动生成 catch 块
e1.printStackTrace();
}
String conURL= "jdbc:mysql://localhost:3306/mydb";
String user="root";
String password="root";
try {
con=DriverManager.getConnection(conURL, user, password);//注册驱动
st=con.createStatement();
} catch (SQLException e) {
// TODO 自动生成 catch 块
e.printStackTrace();
}
}
private static void dbclose()
{
try {
if (rs != null)
rs.close();
} catch (SQLException e) {
e.printStackTrace();
} finally {
try {
if (st != null)
st.close();
} catch (SQLException e) {
e.printStackTrace();
} finally {
if (con != null)
try {
con.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
}
public static ResultSet select(String sql)
{
dbconn();
try {
rs=st.executeQuery(sql); //Statement的executeQuery()方法则是用于SELECT等查询数据库的SQL,executeUpdate()方法会返回int结果,表示记录变动的数目,executeQuery()方法会返回java.sql.ResultSet对象
//return rs;
} catch (SQLException e) {
// TODO 自动生成 catch 块
e.printStackTrace();
}finally{
//dbclose();
}
return rs;
}
public static int change(String sql)
{
dbconn();
int i=0;
try {
i=st.executeUpdate(sql);
} catch (SQLException e) {
// TODO 自动生成 catch 块
e.printStackTrace();
return i;
}finally{
//dbclose();
}
return i;
}
public static void main(String[] args) {
// dbconn();
String sql="select * from HomeWork";
String str="insert into HomeWork values(null,'Pikachu','male',2)";
ResultSet r1=select(sql);
try {
while(r1.next())
{
System.out.print(r1.getString("name")+"\n");
}
} catch (SQLException e) {
// TODO 自动生成 catch 块
e.printStackTrace();
}
int num=change(str);
System.out.println( num + "条数据已更改");
dbclose();
}
} 展开
public class Db {
private static Connection con=null;
private static Statement st=null;
private static ResultSet rs=null;
private static void dbconn()
{
try {
Class.forName("com.mysql.jdbc.Driver");
} catch (ClassNotFoundException e1) {
// TODO 自动生成 catch 块
e1.printStackTrace();
}
String conURL= "jdbc:mysql://localhost:3306/mydb";
String user="root";
String password="root";
try {
con=DriverManager.getConnection(conURL, user, password);//注册驱动
st=con.createStatement();
} catch (SQLException e) {
// TODO 自动生成 catch 块
e.printStackTrace();
}
}
private static void dbclose()
{
try {
if (rs != null)
rs.close();
} catch (SQLException e) {
e.printStackTrace();
} finally {
try {
if (st != null)
st.close();
} catch (SQLException e) {
e.printStackTrace();
} finally {
if (con != null)
try {
con.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
}
public static ResultSet select(String sql)
{
dbconn();
try {
rs=st.executeQuery(sql); //Statement的executeQuery()方法则是用于SELECT等查询数据库的SQL,executeUpdate()方法会返回int结果,表示记录变动的数目,executeQuery()方法会返回java.sql.ResultSet对象
//return rs;
} catch (SQLException e) {
// TODO 自动生成 catch 块
e.printStackTrace();
}finally{
//dbclose();
}
return rs;
}
public static int change(String sql)
{
dbconn();
int i=0;
try {
i=st.executeUpdate(sql);
} catch (SQLException e) {
// TODO 自动生成 catch 块
e.printStackTrace();
return i;
}finally{
//dbclose();
}
return i;
}
public static void main(String[] args) {
// dbconn();
String sql="select * from HomeWork";
String str="insert into HomeWork values(null,'Pikachu','male',2)";
ResultSet r1=select(sql);
try {
while(r1.next())
{
System.out.print(r1.getString("name")+"\n");
}
} catch (SQLException e) {
// TODO 自动生成 catch 块
e.printStackTrace();
}
int num=change(str);
System.out.println( num + "条数据已更改");
dbclose();
}
} 展开
2个回答
展开全部
由于你没有清晰描述问题,只能以理论上指导一下。从类的依赖(调用)关系上看,rs依赖st,st依赖于conn,一旦被依赖者出现为null或者是关闭掉,依赖者就无法正常工作了。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
不太清楚你的问题,但那两个方法finally中已将conn连接关闭,ResultSet r1=select(sql);将不会得到你想要的结果
追问
我就是想知道为什么不会得到想要的结果。比如在select()方法里,rs=st.executeQuery(sql);已经把rs赋值了,再关闭,那么为什么返回值不对的。
追答
我这样说吧.你赋的值是在conn范围内的(即conn未关闭时rs.next()才有值,关闭后值被清除),所以conn.close()后,再conn.next() 不再起起作用.不知道我的回答有没有解决你的问题.请多思考,或者记住有这么种况以后慢慢体会.
本回答被提问者采纳
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询