JDBC - 封装工具类(01)

封装工具类

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;

public class JDBCUtil {

    static String driverClass = null;
    static String url = null;
    static String name = null;
    static String password= null;

    static{
        try {
            /*
             * 加载配置文件获得数据库的信息
             */
            Properties properties = new Properties();
            InputStream is = JDBCUtil.class.getResourceAsStream("/jdbc.properties");
            properties.load(is);
            driverClass = properties.getProperty("driverClass");
            url = properties.getProperty("url");
            name = properties.getProperty("name");
            password = properties.getProperty("password");

        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    /**
     * 获得连接
     */
    public static Connection getConn(){
        System.out.println(driverClass);
        Connection conn = null;
        try {
            /*
             * 不再使用 DriverManager.registerDriver(new com.mysql.jdbc.Driver());
             * 因为在com.mysql.jdbc.Driver()类中有一段静态代码块加载了他自己,如果再使用上面的代码会注册两次
             * 使用反射把com.mysql.jdbc.Driver()加载到JVM就自动注册驱动了
             */
            Class.forName(driverClass);
            conn = DriverManager.getConnection(url, name, password);
        } catch (Exception e) {
            e.printStackTrace();
        }
        return conn;
    }

    /**
     * 释放资源
     */
    public static void release(Connection conn , Statement st , ResultSet rs){
        closeRs(rs);
        closeSt(st);
        closeConn(conn);
    }

    //释放结果集
    private static void closeRs(ResultSet rs){
        try {
            if(rs != null){
                rs.close();
            }
        } catch (SQLException e) {
            e.printStackTrace();
        }finally{
            rs = null;
        }
    }

    //释放Statement
    private static void closeSt(Statement st){
        try {
            if(st != null){
                st.close();
            }
        } catch (SQLException e) {
            e.printStackTrace();
        }finally{
            st = null;
        }
    }

    //释放连接
    private static void closeConn(Connection conn){
        try {
            if(conn != null){
                conn.close();
            }
        } catch (SQLException e) {
            e.printStackTrace();
        }finally{
            conn = null;
        }
    }
}
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.Statement;

import com.utils.JDBCUtil;

public class TestUtils {
    public static void main(String[] args) throws Exception {
        Connection conn = JDBCUtil.getConn();
        Statement sta = conn.createStatement();
        String sql = "select * from students";
        ResultSet query = sta.executeQuery(sql);
        while(query.next()){
            String id = query.getString("id");
            String name = query.getString("name");
            String clazz = query.getString("clazz");
            System.out.println(id + "  " + name + "  " + clazz);
        }
        JDBCUtil.release(null, sta, query);
    }
}
driverClass=com.mysql.jdbc.Driver
url=jdbc:mysql://localhost/jdbc-study
name=root
password=root

注册驱动的细节

其实在JDBC4.0之后不再需要写Class.forName(...);因为JDBC4.0之后,驱动包必须在指定位置包含java.sql.Driver文件,这样就可以自动加载驱动。原话如下:

JDBC 4.0 Drivers mustinclude the file META-INF/services/java.sql.Driver. This file contains the name of the JDBC driversimplementation of java.sql.Driver. For example, to load the my.sql.Driver class,the META-INF/services/java.sql.Driver file would contain the entry: 
 my.sql.Driver
Applications no longer need to explicitly load JDBC drivers using Class.forName(). Existing programswhich currently load JDBC drivers using Class.forName() will continue to work withoutmodification. 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值