Java的数据库连接工具类的编写

Java的数据库连接工具类的编写

步骤:

1. 定义变量
2. 通过反射进行读取配置文件
3. 实例化Properties读取配置文件中的各个属性
4. 关闭字节输入流
5. 类加载
6. 通过驱动管理的获取连接方法获取到连接对象
7. 释放资源

代码:

package cn.javabs.util;

import java.io.IOException;
import java.io.InputStream;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.Properties;
/**
  * @author: Mryang
  * Jdbc工具类:  工具类的含义是作为一个通用的辅助资料使用,简化开发流程,提高效率。
  *             工具类一般使用“static”进行修饰,静态化
  *                 static的优点
  *                   |---- 1. 可以使用 【类名.函数名称】进行调用,不必再次创建对象
  *                   |---- 2. 优于构造函数先执行
  *                   |---- 4. 静态成员被所有对象所共享(静态数据达到成为共享数据)
  *                   |---- 3. 随着类的加载而加载 (也就是说类运行了,静态成员也就跟随运行了) 
  *                 static的缺点
  *                   |---- 1. 访问出现局限性,只能访问静态
  *                   |---- 2. 静态成员的生命周期过长
  *                   |---- 3. 不可以与this\super关键字同用
  *                              |----因为this代表是当前类对象,而静态存在时,有可能没有对象
  *                              |----因为super代表是父类对象,而静态存在时,有可能没有对象,
  *                                 |----而且静态优先于对象存在
  *                   |----4.静态方法只能访问静态成员, 非静态方法既可以访问静态又可以访问非静态; 
  *                     
  * 
  **/
public class JdbcUtil {

    // 定义 数据库驱动
    private static String driverClass;
    // 定义 数据库的连接
    private static String url;
    // 定义 数据库用户
    private static String user;
    // 定义 数据库用户的密码
    private static String password;

    // 静态代码块
    static{
        try {
        //  JdbcUtil.class是获得当前对象所属的class对象 
        //  getClassLoader()是取得该Class对象的类装载器 
        //  getResourceAsStream(“dbcfg.properties”) 调用类加载器的方法加载资源,返回是字节输入流 
            InputStream in = JdbcUtil.class.getClassLoader().getResourceAsStream("dbcfg.properties");
            // 实例化Properties对象,目的是为了创建props
            Properties props = new Properties();
            // 在props对象中可以进行加载属性列表到Properties类对象
            props.load(in);//也就是说: 通过props对象进行加载输入流对象(in)
           /*
            * 通过getProperty方法用指定的键在此属性列表中搜索属性
            */
            //也就是说: 通过props对象进行获取【dbcfg.properties】中的指定的键-driverClass(被指定)
            driverClass = props.getProperty("driverClass");
            //也就是说: 通过props对象进行获取【dbcfg.properties】中的指定的键-url(被指定)
            url = props.getProperty("url");
            //也就是说: 通过props对象进行获取【dbcfg.properties】中的指定的键-user(被指定)
            user = props.getProperty("user");
            //也就是说: 通过props对象进行获取【dbcfg.properties】中的指定的键-password(被指定)
            password = props.getProperty("password");
            //已经获取过配置文件中的属性键值对,将字节输入流进行释放关闭
            in.close();
        } catch (IOException e) {
            // 转换异常抛出
            throw new ExceptionInInitializerError("获取数据库配置文件信息失败");
        }
        try {
            // 类加载-->驱动
            Class.forName(driverClass);
        } catch (ClassNotFoundException e) {
            // 转换异常抛出
            throw new ExceptionInInitializerError("加载驱动失败");
        }
    }

    /**
     * 获取连接
     * @return: conn
     */
    public static Connection getConnection(){
        try {
            //连接类型  连接对象  =  驱动管理中的获取连接(连接,用户名,密码)
            Connection conn = DriverManager.getConnection(url,user,password);
            // 将连接进行返回
            return conn;
        } catch (Exception e) {
            // 转换异常抛出
            throw new RuntimeException("链接数据库的url或用户名密码错误,请检查您的配置文件");
        }
    }

    /**
     * 释放资源
     * 传递三个参数: 结果集对象 ,处理Sql语句对象 , 连接对象  
     * 无返回值状态
     */
    public static void release(ResultSet rs,Statement stmt,Connection conn){
        //如果 结果集中不为空
        if(rs!=null){
            try {
                rs.close();//将结果集中关闭
            } catch (SQLException e) {
                e.printStackTrace();
            }
            rs = null;
        }
        //如果处理Sql语句对象不为空
        if(stmt!=null){
            try {
                stmt.close();//将处理Sql语句对象关闭
            } catch (SQLException e) {
                e.printStackTrace();
            }
            stmt = null;
        }
        //如果 连接不为空
        if(conn!=null){
            try {
                conn.close();//将连接关闭
            } catch (SQLException e) {
                e.printStackTrace();
            }
            conn = null;
        }
    }
}

配置文件编写:

#driver config for mysql
driverClass=com.mysql.jdbc.Driver
url=jdbc:mysql://localhost:3306/test
user=root
password=sorry

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏测试开发架构之路

堆和栈的区别

一、预备知识—程序的内存分配          一个由C/C++编译的程序占用的内存分为以下几个部分     1、栈区(stack)— 由编译器自动分配释放,存...

2868
来自专栏向治洪

java虚拟机构造原理

 Java虚拟机的生命周期 一个运行中的Java虚拟机有着一个清晰的任务:执行Java程序。程序开始执行时他才运行,程序结束时他就停止。你在同一台机器上运行三...

1986
来自专栏Java 源码分析

Bootstrap 源码分析

Netty 源码分析: Bootstrap 1. 结构 先看一个这个类的类层次结构, ? 好,这个结构还是比较明晰的,然后看他的主要字段,因为这些字段比较重...

2835
来自专栏QQ音乐技术团队的专栏

谁创建谁销毁,谁分配谁释放——JNI调用时的内存管理

在QQ音乐AndroidTV端的Cocos版本的开发过程中,我们希望尽量多的复用现有的业务逻辑,避免重复制造轮子。因此,我们使用了大量的JNI调用,来实现Jav...

4256
来自专栏Java 源码分析

Bootstrap 源码分析

Netty 源码分析: Bootstrap 1. 结构 先看一个这个类的类层次结构, ? 好,这个结构还是比较明晰的,然后看他的主要字段,因为这些字段比较重...

3032
来自专栏张首富-小白的成长历程

redis管理

Redis发布消息通常有两种模式: • 队列模式(queuing) • 发布-订阅模式(publish-subscribe) 任务队列:顾名思义,就是“...

2013
来自专栏DOTNET

asp.net web api 异常捕获

1 向客户端发送错误消息 使用throw new HttpResponseException()向客户端抛出错误信息。 HttpResponseExceptio...

50712
来自专栏FreeBuf

Safari信息泄露漏洞分析

Javascript中的数组和数组对象一直都是编程人员优化的主要目标,一般来说,数组只会包含一些基本类型数据,比如说32位整数或字符等等。因此,每个引擎都会对这...

892
来自专栏Ryan Miao

java线程(2)--同步和锁

参考转载:http://rainyear.iteye.com/blog/1734311 http://turandot.iteye.com/blog/17040...

3707
来自专栏决胜机器学习

Shell基本操作与命令

Shell基本操作与命令 (原创内容,转载请注明来源,谢谢) 本文主要是我最近学习shell语言的学习笔记,主要在于通过学习这些内容,达到看得懂shell脚...

3465

扫码关注云+社区

领取腾讯云代金券