JDBC系列--Druid工具类

513 阅读2分钟

小知识,大挑战!本文正在参与“程序员必备小知识”创作活动。

我们前面有写JDBC的工具类 那么数据库连接池能抽象出工具类吗???

当然是可以的!!!

步骤

1.定义一个类JDBCUtils

2.提供静态代码块加载配置文件,初始化连接池对象

3.提供方法

1.获取连接方法:通过数据库连接池获取

2.释放资源

3.获取连接池的方法

实例

详细的注释都写在代码中了!

 package com.caq.datasource.utils;
 ​
 import com.alibaba.druid.pool.DruidDataSourceFactory;
 ​
 import javax.sql.DataSource;
 import java.io.IOException;
 import java.sql.Connection;
 import java.sql.ResultSet;
 import java.sql.SQLException;
 import java.sql.Statement;
 import java.util.Properties;
 ​
 /**
  * Druid连接池工具类
  */
 public class JDBCUtils {
     //1.定义成员变量  DataSource
     private static DataSource ds;
 ​
     static {
         try {
             //1.加载配置文件
             Properties pro = new Properties();
             pro.load(JDBCUtils.class.getClassLoader().getResourceAsStream("druid.properties"));
             //2.获取DataSource
             ds = DruidDataSourceFactory.createDataSource(pro);
 ​
         } catch (IOException e) {
             e.printStackTrace();
         } catch (Exception e) {
             e.printStackTrace();
         }
     }
 ​
     
 ​
     /**
      * 获取连接
      */
     public static Connection getConnection() throws SQLException {
         return ds.getConnection();
     }
 ​
 ​
     /**
      * 释放资源
      */
     //第一种情况,执行DML语句,需要释放connection数据库连接对象和statementsql语句执行对象
     public static void close(Statement stmt, Connection conn) {
         if (stmt != null) {
             try {
                 stmt.close();
             } catch (SQLException throwables) {
                 throwables.printStackTrace();
             }
         }
 ​
         if (conn != null) {
             try {
                 conn.close(); //归还连接,不在是释放了
             } catch (SQLException throwables) {
                 throwables.printStackTrace();
             }
         }
 ​
     }
 ​
     //第二种情况,执行DQL语句,释放三个资源,conn,stmt和resultSet结果集对象
     //这里写一个方法重载即可
     public static void close(ResultSet rs, Statement stmt, Connection conn) {
         if (stmt != null) {
             try {
                 stmt.close();
             } catch (SQLException throwables) {
                 throwables.printStackTrace();
             }
         }
 ​
         if (conn != null) {
             try {
                 conn.close(); //归还连接,不在是释放了
             } catch (SQLException throwables) {
                 throwables.printStackTrace();
             }
         }
     }
     /**
      * 获取连接池的方法
      */
     public static DataSource getDataSource(){
         return ds;
     }
 ​
 }

测试

 package com.caq.datasource.druid;
 ​
 import com.caq.datasource.utils.JDBCUtils;
 ​
 import java.sql.Connection;
 import java.sql.PreparedStatement;
 import java.sql.SQLException;
 ​
 /**
  * 使用新的工具类
  */
 public class DruidDemo02 {
     public static void main(String[] args) {
         /*
         完成添加的操作 给account表添加一条记录
          */
         Connection conn = null;
         PreparedStatement pstmt = null;
         try {
             //1.获取连接
             conn = JDBCUtils.getConnection();
             //2.定义sql
             String sql = "insert into account values(null,?,?)";
             //3.获取pstmt对象
             pstmt = conn.prepareStatement(sql);
             //4.给sql赋值
             pstmt.setString(1, "王五");//给第一个参数赋值为王五
             pstmt.setDouble(2, 3000);//给第二个参数赋值为3000
             //5.执行sql
             int count = pstmt.executeUpdate();
             System.out.println(count);
         } catch (SQLException throwables) {
             throwables.printStackTrace();
         } finally {
             //6.释放资源
             JDBCUtils.close(pstmt,conn);
         }
     }
 }
 ​
 输出结果为
 十月 21, 2021 8:40:18 下午 com.alibaba.druid.pool.DruidAbstractDataSource error
 严重: maxIdle is deprecated
 十月 21, 2021 8:40:19 下午 com.alibaba.druid.pool.DruidDataSource info
 信息: {dataSource-1} inited
 1
 ​

查看数据库

image-20211021204204390

人直接傻掉,太强了,太好用了啊!!!!

比原生的使用JDBC方便很多啊!

小总结

通过这种把通用的部分抽象出来这种想法,要不断的锻炼 不管是以后我们写代码还是做事能很节省效率呢!!! 抽象的思维!!!

如果没想明白其实可以想象前面学的封装的概念,将大的项目封装成一个一个小的项目,互不影响,需要的时候直接调用即可!