21.JDBC的封装

封装数据库链接

  • 在软件中数据库连接使用非常平凡,如果每次都创建链接,就会造成代码的大量冗余

  • 解决这一问题,常规的做法是建立数据库连接工具,封装数据库连接过程,统一数据库连接过程,使用时候就可以简化代码

封装第一版

public class DBUtils {
    public static Connection getConnection() {
        try {
            String driver = "oracle.jdbc.OracleDriver";
            Class.forName(driver);
            String url = "jdbc:oracle:thin:@localhost:1521:orcl";
            String user = "system";
            String password = "admin";
            Connection conn = DriverManager.getConnection(url, user, password);
            return conn;
        } catch (Exception e) {
            e.printStackTrace();
            throw new RuntimeException(e);
        }
    }
}

Properties

  • Java通常将配置文件的扩展名命名为".properties"

  • java.util.Properties就是为了读取 *.properties 文件设计的API,其底层就是文本文件IO

  • Properties本身实现了Map接口,内部是散列表,限定了Key和Value都是String类型

  • 常用方法:

    • void load(流):将文件流中的文件读取为散列表

    • String getProperty(key):查询value,如果没有对应的key,返回null

  • 使用步骤:

    1. 创建Properties对象

    2. 利用load方法读取文件

    3. 利用getProperty查询属性文件的内容

在项目中的reource文件夹中添加配置文件:

在这里插入图片描述

演示:Properties读取resource文件夹中的文件

package demo;

import java.io.IOException;
import java.io.InputStream;
import java.sql.Connection;
import java.util.Properties;

public class Demo03 {
    public static void main(String[] args) throws IOException {
        Properties properties = new Properties();
        System.out.println(properties);
        System.out.println(properties.size());
        System.out.println(properties.isEmpty());
        InputStream in = DBUtils02.class.getClassLoader().getResourceAsStream("db.properties");
        properties.load(in);
        System.out.println(properties);
        System.out.println(properties.size());
        String url = properties.getProperty("jdbc.url");
        System.out.println(url);
    }
}

封装第二版

package demo;

import java.io.IOException;
import java.io.InputStream;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.util.Properties;

public class DBUtils02 {
    static String driver;
    static String url;
    static String username;
    static String password;

    static {
        //初始化静态属性
        //1.利用Properties读取配置文件
        Properties pro = new Properties();
        InputStream in = DBUtils02.class.getClassLoader().getResourceAsStream("db.properties");
        try {
            pro.load(in);
            //2.初始化连接参数
            driver = pro.getProperty("jdbc.driver");
            url = pro.getProperty("jdbc.url");
            username = pro.getProperty("jdbc.username");
            password = pro.getProperty("jdbc.password");
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    public static Connection getConnection() {
        try {
            Class.forName(driver);
            Connection conn = DriverManager.getConnection(url, username, password);
            return conn;
        } catch (SQLException e) {
            e.printStackTrace();
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
			throw new RuntimeException(e);
        }
    }

}

封装第二版说明:

  1. dirver、url、username、password是4个数据库连接参数,因为只需要一份,则定义为静态变量

  2. 静态代码块的目的是从配置文件中读取4个数据库连接参数的值,只读取一次即可

封装第三版:标准版

package demo;

import java.io.IOException;
import java.io.InputStream;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.util.Properties;

public class DBUtils02 {
    private static String driver;
    private static String url;
    private static String username;
    private static String password;

    static {
        //初始化静态属性
        //1.利用Properties读取配置文件
        Properties pro = new Properties();
        InputStream in = DBUtils02.class.getClassLoader().getResourceAsStream("db.properties");
        try {
            pro.load(in);
            //2.初始化连接参数
            driver = pro.getProperty("jdbc.driver");
            url = pro.getProperty("jdbc.url");
            username = pro.getProperty("jdbc.username");
            password = pro.getProperty("jdbc.password");
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    public static Connection getConnection() {
        try {
            Class.forName(driver);
            Connection conn = DriverManager.getConnection(url, username, password);
            return conn;
        } catch (SQLException e) {
            e.printStackTrace();
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
			throw new RuntimeException(e);
        }
    }

    //关闭数据库的连接
    public static void close(Connection conn) {
        if (conn != null) {
            try{
                conn.close();
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }
    }
}

使用封装数据库连接过程的工具类

package demo;

import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;

public class Demo04 {
    public static void main(String[] args) {
        Connection conn = null;
        try {
            conn = DBUtils02.getConnection();
            Statement st = conn.createStatement();
            String sql = "select * from demo";
            ResultSet rs = st.executeQuery(sql);
            while (rs.next()) {
                int id = rs.getInt("id");
                String name = rs.getString("name");
                System.out.println(id + "," + name);
            }   
            rs.close();//释放查询结果
            st.close();//释放语句对象
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            DBUtils02.close(conn);
        }
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值