JDBC基础

ODBC(Open Database Connectivity)开放数据库连接。ODBC和JDBC(Java Database Connectivity)很像,严格来说,应该是JDBC模仿了ODBC的设计。ODBC也允许应用程序通过一组通用的API访问不同的数据库管理系统,从而使得基于ODBC的应用程序可以在不同的数据库之间切换。同样,ODBC也需要各数据库厂商提供相应的驱动程序,而ODBC则负责管理这些驱动程序。
JDBC驱动通常有如下4种类型:

  • 第1种JDBC驱动:称为JDBC-ODBC桥,这种驱动是最早实现的JDBC驱动程序,主要目的是为了快速推广JDBC。这种驱动将JDBC API映射到ODBC API。这种方式在Java 8中已经被删除了。早期为了让Java程序操作Access这种伪数据库,可能需要使用JDBC-ODBC桥,但JDBC-ODBC桥不适合在并发访问数据库的情况下使用,其固有的性能和扩展能力非常有限。基本上Java应用也很少使用Access这种伪数据库。
  • 第2种JDBC驱动:直接将JDBC API映射成数据库特定的客户端API。这种驱动包含特定数据库的本地代码,用于访问特定数据库的客户端。
  • 第3种JDBC驱动:支持三层结构的JDBC访问方式,主要用于Applet阶段,通过Applet访问数据库。
  • 第4种JDBC驱动:是纯Java的,直接与数据库实例交互。这种驱动是智能的,它知道数据库使用的底层协议。这种驱动是目前最流行的JDBC驱动。
    通常建议选择第4种JDBC驱动,这种驱动避开了本地代码,减少了应用开发的复杂性,也减少了产生冲突和出错的可能。如果对性能有严格的要求,则可以考虑使用第2种JDBC驱动,但使用这种驱动,则势必增加编码和维护的困难。

在这里插入图片描述

JDBC - Mysql 8.0连接测试

在安装Mysql过程中会提示安装Connector/j,其中包含适应Mysql版本的JDBC连接驱动
在这里插入图片描述
将其导入到项目中(如果没有此驱动,可去mysql官网下载),并删除之前的驱动
为了方便管理,在项目下新建一个目录,将驱动jar包复制到该目录下来,在libs右键选择Add as Library…,将包引入工程。
在这里插入图片描述
运行还是有问题:
在这里插入图片描述
在这里插入图片描述
之前版本的驱动类的 全限定名为 com.mysql.jdbc.Driver, 较新版本的驱动类的包结构发生了改变,全限定名变为 com.mysql.cj.jdbc.Driver , 更改即可
在这里插入图片描述

解决时区问题:解决此问题只需要在原 url 后附加 serverTimezone=UTC
在这里插入图片描述

private static String url = "jdbc:mysql://localhost:3306/你的库?useSSL=false&serverTimezone=UTC";

成功
在这里插入图片描述
MySQL 5的示例
在这里插入图片描述
在这里插入图片描述

详解JDBC API中的对象

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
ResultSet的getString方法几乎可以获取除Blob之外的任意类型列的值,因为所有的数据类型都可以自动转换成字符串类型。
在这里插入图片描述

测试:
在这里插入图片描述

import java.sql.*;

public class ConnMySql {
    public static void main(String[] args) throws Exception {
        Class.forName("com.mysql.cj.jdbc.Driver");
        try(
                Connection conn = DriverManager.getConnection("jdbc:mysql://127.0.0.1:3306/crashcourse?useSSL=true&serverTimezone=UTC", "root", "19950320zzr");
                Statement stmt = conn.createStatement();
                ResultSet rs = stmt.executeQuery("select * from vendors"))
        {
            while(rs.next()){
                System.out.println(rs.getInt(1)+"\t"+rs.getString(2)+"\t"
                        +rs.getString(3)+"\t"+rs.getString(4)+"\t"
                        +rs.getString(5)+"\t"+rs.getString(6)+"\t"
                        +rs.getString(7));
            }
        } catch (SQLException e){
            e.printStackTrace();
        }
    }
}

在这里插入图片描述
可以使用absolute、previous、afterLast等方法自由移动记录指针的ResultSet被称为可滚动的结果集。从Java 5.0后,默认打开的ResultSet就是可滚动的结果集。可更新的结果集需要满足:所有数据都应该来自一个表,选出的数据集必须包含主键列。
在JDK 1.4以前,默认打开的都是不可滚动的,必须在创建Statement或PreparedStatement时传入额外的参数。
resultSetType控制ResultSet的类型。

  • ResultSet.TYPE_FORWARD_ONLY:该常量控制指针只能向前移动。JDK 1.4以前的默认值
  • ResultSet.TYPE_SCROLL_INSENSITIVE:该常量控制记录指针可以自由移动,但底层数据的改变不会影响ResultSet的内容
  • ResultSet.TYPE_SCROLL_SENSITIVE:该常量控制记录指针可以自由移动,但底层数据的改变会影响ResultSet的内容
    resultSetConcurrency控制Result的并发类型。
  • ResultSet.CONCUR_READ_ONLY:该常量指示ResultSet是只读的并发模式,默认
  • ResultSet.CONCUR_UPDATEBLE:该常量指示ResultSet是可更新的并发模式,默认

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
处理Blob类型数据
Blob通常用于存储大文件。如果要将图片插入数据库,显然不能通过普通SQL完成,需要使用PreparedStatement,该对象的setBinarySteam(int parameterIndex, InputStream x)可以为指定参数传入二进制输入流,从而可以实现将Blob数据保存到数据库的功能。可以调用ReulstSet的getBlob(int columnIndex)方法,返回一个Blob对象。Blob对象提供getBinarySteam方法获取该Blob数据的输入流,也可以使用Blob对象提供的getBytes方法直接取出该Blob对象封装的二进制数据。

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

CallableStatement调用存储过程,通过Connection的prepareCall方法来创建CallableStatement对象。通过CallableStatement的setXxx方法传入参数值,使用registerOutParameter方法注册存储过程返回值。执行后,通过getXxx方法来获取指定传出参数的值。

//存储过程
delimiter //
create procedure add_pro(a int, b int, out sum int)
beign
set sum = a+ b;
end;
//
CallableStatement cstmt = conn.prepareCall("{call add_pro(?, ?, ?)");
cstmt.setInt(1,4);
cstmt.setInt(2,5);
//注册第三个参数是int类型
cstmt.registerOutParameter(3, Types.INTEGER);
//执行存储过程
cstmt.execute();
//获取传出值
System.out.println(cstmt.getInt(3));

数据库连接池

数据库连接池是Connection对象得工厂,JDBC的数据库连接使用javax.sql.DataSource来表示,DataSource只是一个接口,该接口通常由商用服务器(如WebLogic、WebSphere)等提供实现,也有一些开源组织提供实现(如DBCP和C3P0等)。DataSource通常被称为数据源,它包含连接池和连接池管理两个部分。

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

MySQL必知必会读书笔记

Logo

快速构建 Web 应用程序

更多推荐