JDBC概述

API

JDBC(Java DataBase Connectivity,java数据库连接)是一种用于执行SQL语句的Java API,可以为多种关系数据库提供统一访问,它由一组用Java语言编写的类和接口组成。JDBC提供了一种基准,据此可以构建更高级的工具和接口,使数据库开发人员能够编写数据库应用程序。

要想彻底了解JDBC首先就必须要搞清楚JDBC的API到底有什么。

JDBC的API主要都被存放在java.sql和javax.sql中,前者是Java核心包而后者是扩展包,java类库是Java发布之初就确定了的基础库,而javax类库则是在上面增加的一层东西,就是为了保持版本兼容要保存原来的,但有些东西有了更好的解决方案,典型的就是awt(Abstract Windowing ToolKit) 和swing。

一般而言,我们在程序设计中使用较多的是java.sql而非javax.sql。java.sql类库中包含的是一些接口和方法

java.sql常用API

DriverManager 类

建立与驱动程序的连接

Driver 接口

提供用来注册和连接基于 JDBC 技术(“JDBC驱动程序”)的驱动程序的 API,通常仅由 DriverManager 类使用

Connection 接口

提供创建语句以及管理连接及其属性的方法

Statement

用于发送基本 SQL 语句

PreparedStatement

PreparedStatement:用于发送准备好的语句或基本 SQL 语句(派生自 Statement)

CallableStatement

用于调用数据库存储过程(派生自 PreparedStatement)

ResultSet 接口

获取和更新查询的结果

Date 类

SQL DATE 的映射关系

SQLData 接口

指定 UDT 到此类的一个实例的映射关系

形象记忆

你可以将客户端和服务器想象成一条河的两岸,那么为了使两岸之间有联系,我们就需要根据河的宽度来架桥,而与这条河相对应架起的这座桥我们称之为DriverManager;而要通过桥进行两岸的贸易往来就必须要进行聘请搬运工来搬运双方交易的货物,这样的搬运工我们称他们为Connection;这种搬运工假设有高度的自主能动性,能够根据两岸的具体需求来搬运相应的货物,而这种行为的发生是由于它们有一个叫Statement的大脑神经元,这个神经元可以自由地控制搬运工的行为发生;为了存储搬运工辛苦成果,两岸必须各自建立一个存储货物的仓库,我们叫它ResultSet。

它们之间的关系大概就是这样的:

连接数据库

基本步骤

1.加载数据库连接相应的驱动类

2.调用数据库接口,建立数据库连接

3.创建数据库具体的操作对象

4.设计要运行的SQL语句

5.收集处理结果集

6.关闭JDBC对象及其相关的类

重点说明

NO1.注册驱动程序的三种方法:

一、Class.forName("com.microsoft.sqlserver.jdbc.SQLServerDriver");

通过Class把类先装载到java的虚拟机中,并没有创建Driver类的实例。

二、DriverManager.registerDriver(new com.microsoft.sqlserver.jdbc.SQLServerDriver());

jdbc是使用桥的模式进行连接的,即桥连接。DriverManager就是管理数据库驱动的一个类,java.sql.Driver就是一个提供注册数据库驱动的接口,而com.microsoft.sqlserver.jdbc.SQLServerDriver()是 java.sql.Driver接口的一个具体实现。

三、System.setProperty("jdbc.drivers", "com.microsoft.sqlserver.jdbc.SQLServerDriver");

多个驱动使用冒号分隔开,在连接时JDBC会按顺序搜索,直到找到第一个能成功连接指定URL的驱动程序。

推荐使用第一种方法,理由有两点:

1.第一种方法的好处在于能够在编译时不依赖于特定的JDBC Driver库,也就是减少了项目代码的依赖性,而且也很容易改造成从配置文件读取JDBC配置,从而可以在运行时动态更换数据库连接驱动,而第二种方法则不可以这样做,它一定要有JDBC的驱动才可以通过编译,这样对我们的程序就有很多的坏处,尤其是为以后换数据库带来麻烦。

2.我们通过Driver类的源码可以了解到,Driver类中就有一个静态的代码块,只要我们执行了Driver类中的静态代码块,并把驱动的实例放入到Drivers的一个数组列表中,我们再调用方法registerDriver就相当于又向Drivers列表中放了一次Driver驱动,虽然这并不影响我们程序,但是这样做实在是没有必要,反而会影响程序的运行。事实上第二种和第三种方法都要创建Driver类实例。

NO2.调用接口,建立连接:

Connection conn=DriverManager.getConnection("jdbc:sqlserver://localhost:1433;DatabaseName=Pet", "sa", "123456");

jdbc:sqlserver类似于网络协议,让Java知道要干什么;localhost:1433是主机地址及端口,让java知道目标在哪儿;后面的就是数据库的表名,用户名,密码,没有这些,数据库就会不理睬Java的请求。

NO3.创建一个Statement对象:

Statement state=conn.createStatement();

PreparedStatement pst=conn.prepareStatement(sql);

上面提供了两种方法用来创建Statement对象,凡是要向数据库发送SQL语句时,都需要创建Statement接口或者PreparedStatement接口。PreparedStatement:预编译的Statement接口,具体操作步骤如下

第一步:通过连接获得PreparedStatement接口对象,用带占位符(?)的sql语句构造。

PreparedStatement ps=con.praperedStatement("select * from Pet where id=?");

第二步:设置参数

ps.setString(1,"3");

第三步:执行sql语句

rs= ps.executeQuery();

PreparedStatement(预编译)的优点:

a.执行SQL语句使用预编译的方式。Statement直接将SQL语句发送到数据库。PreparedStatement安全性要更高一些。

b.使用占位符的方式拼接SQL中的参数,SQL更加的简洁。

除此之外,如果执行多条只有参数值不同SQL语句时,预编译的PreparedStatement执行效率会明显比非预编译的Statement高许多。

所以在实际操作中应当尽可能地使用预编译。

NO4.导入SQL语句到对象中并返回结果:

String sql="select*from msg";

ResultSet rs=state.executeQuery(sql);//返回一个查询到的结果集

ResultSet rs2=state.executeUpdate(sql);//返回值为 int 型,表示影响记录的条数

NO5.收集返回的结果集:

executeQuery(sql)用于执行DQL数据查询语言,通过使用select语句返回一个结果集ResultSet,而后再遍历得到查询结果 ;

ResultSet.next()会根据下标来获取数据,与数组不同的是数据库中第一条记录的下标是1而非0;

executeUpdate(sql)则用于执行DML数据操作语言(增加,删除,修改,返回int,表示语句影响行数);

NO6.解除与数据库的连接:

尤其要注意close()的顺序!

要按先 ResultSet ,再Statement,最后Connetction的顺序关闭资源。因为ResultSet和Statement在连接的情况下才能使用,所以在连接使用结束后可能还有其他的Statement还在连接,所以不能先关闭Connection。

再借用之前举的例子,你想啊,如果桥上的搬运工还没搬完货物就先把桥撤了会怎么样。

实战演练

JDBCDemo01连接数据库

那些被注释掉的代码可以试着解除注释运行一下,会发现新的大陆。

import java.sql.Connection;

import java.sql.DriverManager;

import java.sql.ResultSet;

import java.sql.SQLException;

import java.sql.Statement;

/**

* 数据库连接步骤

* @author Administrator

*

*/

public class JDBCDemo01 {

public static void main(String[] args) throws ClassNotFoundException, SQLException {

//加载数据库连接的驱动类

Class.forName("com.microsoft.sqlserver.jdbc.SQLServerDriver");

//数据库的接口

Connection conn=

DriverManager.getConnection("jdbc:sqlserver://localhost:1433;DatabaseName=Pet",

"sa", "123456");

//SQL语句(数据)处理的接口

// DQL数据查询语言(查询,返回结果集)

// DML数据操作语言(增加,删除,修改,返回int,表示语句影响行数)

//创建具体操作对象

Statement state=conn.createStatement();

String sql="select*from msg";

//执行SQL语句,返回结果集

ResultSet rs=state.executeQuery(sql);

//使用循环遍历结果集中的数据

while(rs.next()){

//根据下标获取数据,下标是从1开始(列数)

//System.out.println(rs.getString(1)+

//" "+rs.getString(2));

//根据列名取数据

System.out.println(rs.getString("id")+" "+

rs.getString("info"));

}

//关闭JDBC对象及其相关类

rs.close();

state.close();

conn.close();

//System.out.println(conn);

}

}

感谢您的阅读

jdbc是java语言编写的类和接口_JDBC——Java语言连接数据库的标准相关推荐

  1. Redox随笔(1)-用Rust语言编写的类UNIX操作系统

    Redox是一个用Rust语言编写的类UNIX操作系统 , 它的目标是把Rust语言的创新带入到一个现代的微内核和全系列的应用程序. https://www.redox-os.org/zh/docs/ ...

  2. IEnumeratorTItem和IEnumerator Java 抽象类和普通类、接口的区别——看完你就顿悟了...

    IEnumerable 其原型至少可以说有15年历史,或者更长,它是通过 IEnumerator 来定义的,而后者中使用装箱的 object 方式来定义,也就是弱类型的.弱类型不但会有性能问题,最主要 ...

  3. Java泛型教程–示例类,接口,方法,通配符等

    泛型是Java编程的核心功能之一,它是Java 5中引入的.如果您使用的是Java Collections ,并且版本5或更高版本,则可以肯定使用了它. 在集合类中使用泛型非常容易,但是它提供了比仅创 ...

  4. Redox随笔(2)-用Rust语言编写的类UNIX操作系统

    与其他操作系统相比,Redox如何 我们与其他操作系统有很多共同之处. 由于 Redox syscall接口是Unix-y.例如,我们有open, pipe, pipe2, lseek, read, ...

  5. ASP.NET的App_Code中放置不同语言编写的类

    ASP.NET程序的App_Code文件夹下放置的类可被自动编译成一个程序集,页面中所有使用该程序集中的类和方法都会自动调用并更新,维护起来极为方便.但是,该文件夹下的类只能用一种语言编写,Visua ...

  6. (OJ)Java面向对象-编写汽车类

    编写汽车类 Problem Description 1.实验目的(1) 熟悉类的创建方法(2) 掌握对象的声明与创建(3) 能利用面向对象的思想解决一般问题2.实验内容 编写一个java程序,设计一个 ...

  7. Java基础-day06-抽象类和接口

    抽象类 概述: 使用abstract关键字修饰的类就是抽象类 特点: 这种类不能被创建对象,它就是用来做父类的,被子类继承的 格式 修饰符 abstract class 类名{} 抽象类中的成员 成员 ...

  8. java封装对象实体类_Java 接口自动化系列--实体类之entity封装

    实体包entity下面有4个类,主要存放java对象,每个类必须有私有属性,空参构造,get set方法 具体excel中数据信息见---工具类excel文章 1.API类 解析excel中接口信息的 ...

  9. c语言编写程序x的y次方,C语言变为编程y = x-x立方/ 3! + x五次方力量/ 5! -x7th power / 7!...

    这似乎不对,但是无论如何,我只是想补充一个问题,如果可以的话,您能再帮我一次吗? 您不能采用它,但不要说我的代码是错误的!结果留在那里,我自己看了一下. 它不是正整数(x)的序列,被写了n次,怎么可能 ...

最新文章

  1. spcontent------spcollection.add(field)
  2. windows下安装pygtk报g_assertion_message无法定位libglib-2.0-0.dll错误解决
  3. p,br,hn,b,i,u,s,sup,sub标签
  4. UltiDev Cassini Web Server介绍
  5. C#线程同步(1)- 临界区&Lock .
  6. 【IDEA】IDEA 下一些 编码技巧
  7. 《财产》评最受尊重公司:苹果第一谷歌第二
  8. 各大浏览器保存密码的文件
  9. tensorflow和keras的关系
  10. 如何在两年内做出一个Apache顶级开源数据库——乔嘉林
  11. ant下载与本地配置
  12. BUGKU-CTF-MISC-一个普通的压缩包
  13. Unity3D自动旋转屏幕
  14. 哪个品牌的触控笔质量好?ipad好用的触控笔
  15. Mac Office Word设置多级标题
  16. html表单新增类型,HTML5表单设计——新增输入类型和新增表单属性
  17. 职称计算机和英语免试条件,广东省职称计算机考试免考条件_免试条件规定
  18. 【树莓派】 Python点灯程序的编写、部署、开机运行
  19. MySql :分表、分库、分片和分区
  20. 【博主告白】沁园春·新年

热门文章

  1. mybatis不等于某个字符串的值_MyBatis 的 4 个妙用,别再踩坑了!
  2. 语言中要输出表格_C语言 | 表格输出若干人的信息
  3. java二重循环计数_java的二重循环代码样例
  4. Java访问对象的属性和行为
  5. java集合基础_java常用集合基础知识
  6. mysql5.0.19_CentOS下升级MySQL5.0.19到5.5
  7. 改变php二维数组的值_php如何修改二维数组中的值?
  8. 语言五子棋无ai程序框图_微软多语言预训练模型T-ULRv2登顶XTREME排行榜
  9. delphi if多个条件_判断(if)语句
  10. 【性能测试】性能测试的基础理论