黑马程序员技术交流社区

标题: JDBC原生态连接数据操作的问题. [打印本页]

作者: xiaoxiqq    时间: 2016-6-29 18:26
标题: JDBC原生态连接数据操作的问题.
在main方法中PreparedStatement  和ResultSet我 都首先定义为空
然后.我在一个while里嵌套了一个switch, 比方说搞了4个case
每个case 都对这两个对象重新的赋值,也就是一般的数据库操作.
然后我在while循环结束之后.释放这两个对象的资源.
问:我这样做有错吗?
再问:如果有错.解释一下哪里有错,
错在什么地方.
解释清楚了给分.外加5个币打字费.
前提.我没有定义一个连接池.

作者: xiaoxiqq    时间: 2016-6-29 18:43
明天下午6点准时查看回复消息.
作者: LoveGG    时间: 2016-7-2 13:01
没有代码你说神马
作者: ImKing    时间: 2016-7-3 14:11
根据个人观点分析如下:
(1)建立的对象,未关闭。两个对象在使用结束后,直接关闭。while循环中可能会需要重复那 2 个对象。
(2)要是有代码的话更容易解决问题 {:3_57:}

作者: 936994215    时间: 2016-7-3 18:30
首先,我把你的问题再重新描述一遍:
1.声明PreparedStatement 和 ResultSet对象并初始化为 null;
2.在使用PreparedStatement 和 ResultSet对象前进行赋值操作;
3.结束时释放PreparedStatement 和 Result对象的资源。

有一点需要注意的是:
给对象赋值并使用完成后有没有释放资源;

有疑惑的地方:
因为这里进行赋值操作,并不知道是否赋值后有木有再给对象重新赋值。
或者说该对象所引用的地址是否仍然可用(是否变成了垃圾),
例如:
PreparedStatement ps = new XXX();
...
ps = new YYY();
ps.close();
如果是这样的情况,那么ps原来引用的对象在堆内存中就会变成垃圾,由JVM进行回收。
如果是如下情况:
PreparedStatement ps = new XXX();
...    //对ps进行一系列操作,但并不改变ps引用地址。
ps.close();
这样的情况是正常的也是应该的。

但是有一点需要注意的是:
资源的关闭应当使用try catch finally,改进一下就形成如下形式:
try {
...
PreparedStatement ps = new XXX();    //或者从Connection对象获取
...
} catch (Exception e) {
...
} finally {
    try {
        if (ps != null)
            ps.close();
    } catch(Exception e1) {
        ...
    }
}

不知道是否解决了您的问题,如有疑问,请继续提,
不过我想说的是,黑马币给我吧,我要攒够25个技术分,谢谢了!
作者: xiaoxiqq    时间: 2016-7-4 23:05
ImKing 发表于 2016-7-3 14:11
根据个人观点分析如下:
(1)建立的对象,未关闭。两个对象在使用结束后,直接关闭。while循环中可能会需 ...

只是重复操作了数据库...while循环里嵌套了一个switch...几个case里有操作这两个对象...循环结束后再关闭的..
作者: xiaoxiqq    时间: 2016-7-4 23:09
936994215 发表于 2016-7-3 18:30
首先,我把你的问题再重新描述一遍:
1.声明PreparedStatement 和 ResultSet对象并初始化为 null;
2.在使 ...

我用的throws 抛出的异常.不是处理异常.还有就是.重复操作肯定会改变ps 和rs的地址...你要明白.while 里嵌套了switch..好几个case不可能做同一种对数据库的操作.....
作者: ImKing    时间: 2016-7-4 23:09
xiaoxiqq 发表于 2016-7-4 23:05
只是重复操作了数据库...while循环里嵌套了一个switch...几个case里有操作这两个对象...循环结束后再关闭 ...

但愿问题已经解决了吧,不过只是理论分析的话,找出问题还是很有挑战性,祝好运! {:3_57:}
作者: xiaoxiqq    时间: 2016-7-4 23:11
ImKing 发表于 2016-7-4 23:09
但愿问题已经解决了吧,不过只是理论分析的话,找出问题还是很有挑战性,祝好运!  ...

我20分丢这上面..你给出合理解释..这个分可以给你的...反正我的问题解决了..但是这个问题被拿出来说.别人都说.很牵强! 笔试扣2分..
作者: ImKing    时间: 2016-7-4 23:16
xiaoxiqq 发表于 2016-7-4 23:11
我20分丢这上面..你给出合理解释..这个分可以给你的...反正我的问题解决了..但是这个问题被拿出来说.别人 ...

好吧,我等会儿看下,先去回答一些基础问题。
我会尽最大努力给出自己的分析,尽快给你回复,谢谢{:3_56:}
作者: ImKing    时间: 2016-7-5 15:03
  1. import java.sql.Connection;
  2. import java.sql.DriverManager;
  3. import java.sql.PreparedStatement;
  4. import java.sql.ResultSet;
  5. import java.sql.SQLException;
  6. import java.util.Scanner;

  7. public class Jdbc {

  8.         public static void main(String[] args) throws SQLException {

  9.                 PreparedStatement pst = null;
  10.                 ResultSet rs = null;
  11.                 Scanner sin = new Scanner(System.in);
  12.                 boolean flag = true;

  13.                 // 数据库连接
  14.                 Connection conn = null;
  15.                 try {
  16.                         Class.forName("com.mysql.jdbc.Driver");
  17.                         conn = DriverManager.getConnection(
  18.                                         "jdbc:mysql://localhost:3306/jdbc", "root", "123456");
  19.                 } catch (SQLException | ClassNotFoundException e1) {
  20.                         e1.printStackTrace();
  21.                 }

  22.                 // 数据库操作
  23.                 System.out.println("=================================");
  24.                 System.out.println(" 0 结束  1 查询(女)  2 查询(男)  3 添加  4 删除    ");
  25.                 System.out.println("=================================");

  26.                 while (flag) {
  27.                         System.out.println("请输入操作序号");
  28.                         switch (sin.next()) {

  29.                         case "0":
  30.                                 flag = false;
  31.                                 break;
  32.                         case "1":
  33.                                 try {
  34.                                         pst = conn
  35.                                                         .prepareStatement("select * from t_user where sex='女'");
  36.                                         rs = pst.executeQuery();
  37.                                 } catch (SQLException e) {
  38.                                         e.printStackTrace();
  39.                                 }
  40.                                 if(rs != null) {
  41.                                         while (rs.next()) {
  42.                                                 String str = "ID:" + rs.getString(1) + " 姓名:" + rs.getString(2)
  43.                                                                 + " 性别:" + rs.getString(3);
  44.                                                 System.out.println(str);
  45.                                         }
  46.                                 }
  47.                                 break;
  48.                         case "2":
  49.                                 try {
  50.                                         pst = conn
  51.                                                         .prepareStatement("select * from t_user where sex='男'");
  52.                                         rs = pst.executeQuery();
  53.                                 } catch (SQLException e) {
  54.                                         e.printStackTrace();
  55.                                 }
  56.                                 if(rs != null) {
  57.                                         while (rs.next()) {
  58.                                                 String str = "ID:" + rs.getString(1) + " 姓名:" + rs.getString(2)
  59.                                                                 + " 性别:" + rs.getString(3);
  60.                                                 System.out.println(str);
  61.                                         }
  62.                                 }
  63.                                 break;
  64.                         case "4":
  65.                                 System.out.println("请输入学号:");
  66.                                 try {
  67.                                         pst = conn
  68.                                                         .prepareStatement("delete from t_user where id=?");
  69.                                         pst.setInt(1, Integer.valueOf(sin.next()));
  70.                                         int result = pst.executeUpdate();
  71.                                         if(result != 0) {
  72.                                                 System.out.println("删除成功!");
  73.                                         }
  74.                                 } catch (SQLException e) {
  75.                                         e.printStackTrace();
  76.                                 }
  77.                                 if(rs != null) {
  78.                                         while (rs.next()) {
  79.                                                 String str = "ID:" + rs.getString(1) + " 姓名:" + rs.getString(2)
  80.                                                                 + " 性别:" + rs.getString(3);
  81.                                                 System.out.println(str);
  82.                                         }
  83.                                 }
  84.                                 break;
  85.                         case "3":
  86.                                 try {
  87.                                         pst = conn
  88.                                                         .prepareStatement("insert t_user(id,name,sex) values(?,?,?)");
  89.                                         System.out.println("请输入学号:");
  90.                                         pst.setInt(1,Integer.valueOf(sin.next()));
  91.                                         System.out.println("请输入姓名:");
  92.                                         pst.setString(2,sin.next());
  93.                                         System.out.println("请输入性别:");
  94.                                         pst.setString(3,sin.next());
  95.                                         int result = pst.executeUpdate();
  96.                                         if(result != 0) {
  97.                                                 System.out.println("增加成功!");
  98.                                         }
  99.                                 } catch (SQLException e) {
  100.                                         e.printStackTrace();
  101.                                 }
  102.                                 if(rs != null) {
  103.                                         while (rs.next()) {
  104.                                                 String str = "ID:" + rs.getString(1) + " 姓名:" + rs.getString(2)
  105.                                                                 + " 性别:" + rs.getString(3);
  106.                                                 System.out.println(str);
  107.                                         }
  108.                                 }
  109.                                 break;
  110.                         default:
  111.                                 System.out.println("输入无效,请重新输入!");
  112.                         }
  113.                 }
  114.                
  115.                 conn.close();
  116.                 pst.close();
  117.                 rs.close();
  118.                 sin.close();

  119.         }
  120. }
复制代码


上面是我的代码,你看下是否有需要改的地方。上面的代码运行没有问题,如果可以的话,可以继续讨论。
谢谢,{:3_57:}
作者: ImKing    时间: 2016-7-6 08:58
ImKing 发表于 2016-7-5 15:03
上面是我的代码,你看下是否有需要改的地方。上面的代码运行没有问题,如果可以的话,可以继续讨论。
谢 ...

那算了,,,别人应该能有更好的回答
作者: fulq1234    时间: 2016-10-17 11:52
本帖最后由 fulq1234 于 2016-10-17 11:54 编辑

1,你在方法上面throws SQLException,就不需要在方法里面try{}catch(){}了。
2,你在方法最后面做些关闭操作,说真的,有很大风险,
   (1),需要先判断是否非空,才可以关闭。
   (2),如果在关闭之前发生异常,就在异常发生的地方退出,而不会执行关闭操作,这样时间长了,连接打开太多,肯定会报错。

我写了段程序,模拟了下,如果发生异常,就直接在异常发生的地方退出。
package c;
class AA{
        public int a1() throws ArithmeticException{
                System.out.println("=====AA a1 step 1");
                int a=1/0;
                System.out.println("=====AA a1 step 2");
                a=1+1;
                return a;
        }
}
public class TEST2 {
        public static void main(String[] args) {
                System.out.println("======main step 1");
                AA a=new AA();
                try{
                        int t=a.a1();
                        System.out.println("======main step 2");
                        System.out.println(t);
                        System.out.println("======main step 3");
                        
                }catch(ArithmeticException e){
                        System.out.println("======main step 4");
                        e.printStackTrace();
                }finally{

                        System.out.println("======main step 5");
                }
        }
}

=========输出
======main step 1
=====AA a1 step 1
======main step 4
======main step 5
java.lang.ArithmeticException: / by zero
        at c.AA.a1(TEST2.java:5)
        at c.TEST2.main(TEST2.java:16)


题外话,怎么样才能凑够25个技术分啊,亲们。我现在差远了。





欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2