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类库中包含的是一些接口和方法
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语言连接数据库的标准的更多相关文章
- Java学习(JDBC java连接数据库)
一.概述 JDBC(Java Data Base Connectivity,java数据库连接)是一种用于执行SQL语句的Java API,可以为多种关系数据库提供统一访问,它由一组用Java语言编写 ...
- JDBC(Java Database Connectivity,Java数据库连接)API是一个标准SQL(Structured Query Language
JDBC(Java Database Connectivity,Java数据库连接)API是一个标准SQL(Structured Query Language,结构化查询语言)数据库访问接口,它使数据 ...
- 已看1.熟练的使用Java语言进行面向对象程序设计,有良好的编程习惯,熟悉常用的Java API,包括集合框架、多线程(并发编程)、I/O(NIO)、Socket、JDBC、XML、反射等。[泛型]\
1.熟练的使用Java语言进行面向对象程序设计,有良好的编程习惯,熟悉常用的Java API,包括集合框架.多线程(并发编程).I/O(NIO).Socket.JDBC.XML.反射等.[泛型]\1* ...
- java语言体系的技术简介之JSP、Servlet、JDBC、JavaBean(Application)
转自:https://zhangkunnan.iteye.com/blog/2040462 前言 Java语言 Java语言体系比较庞大,包括多个模块.从WEB项目应用角度讲有JSP.Servlet. ...
- java jdbc使用配置文件连接数据库:
java jdbc使用配置文件连接数据库: 创建后缀名为:.properties的文件,文件内容包括,数据库驱动.连接的数据库地址.用户名.密码…… 以Mysql为例创建config.properti ...
- JDBC:Java连接数据库的桥梁
JDBC(Java DataBase Connection),java数据库连接,是一种用于执行SQL语句的Java API,可以为多种关系数据库提供统一访问,它由一组用Java语言编写的类和接口组成 ...
- 你必须知道的261个Java语言问题
1. Java语言的运行机制: Java既不是编译型语言也不是解释型语言,它是编译型和解释型语言的结合体.首先采用通用的java编译器将Java源程序编译成为与平台无关的字节码文件(class文件), ...
- Java语言实现通过Ajax抓取后台数据及图片
1.Java语言实现通过Ajax抓取后台数据及图片信息 1.1数据库设计: create table picture( pic_id number not null, pic_name )not nu ...
- JDBC概述及连接数据库
一.JDBC简介: JDBC(Java Data Connectivity,java数据库连接)是一种用于执行sql语句的JavaAPI,可以为多种关系数据库提供统一访问,它由一组用Java语言编写 ...
随机推荐
- PPT领取 | 70+数据科学、架构演进等最佳实践限时放送
上世纪1950年人工智能被提出,直至2016年AlphaGo战胜世界围棋冠军李世石后,人工智能迅速引起了全球的瞩目,并推动起全球科技的浪潮.自动驾驶.人脸识别.语音交互技术等“一拥而上”,众多AI科技 ...
- 电子产品使用感受之——为什么我那么喜欢2015年的11.6寸MacBook Air?
2018年Mac笔记本产品线得到了一次更新,Mac book Pro, MacBook Air更新后的Mac 产品线变得更加让人摸不着头脑,价格昂贵不说,产品分类细化到如此程度,让一个选择困难症的消费 ...
- linux挂载系统ios文件与gcc安装
挂载方法: 1.将iso文件拷贝到某一目录下,(/test) 2.建立挂载点文件夹:mkdir /mnt/iso1 3.进入 mount –o loop /test/**.iso /mnt/is ...
- k8s-N0.4-service
本章目录 k8s中的三种网络 service的构建及参数说明 一 k8s的三种网络 在k8s集群中,k8s是有三种网络类型的,下面我们看一下下面这个图 1 节点网络:顾名思义,节点网络就是你每台物理 ...
- NOIP2018 游记 QAQ
写在前面: 本人初三党.NOIP前两个月不好好停课搞信竞愣是要搞文化课.于是,期中考与NOIP一起凉凉[微笑] 本人写的第一篇NOIP游记,各位大佬们随便看一看就好 Day -n 初赛71,竟然跟wx ...
- what's the 灰盒测试
what's the 灰盒测试 灰盒测试的概念:是一种综合测试的方法,他将白盒测试和黑盒测试结合在一起,构成一种无缝测试技术. 灰盒测试的思想:是基于程序运行时的外部表现又结合程序内部逻辑结构来设计测 ...
- 清除eclipse项目中没用的图片、js、css代码
import java.io.BufferedReader; import java.io.File; import java.io.FileReader; import java.io.IOExce ...
- linux中巧用ctrl-z后台运行程序
我们知道后台运行任务时,可以用 () 和 &,但是有的时候我们会忘记加&,对于执行需要很长时间的任务来说,Ctrl+Z可能是一个比较好的把任务转入后台的方法. 当我们按下Ctrl+Z时 ...
- C++实验三
part2 graph.h #ifndef GRAPH_H#define GRAPH_H// 类Graph的声明 class Graph { public: Graph(char ch, int n) ...
- Lintcode: Knight Shortest Path
Given a knight in a chessboard (a binary matrix with 0 as empty and 1 as barrier) with a source posi ...