JDBC&连接池

本文介绍了JDBC的基本概念和连接步骤,包括注册驱动、获取连接、创建SQL执行环境等,并深入探讨了预编译功能和数据库连接池的重要性,强调了开启预编译缓存以提高性能,同时分析了数据库连接池的工作原理和实现考虑的因素。
摘要由CSDN通过智能技术生成

1、JDBC概述

JDBC是sun公司提供的,用来访问数据库的一套规范接口。主要由Connection、Statement、PreparedStatement、ResultSet四大接口组成。数据库厂商要想让Java应用程序来访问自己的数据库,就必须按规范来实现JDBC的接口,把自己的驱动程序注册进来。简单来说,JDBC对程序员来说是API,对数据库厂商来说是接口规范。

2、JDBC的连接步骤(以mysql数据库为例)

注册驱动 → 获取连接 → 创建sql执行环境 → 使用mysql协议传输数据 → 返回结果集 → 关闭连接
a、注册驱动
/**
 *注册mysql数据源驱动
 */
Class.forName("com.mysql.jdbc.Driver");

注册数据库驱动这一句代码足够了。因为mysql自己实现的java.sql.Driver接口中只存在几行静态代码块,加载Driver的类对象时,静态代码块执行,调用registerDriver()方法自动注册驱动。而且继续追溯源码可以知道,DriverManager中的Driver对象都放在Object类型的数组snapShot中,添加驱动的方法是 addIfAbsent()注册的驱动是不会重复的,即当要注册的驱动已经存在时,不会再继续添加。

public class Driver extends NonRegisteringDriver implements java.sql.Driver {
    //
    // Register ourselves with the DriverManager
    //
    static {
        try {
            java.sql.DriverManager.registerDriver(new Driver());
        } catch (SQLException E) {
            throw new RuntimeException("Can't register driver!");
        }
    }
 
    /**
     * Construct a new driver and register it with DriverManager
     *
     * @throws SQLException
     *             if a database error occurs.
     */
    public Driver() throws SQLException {
        // Required for Class.forName().newInstance()
    }
}
b、获取连接

通过DriverManager这个类的静态方法getConnection(url,userName,password)获取连接,每次获取连接,会遍历驱动管理中的所有驱动,直到返回一个正确的connection对象,否则获取连接失败。也就是,url如下填写,DriverManager会选择一个合适的驱动来生成一个数据库连接。

/**
 * Attempts to establish a connection to the given database URL.
 * The <code>DriverManager</code> attempts to select an appropriate driver from
 * the set of registered JDBC drivers.
 */
 Connection connection =  DriverManager.getConnection("jdbc:mysql://localhost:3306/testa?useSSL=false&useUnicode=true&characterEncoding=utf8,"root","123456");

c、创建sql执行环境

sql执行环境指的是PreparedStatement实例,可以从一个连接对象中取得。源码如下

PreparedStatement preparedStatement = connection.prepareStatement(sql);

获取sql执行环境很简单,但是mysql-connector-java-5.1.47版本(目前我们的工程中使用的版本)是不支持预编译功能的,需要通过useServerPrepStmts=true参数开启。开启预编译,先把带占位符“?”的sql语句发送给数据库解析,再把参数的值传过去执行得到结果,有两次网络传输用时。若不开启,会直接把参数代替占位符传给数据库执行。我们可以先不使
用userServerPreStmts=true开启预编译功能,执行 select 查询,查看sql执行日志如下:

62 Que
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值