JDBC(一)_自写获取Connection对象工具类

本文介绍了一种通过创建JDBC工具类简化数据库连接和操作的方法,包括配置文件读取、连接获取、资源释放等功能,有效提高了代码的可读性和可维护性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

JDBC连接每一次都需要按照相同的步骤:

  1. 注册驱动
  2. 获取连接
  3. 获取执行sql的对象
  4. 运用Statement对象的方法对该sql语句进行操作
  5. 最后关闭资源

这样做会十分的复杂

可以写一个jdbc在执行操作之前的工具类,对操作进行简单化

  • 这样的目的是:简化书写
  • 分析:

注册驱动也抽取

抽取一个方法获取连接对象

需求:不想传递参数(麻烦),还得保证工具类的通用性

解决:配置文件

jdbc.properties

url=jdbc:mysql:///db1?serverTimezone=UTC

  注意这里得加serverTimezone=UTC,后面的db1代表要操作的数据库,可以更改,这里的三个斜杠本来应该是//localhost:3306/数据库名称,但是由于是本地主机而且端口是3306,所以可以省略

user=root

这里的用户名是连接的mysql的用户名

password=root

driver=com.mysql.cj.jdbc.Driver

在每一次调用类的对象时自动执行注册驱动,可以写一个静态代码块

//注意此方法是写在工具类里面的
private static String url;
private static String user;
private static String password;
private static String driver;
/**
 * 文件的读取只需要读取一次即可拿到这些值。使用静态代码块
 */
static{
    //读取资源文件,获取值
    //1.创建Properties集合类
    Properties pro=new Properties();
    //2.加载文件
    try {
        //pro.load(new FileReader("src/jdbc.properties"));
        ClassLoader classLoader = JDBCUtils.class.getClassLoader();
        URL resource = classLoader.getResource("jdbc.properties");
        String str=resource.getPath();
        pro.load(new FileReader(str));
        //3.获取数据,赋值
        url=pro.getProperty("url");
        user=pro.getProperty("user");
        password=pro.getProperty("password");
        driver=pro.getProperty("driver");
        //4.注册驱动
        Class.forName(driver);

    } catch (IOException e) {
        e.printStackTrace();
    } catch (ClassNotFoundException e) {
        e.printStackTrace();
    }
}

 

然后获取与数据库的连接,返回一个Connection对象,即可

/**
 * 获取连接
 * @return 连接对象
 */
public static Connection getConnection(){
    Connection conn=null;
    try {
        conn= DriverManager.getConnection(url,user,password);
    } catch (SQLException e) {
        e.printStackTrace();
    }
    return conn;
}

抽取一个方法来释放资源,这里面考虑到资源关闭的可能性,写两个重载的方法

/**
 * 释放资源
 * @param stmt
 * @param conn
 */
public static void close(Statement stmt,Connection conn){
    if (stmt!=null){
        try {
            stmt.close();
        } catch (SQLException e) {
            e.printStackTrace();
        }
    }
    if (conn!=null){
        try {
            conn.close();
        } catch (SQLException e) {
            e.printStackTrace();
        }
    }
}
/**
 *
 * @param rs
 * @param stmt
 * @param conn
 */
public static void close(ResultSet rs,Statement stmt, Connection conn){
    if (rs!=null){
        try {
            rs.close();
        } catch (SQLException e) {
            e.printStackTrace();
        }
    }
    if (stmt!=null){
        try {
            stmt.close();
        } catch (SQLException e) {
            e.printStackTrace();
        }
    }
    if (conn!=null){
        try {
            conn.close();
        } catch (SQLException e) {
            e.printStackTrace();
        }
    }

}

在主类里面如果想要进行jdbc相关的操作,这里以以下例子来讲解如何使用该工具类

需求:

  1. 实现与MySQL数据库db1的连接
  2. 获取db1中的表stu1,并且将其结果封装成对象集合
  3. 然后将各个对象中的值显示出来

这里面先用该工具类与数据库获取连接conn=JDBCUtils.getConnection();//conn为Connection对象

再创建一个类,其成员变量和数据库对应表中的数据类型一样,且应该为private类型的

然后调用Result rs = stmt.executeQuery(sql),获取一个结果集合

最后创建一个List集合,再用rs的next()方法遍历结果集,每一次遍历,用rs.getXXX()获取一个数据,存到对象对应的成员变量中

最后将对象list.add()进集合里面,最后结尾处返回list集合

最后调用工具类的close方法,关闭所有的资源,哪个后开哪个先关

代码:

1.工具类代码:

package JDBCUtils;

import java.io.FileReader;
import java.io.IOException;
import java.net.URL;
import java.sql.*;
import java.util.Properties;

/**
 * JDBC工具类
 */
public class JDBCUtils {
    private static String url;
    private static String user;
    private static String password;
    private static String driver;
    /**
     * 文件的读取只需要读取一次即可拿到这些值。使用静态代码块
     */
    static{
        //读取资源文件,获取值
        //1.创建Properties集合类
        Properties pro=new Properties();
        //2.加载文件
        try {
            //pro.load(new FileReader("src/jdbc.properties"));
            ClassLoader classLoader = JDBCUtils.class.getClassLoader();
            URL resource = classLoader.getResource("jdbc.properties");
            String str=resource.getPath();
            pro.load(new FileReader(str));
            //3.获取数据,赋值
            url=pro.getProperty("url");
            user=pro.getProperty("user");
            password=pro.getProperty("password");
            driver=pro.getProperty("driver");
            //4.注册驱动
            Class.forName(driver);

        } catch (IOException e) {
            e.printStackTrace();
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        }
    }
    /**
     * 获取连接
     * @return 连接对象
     */
    public static Connection getConnection(){
        Connection conn=null;
        try {
            conn= DriverManager.getConnection(url,user,password);
        } catch (SQLException e) {
            e.printStackTrace();
        }
        return conn;
    }


    /**
     * 释放资源
     * @param stmt
     * @param conn
     */
    public static void close(Statement stmt,Connection conn){
        if (stmt!=null){
            try {
                stmt.close();
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }
        if (conn!=null){
            try {
                conn.close();
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }
    }
    /**
     *
     * @param rs
     * @param stmt
     * @param conn
     */
    public static void close(ResultSet rs,Statement stmt, Connection conn){
        if (rs!=null){
            try {
                rs.close();
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }
        if (stmt!=null){
            try {
                stmt.close();
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }
        if (conn!=null){
            try {
                conn.close();
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }

    }
}

2.主类方法

package zr.jdbc;

import JDBCUtils.JDBCUtils;

import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.ArrayList;
import java.util.List;

public class JdbcDemo1 {
    public static  Connection conn=null;

    public static Statement stmt= null;
    public static ResultSet rs=null;
    public static void main(String[] args){
        List<emp> list = new JdbcDemo1().findAll();
        System.out.println(list);
        System.out.println(list.size());
    }

    public static List<emp> findAll(){
        conn=JDBCUtils.getConnection();
        String sql="select * from stu1";
        List<emp> list=new ArrayList<emp>();
        try {
            stmt = conn.createStatement();
            rs = stmt.executeQuery(sql);
            emp xemp=null;
            while(rs.next()){
                int id = rs.getInt("id");
                int balance=rs.getInt("balance");
                String name=rs.getString("name");
                xemp=new emp();
                xemp.setId(id);
                xemp.setBalance(balance);
                xemp.setName(name);
                list.add(xemp);
            }
        } catch (SQLException e) {
            e.printStackTrace();
        }finally {
            JDBCUtils.close(rs,stmt,conn);
        }

        return list;
    }
}

 

3.配置文件写法

url=jdbc:mysql:///db1?serverTimezone=UTC
user=root
password=root
driver=com.mysql.cj.jdbc.Driver

创在src目录下面

4.对象类为:

package zr.jdbc;

public class emp {
    private int id;
    private int balance;
    private String name;



    public void setId(int id) {
        this.id = id;
    }

    public void setBalance(int balance) {
        this.balance = balance;
    }

    public void setName(String name) {
        this.name = name;
    }



    public int getId() {
        return id;
    }

    public int getBalance() {
        return balance;
    }

    public String getName() {
        return name;
    }
    @Override
    public String toString() {
        return "emp{" +
                "id=" + id +
                ", balance=" + balance +
                ", name='" + name + '\'' +
                '}';
    }

}

 

 

 

 

 

 

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值