• JDBC_基础6步骤- 及优化


    (一)JDBC过程

    1,注册驱动com.mysql.jdbc.Driver

          DriverManager.registerDriver(new Driver());

          这种注册方式有两个缺点

    1.  注册了两次驱动(new Driver()中有和这个一样的代码,这样就注册了两次,不好)
    2.  产生了紧耦合关系(必须导入 com.mysql.jdbc.Driver   写死了,耦合度太高,不好)

         解决方案: Class.forName(com.mysql.jdbc.Driver”);  

    2,获取数据库连接java.sql.Connection

         Connection conn = DriverManager.getConnection( "jdbc:mysql://localhost:3306/jtdb",  "root","root");

    3,获取传输器java.sql.Statement

          Statement st = conn.createStatement();

          常用方法:

             executeQuery()   ---  用来执行查询的SQL

             executeUpdate()   --  用来执行增删改的SQL

    4,执行SQL。java.sql.ResultSet

          String sql ="select * from user";

          ResultSet rs = st.executeQuery(sql);

    5,遍历结果集

          while(rs.next()){

             //根据列的索引获取第一列的数据

             String id = rs.getString(1);

             //根据列的索引获取第二列的数据

             String username = rs.getString(2);

             //根据列的索引获取第三列的数据

             String password = rs.getString(3);

             System.out.println(id+username+password); 

          }

    6,释放资源

        在jdbc的开发中,释放资源的过程是必须要保证完成的,jdbc资源非常稀缺。在释放资源的过程中,会发生异常,这个时候为了保证资源一定会被释放,需要把释放资源的代码放在finally语句块中,来保证finally块中的代码一定会被执行到。

      正着开,倒着关

          rs.close();//释放结果集资源

          st.close();//释放传输器资源

          conn.close();//释放连接资源

    (二)对其进行优化和改进(JDBCUtils工具类)

          因为每次 第一步注册驱动 和 第二步获取数据库连接 和 第六步释放资源 每次连接数据库这三步都是一样的。所以将其封装成工具方法。对其进行调用就可以了,没有必要每次进行重写。  

       我们将注册驱动不要写死,并将jdbcUrl和root和password都放到属性文件中,这样可以灵活的修改。

               编写属性文件注意事项:

                     位置:src    new-file     jdbc.properties   后缀名:properties

                     格式:key=value,想要获取value时,通过get(key)来实现。

             调用属性文件中的内容,需要用到

             ResourceBundle rb = ResourceBundle.getBundle("jdbc");    //标红的为你的属性文件的名字,后缀必须为properties!!!

      1 public class JDBCUtils {
      2 
      3   
      4 
      5    //1,私有化构造函数,外界无法直接创建对象
      6 
      7    private JDBCUtils(){}
      8 
      9   
     10 
     11    //终极优化:只加载一次属性文件
     12 
     13    static ResourceBundle rb = null;
     14 
     15    static{
     16 
     17       //a,,,,读取属性文件
     18 
     19       rb = ResourceBundle.getBundle("jdbc");
     20 
     21    }
     22 
     23   
     24 
     25   
     26 
     27    //2,提供公共的,静态的,getConnection 方法,
     28 
     29    //用来给外界提供数据库连接
     30 
     31    public static Connection getConnection(){
     32 
     33       try {
     34 
     35         
     36 
     37          //1,注册驱动
     38 
     39          //b,,获取属性文件里的内容
     40 
     41          Class.forName(rb.getString("driverClass"));
     42 
     43         
     44 
     45          //2,获取数据库连接
     46 
     47          String url=rb.getString("jdbcUrl");
     48 
     49          String user=rb.getString("user");
     50 
     51          String password=rb.getString("password");
     52 
     53         
     54 
     55          Connection conn =
     56 
     57                 DriverManager.getConnection(
     58 
     59                       url, user, password);
     60 
     61      
     62 
     63          return conn;
     64 
     65       } catch (Exception e) {
     66 
     67          e.printStackTrace();
     68 
     69       }
     70 
     71       return null;
     72 
     73    }
     74 
     75   
     76 
     77    //3,提供公共的,静态的,close方法,
     78 
     79    //用来释放资源
     80 
     81    public static void close(ResultSet rs,
     82 
     83                        Statement st,
     84 
     85                        Connection conn){
     86 
     87       //释放结果集资源
     88 
     89       //非空判断,防止空指针异常
     90 
     91       if(rs!=null){
     92 
     93          try {
     94 
     95             rs.close();
     96 
     97          } catch (SQLException e) {
     98 
     99             e.printStackTrace();
    100 
    101          }finally{
    102 
    103             rs=null;//手动置空
    104 
    105          }
    106 
    107       }
    108 
    109       //释放传输器资源
    110 
    111       //非空判断,防止空指针异常
    112 
    113       if(st!=null){
    114 
    115          try {
    116 
    117             st.close();
    118 
    119          } catch (SQLException e) {
    120 
    121             e.printStackTrace();
    122 
    123          }finally{
    124 
    125             st=null;//手动置空
    126 
    127          }
    128 
    129       }
    130 
    131       //释放数据库连接资源
    132 
    133       //非空判断,防止空指针异常
    134 
    135       if(conn!=null){
    136 
    137          try {
    138 
    139             conn.close();
    140 
    141          } catch (SQLException e) {
    142 
    143             e.printStackTrace();
    144 
    145          }finally{
    146 
    147             conn=null;//手动置空
    148 
    149          }
    150 
    151       }
    152 
    153      
    154 
    155      
    156 
    157    }

     

    测试代码如下所示

     1 public class TestUtils {
     2 
     3    //单元测试方法:@Test  +  void
     4 
     5       @Test
     6 
     7       public void hello(){
     8 
     9          Connection conn = null;//声明连接对象
    10 
    11          Statement st = null;//声明传输器对象
    12 
    13          ResultSet rs = null;//声明结果集对象
    14 
    15         
    16 
    17          try {
    18 
    19             //1,注册驱动   2,获取数据库连接
    20 
    21             conn = JDBCUtils.getConnection();
    22 
    23            
    24 
    25       //    3,获取传输器java.sql.Statement
    26 
    27             st = conn.createStatement();
    28 
    29            
    30 
    31       //    4,执行SQL。java.sql.ResultSet
    32 
    33             String sql ="select * from user";
    34 
    35             rs = st.executeQuery(sql);
    36 
    37            
    38 
    39       //    5,遍历结果集
    40 
    41             while(rs.next()){
    42 
    43                 //根据列的索引获取第一列的数据
    44 
    45       //       String id = rs.getString(1);
    46 
    47                 //根据列的名字获取第一列的数据
    48 
    49                 String id = rs.getString("id");
    50 
    51       //       int id1  = rs.getInt(1);
    52 
    53                
    54 
    55                 //根据列的索引获取第二列的数据
    56 
    57                 String username = rs.getString(2);
    58 
    59                
    60 
    61                 //根据列的索引获取第三列的数据
    62 
    63                 String password = rs.getString(3);
    64 
    65                
    66 
    67                 System.out.println(id+username+password);
    68 
    69                
    70 
    71             }
    72 
    73            
    74 
    75          } catch (SQLException e) {
    76 
    77             e.printStackTrace();
    78 
    79          }finally{//保证资源一定会被释放
    80 
    81       //    6,释放资源
    82 
    83             JDBCUtils.close(rs, st, conn);
    84 
    85          }
    86 
    87         
    88 
    89       }
    90 
    91 }

     

     

  • 相关阅读:
    Vue
    前端笔试、面试题
    npm下载文件临时目录、实际存放目录路劲
    ES6
    Electron – 基础学习(3): 项目打包成exe桌面应用 之electron-builder
    Electron+Vue – 基础学习(2): 项目打包成exe桌面应用
    Electron+Vue – 基础学习(1): 创建项目
    软件需求膨胀系数
    职业女性确实处于劣势吗?记一次不甚严谨的考据 -- 向胡适之先生的遥远致敬
    15篇干货博客 38本书 4门公开课 减掉20斤体重 我的2014总结
  • 原文地址:https://www.cnblogs.com/misscai/p/9537528.html
Copyright © 2020-2023  润新知