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

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。

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

0a765429a64032c3bafc006e4da4b0d2.png

连接数据库

基本步骤

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);

}

}

感谢您的阅读

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/571886.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

怎样判断电饭锅温度传感器的好坏?_空调温度传感器的作用与检测。

温度传感器是指对温度进行感应,并将感应的温度变化情况转换为电信号的功能部件。我们在练习温度传感器检测代换之前,要先对温度传感器的安装位置、结构特点和工作原理有一定的了解。1、温度传感器的安装位置及结构在空调器室内机中,通常设有两…

java去掉图片边框颜色_sharp 去除图片边框

trim接受参数是颜色相似度, 并不能指定边框颜色, 所以有可能会误删除内容, 需要注意trim 需要转为buffer或者文件后再次操作, 否则图片信息不变从剪裁效果来看, 精度和速度都是可以的const sharp require("sharp");const path "./html/a.png";const outp…

java mail 不用密码_iPhone 无需越狱,简单给 App 加密码锁

在手机上总有些小秘密,也有些APP不想被打开。由于iOS本身限制,想给APP加上密码锁,一般都是需要越狱才能实现。其实在iOS 12就加入了【屏幕使用时间】,用来更好设置APP使用时间的限额。屏幕使用时间屏幕时间功能可以协助您了解自己…

spark内存溢出怎么解决_和平精英:更新需要预留6G内存,玩家抱怨手机扛不住,怎么解决?...

嗨,小伙伴们大家好呀!《和平精英》新版本终于来了哈,小伙伴们在22号上午登录游戏,就可以收到更新提示,点击进行更新就好了。或者是在各个应用商店里等待更新推送,也行哦!但是呢,每到…

【转】LDA数学八卦

转自LDA数学八卦 在 Machine Learning 中,LDA 是两个常用模型的简称: Linear Discriminant Analysis 和 Latent Dirichlet Allocation, 在这篇文章中我们主要八卦的是后者。LDA 是一个在文本建模中很著名的模型,类似于 SVD, PLSA …

电脑字体模糊_小红书上传视频模糊?做小红书视频99%的工具都在这了

到现在小红书视频号功能已经上线快三个月了,越来越多的小伙伴开始拍视频、创作视频笔记,但是对于新接触视频的小伙伴来说,拍摄视频好像是一件很难的事,特别是不清楚该选择什么拍摄设备、不知道怎么剪辑视频,还有如何上…

谷歌浏览器不能上网_谷歌浏览器插件下载及安装教程!

emmm......这篇文章的内容非常小白,相信大部分人都会这个基本操作。但是阁主相信还有些妹子操作不来,如果还没有男朋友,那不是铁定不会安装谷歌浏览器插件么?其实“谷歌浏览器插件”这个组合,可以解决很多问题&#xf…

高级技巧之Lambda表达式

1.Lambda表达式简介 其本质上是一种匿名方法,它既没有方法名,也即没有访问修饰符和返回值类型,使用它来编写代码将会更加简洁,也更加易读。 2.使用该表达式需要配置的数据 3.传统java和使用Lambda表达式的对比 0)总结&…

设计模式之——Builder建造模式

Builder模式又叫建造模式,是用于组装具有复杂结构的实例的模式。 示例程序是编写一个文档,并且写入到文件中,该文档具有以下结构,含有标题,字符串,一些条目。 Builder抽象类,为建造模式的核心pa…

java程序员_Java和Python的区别 好程序员帮大家解读

Java和Python的区别 好程序员今天先来解读Java编程语言的优势,人工智能和大数据火爆一时,随之而来,引起了编程语言的人气暴涨。而Java和Python作为最炙手可热的编程语言从一开始便赢得了众多程序员的青睐。凭借各自强大的性能和优势&#xff…

门户网站运营方案_网络营销方案涉及的工作内容有哪些

问:在公司从事网络营销推广工作,想问下要撰写网络营销方案,要涉及到哪些层面,工作内容有哪些呢?答:总的来说,网络营销方案涉及到:网站技术,市场营销,网络应用…

用宝塔本地搭建php,Windows系统如何使用宝塔面板一键快速搭建本地服务器环境(LNMP/LAMP)...

宝塔面板宝塔面板类似于wamp,xampp等一键集成环境。但是宝塔面板操作更简单,更新更快。个人建议使用宝塔替代wamp。(LNMP等环境不再赘述,请自行百度。建议使用LNMP环境,即NginxMySQLPHP环境)下载前往宝塔面板官网https://www.bt.c…

C# File类的操作

File类,是一个静态类,主要是来提供一些函数库用的。静态实用类,提供了很多静态的方法,支持对文件的基本操作,包括创建,拷贝,移动,删除和打开一个文件。File类方法的参量很多时候都是…

lstm需要优化的参数_LSTM的物理结构和一些细节

海晨威:一幅图真正理解LSTM的物理结构​zhuanlan.zhihu.com这个是网上看的最多的图了,但是在理解lstm的应用过程中的时候这个图带来了不少麻烦。展开之后实际的物理结构是这样的,1、2图同颜色的点代表了同一个东西;问题1&#xff…

OLED中的Demura

OLED作为一种电流型发光器件已越来越多地被应用于高性能显示中。由于它自发光的特性,与LCD相比,AMOLED具有高对比度、超轻薄、可弯曲等诸多优点。但是,亮度均匀性和残像仍然是它目前面临的两个主要难题,要解决这两个问题&#xff…

python的编程模式有哪两种_python程序的两种运行方式是什么

python程序的两种运行方式是什么 第一种方式:REPL 所谓REPL即read、eva、print、loop(读取、计算、打印、循环),实现REPL运行方式有以下两种: 1、IDLE( 集成开发环境或集成开发和学习环境)是Pyt…

halcon 旋转_Halcon视觉软件应该如何系统学习?

End 声明:部分内容来源于网络,仅供读者学习、交流之目的。文章版权归原作者所有。如有不妥,请联系删除。

JavaScript--关于变量提升思考

下面例子仅仅是思考变量提升使用: 在实际开发中并不推荐使用相同名字的变量和函数! 1 // 如果变量和函数同名的话,函数优先提升 2 console.log(a); 3 function a() { 4 console.log(aaaaa); 5 } 6 var a 1; 7 console.log(a); 更多简单经典…

C++求复数的角度_【研读.教材分析】“勾股定理”教学——基于单元整体的角度再思考...

(西安市第八十六中学 刘丽丽)学科教学要注重知识的“生长点”和“延伸点”,把课时知识置于学科整体逻辑体系中,关注结构和通法,处理好局部与整体之间的关系。所以在北师大版八年级上册数学第一章《勾股定理》的备课中,我再次以问…

vc++64位系统下long的长度为4个字节_Java与系统硬件的亲密接触「伪共享」

作者:码洞来源:https://zhuanlan.zhihu.com/p/32764602在解释【伪共享】这个概念之前,我们先来运行一段代码,小编的电脑上有4个core。这个程序的逻辑是4个线程共享同一个数组读写不同下标的变量。每个线程循环1亿次读写&#xff0…