学习Java JDBC,看这篇就够了
JDBC (Java DB Connection)---Java数据库连接
JDBC是一种可用于运行SQL语句的JAVA API(ApplicationProgramming Interface应用程序设计接口)。它由一些Java语言编写的类和界面组成。
JDBC为数据库应用开发者和数据库前台工具开发者提供了一种标准的应用程序设计接口,使开发者能够用纯JAVA语言编写完整的数据库应用程序。
JDBC代表JAVA数据库连接。
它是一个软件层,同意开发人员在JAVA中编写client/server应用。
一、ODBC到JDBC的发展历程
ODBC是OpenDatabaseConnectivity的英文简写。
它是一种用来在相关或不相关的数据库管理系统(DBMS)中存取数据的,用C语言实现的,标准应用程序数据接口。通过ODBCAPI。应用程序能够存取保存在多种不同数据库管理系统(DBMS)中的数据,而不论每一个DBMS使用了何种数据存储格式和编程接口。
1.ODBC的结构模型
ODBC的结构包含四个主要部分:应用程序接口、驱动器管理器、数据库驱动器和数据源。
应用程序接口:屏蔽不同的ODBC数据库驱动器之间函数调用的区别。为用户提供统一的SQL编程接口。
驱动器管理器:为应用程序装载数据库驱动器。
数据库驱动器:实现ODBC的函数调用,提供对特定数据源的SQL请求。假设须要,数据库驱动器将改动应用程序的请求,使得请求符合相关的DBMS所支持的文法。
数据源:由用户想要存取的数据以及与它相关的操作系统、DBMS和用于訪问DBMS的网络平台组成。
尽管ODBC驱动器管理器的主要目的是载入数据库驱动器,以便ODBC函数调用,可是数据库驱动器本身也运行ODBC函数调用,并与数据库相互配合。
因此当应用系统发出调用与数据源进行连接时。数据库驱动器能管理通信协议。当建立起与数据源的连接时,数据库驱动器便能处理应用系统向DBMS发出的请求。对分析或发自数据源的设计进行必要的翻译。并将结果返回给应用系统。
2.JDBC的诞生
自从Java语言于1995年5月正式发布以来,Java风靡全球。出现大量的用java语言编写的程序。当中也包含数据库应用程序。因为没有一个Java语言的API,编程人员不得不在Java程序中添加C语言的ODBC函数调用。这就使非常多Java的优秀特性无法充分发挥,比方平台无关性、面向对象特性等。随着越来越多的编程人员对Java语言的日益喜爱。越来越多的公司在Java程序开发上投入的精力日益添加,对java语言接口的訪问数据库的API的要求越来越强烈。也因为ODBC的有其不足之处。比方它并不easy使用。没有面向对象的特性等等,SUN公司决定开发一Java语言为接口的数据库应用程序开发接口。
在JDK1.x版本号中,JDBC仅仅是一个可选部件。到了JDK1.1发布时,SQL类包(也就是JDBCAPI)就成为Java语言的标准部件。
二、JDBC技术概述
JDBC是一种可用于运行SQL语句的JavaAPI(ApplicationProgrammingInterface。应用程序设计接口)。
通过使用JDBC,开发者能够非常方便地将SQL语句传送给差点儿不论什么一种数据库。
也就是说,开发者能够不必写一个程序訪问Sybase,写还有一个程序訪问Oracle。再写一个程序訪问Microsoft的SQLServer。
用JDBC写的程序能够自己主动地将SQL语句传送给对应的数据库管理系统(DBMS)。不但如此,使用Java编写的应用程序能够在不论什么支持Java的平台上执行,不必在不同的平台上编写不同的应用。Java和JDBC的结合能够让开发者在开发数据库应用时真正实现“WriteOnce。RunEverywhere。”
Java具有健壮、安全、易用等特性。并且支持自己主动网上下载,本质上是一种非常好的数据库应用的编程语言。它所须要的是Java应用怎样同各种各样的数据库连接,JDBC正是实现这样的连接的关键。
JDBC扩展了Java的能力。如使用Java和JDBCAPI就能够发布一个Web页,页中带有能訪问远端数据库的Ap plet。或者企业能够通过JDBC让所有的职工(他们能够使用不同的操作系统。如Windwos。Machintosh和UNIX)在In tranet上连接到几个全球数据库上,而这几个全球数据库能够是不同样的。随着越来越多的程序开发者使用Java语言。对Java訪问数据库易操作性的需求越来越强烈。
JDBC API定义了一组用于与数据库通信的接口和类。
这些接口和类位于java.sql包中。
JDBC是用来(让我们的程序)通过网络来操作数据库的,作用非常重要;JDBC技术也是Java核心技术之中的一个。
凡是须要用网络操作数据库的程序,JDBC编程有问题,一切都是白搭。
三、JDBC技术及使用具体解释
从结构图中能够看出。通过JDBC API 让我们的Java应用程序能够利用JDBCDriver Manager[JDBC驱动管理],连接到JDBC驱动;体如今我们的project中也就是要导入驱动jar包。
何谓驱动?
不同的数据库厂商或者同一厂商的不同数据库版本号都会提供不同的驱动。不论什么应用程序都是通过这个驱动来操作特定厂商、特定版本号的数据库的。
使用JDBC的第一步就是要注冊(载入)这个驱动。
JDBC驱动程序的分类
第一类JDBC驱动程序是JDBC-ODBC桥再加上一个ODBC驱动程序。
这类驱动一般不用如今的编程应用中。
第二类JDBC驱动程序是部分JAVAAPI代码的驱动程序,用于把JDBC调用转换成主流数据库API的本机调用。
第三类JDBC驱动程序是面向数据库中间件的纯JAVA驱动程序,JDBC调用被转换成一种中间件厂商的协议。中间件再把这些调用转换到数据库API。
第四类JDBC驱动程序是直接面向数据库的纯JAVA驱动程序。
是使用JDBC驱动程序訪问数据库的首选方式
通过JDBC操作数据库——步骤:
第1步:注冊驱动 (仅仅做一次)
第2步:建立连接(Connection)
第3步:创建运行SQL的语句(Statement)
第4步:运行语句
第5步:处理运行结果(ResultSet)
第6步:释放资源
使用JDBC第一步:载入驱动
注冊驱动有三种方式:
1. Class.forName(“com.mysql.jdbc.Driver”);
推荐这样的方式,不会对详细的驱动类产生依赖
2. DriverManager.registerDriver(com.mysql.jdbc.Driver);
会对详细的驱动类产生依赖
3. System.setProperty(“jdbc.drivers”, “driver1:driver2”);
尽管不会对详细的驱动类产生依赖;但注冊不太方便。所以非常少使用
使用JDBC第二步:建立连接
通过Connection建立连接,Connection是一个接口类。其功能是与数据库进行连接(会话)。
建立Connection接口类对象:
Connection conn =DriverManager.getConnection(url, user, password);
当中URL的格式要求为:
JDBC:子协议:子名称//主机名:port/数据库名?属性名=属性值&…
如:"jdbc:mysql://localhost:3306/test“
user即为登录数据库的username,如root
password即为登录数据库的密码,为空就填””
使用JDBC第三步:创建运行对象
运行对象Statement负责运行SQL语句。由Connection对象产生。
Statement接口类还派生出两个接口类PreparedStatement和CallableStatement,这两个接口类对象为我们提供了更加强大的数据訪问功能。
创建Statement的语法为:
Statement st = conn.createStatement();
使用JDBC第四步:运行SQL语句
运行对象Statement提供两个经常使用的方法来运行SQL语句。
executeQuery(Stringsql),该方法用于运行实现查询功能的sql语句。返回类型为ResultSet(结果集)。
如:ResultSet rs =st.executeQuery(sql);
executeUpdate(Stringsql),该方法用于运行实现增、删、改功能的sql语句,返回类型为int,即受影响的行数。
如:int flag = st.executeUpdate(sql);
使用JDBC第五步:处理运行结果
ResultSet对象
ResultSet对象负责保存Statement运行后所产生的查询结果。
结果集ResultSet是通过游标来操作的。
游标就是一个可控制的、能够指向随意一条记录的指针。
有了这个指针我们就能轻易地指出我们要对结果集中的哪一条记录进行改动、删除,或者要在哪一条记录之前插入数据。一个结果集对象中仅仅包括一个游标。
使用JDBC 第六步——释放资源
Connection对象的close方法用于关闭连接,并释放和连接相关的资源。
使用JDBC——模板
一些重要的接口----------------------------------------------------------------------------------------------------
PreperedStatement接口
PreperedStatement从Statement扩展而来。
须要多次运行SQL语句,能够使用PreparedStatement。
PreparedStatement能够对SQL语句进行预编译
而且能够存储在PreparedStatement对象中。当多次运行SQL语句时能够提高效率。
作为Statement的子类,PreparedStatement继承了Statement的全部函数。
创建PreperedStatement
PreparedStatementstr=con.prepareStatement("update user set id=? where username=?”);//此处?为通配符
其它的CRUD方法和Statement基本一致。
CallableStatement接口
CallableStatement类继承了PreparedStatement类,他主要用于运行SQL存储过程。
在JDBC中运行SQL存储过程须要转义。
JDBC API提供了一个SQL存储过程的转义语法:
{call<procedure-name>[<arg1>,<arg2>, ...]}
procedure-name:是所要运行的SQL存储过程的名字
[<arg1>,<arg2>, ...]:是相相应的SQL存储过程所须要的參数
ResultSetMeta接口
前面使用ResultSet接口类的对象来获取了查询结果集中的数据。
但ResultSet功能有限,假设我们想要得到诸如查询结果集中有多少列、列名称各自是什么就必须使用ResultSetMeta接口了。
ResultSetMeta是ResultSet的元数据。
元数据就是数据的数据, “有关数据的数据”或者“描写叙述数据的数据”。
ResultSetMeta的使用
获得元数据对象
ResultSetMetaData rsmd=rst.getMetaData();
返回全部字段的数目
public int getColumCount() throwsSQLException
依据字段的索引值取得字段的名称
public String getColumName (int colum)throws SQLException
依据字段的索引值取得字段的类型
public String getColumType (int colum)throws SQLException
PreperedStatement接口和Statement的差别
(1) 使用Statement发送和运行sql语句
Statement stmt = con.creatStatement();//载入时,无參数。不编译sql语句
String sql = "selete * from emp";
ResultSet rs = stmt.executeQuery(sql);//运行时编译sql语句。返回查询结果集
(2) 使用PreparStatement发送和运行sql语句
String sql = "selete * from emp";
PreparStatement ps=con.prepareStatement(sql);//载入时就编译sql语句
ResultSet rs = ps.executeQuery();//此处运行时,不须要传參
还有就是
Statement stmt;支持能够通过字符串拼接(来传递參数),如StringdeleteStu = "delete from student where id="+id;但easySQL注入
PreparedStatement ps; 不支持字符串拼接,提供?通配符传递參数。更安全;如String deleteStu = "delete from student where id=?
";
ps.setInt(1, id); //设置第一个?通配值为id
JDBC事务
何谓事务?
所谓事务是指一组逻辑操作单元,使数据从一种状态变换到还有一种状态。
事务的ACID属性:
1. 原子性(Atomicity):指事务是一个不可切割的工作单位,事务中的操作要么都发生。要么都不发生。
2. 一致性(Consistency)事务必须使数据库从一个一致性状态变换到另外一个一致性状态。
3. 隔离性(Isolation)事务的隔离性是指一个事务的运行不能被其它事务干扰。
4. 持久性(Durability)持久性是指一个事务一旦被提交。它对数据库中数据的改变就是永久性的,接下来的其它操作和数据库故障不应该对其有不论什么影响。
JDBC中使用COMMIT 和 ROLLBACK语句来实现事务。
COMMIT用于提交事务,ROLLBACK用于数据库回滚。
通过这两个语句能够确保数据完整性。数据改变被提交之前预览;将逻辑上相关的操作分组。
RollBack语句数据改变被取消使之再一次事务中的改动前的数据状态能够被恢复。
为了让多个 SQL 语句作为一个事务运行,基本步骤为:
先调用 Connection 对象的 setAutoCommit(false); 以取消自己主动提交事务。
然后在全部的 SQL 语句都成功运行后,调用 commit();
假设在出现异常时,能够调用 rollback();使方法回滚事务。
JTA事务
在实际应用中常常会涉及到多个数据源的不同的连接,而且数据的操作要处于一个事务之中。
如去银行进行转账,转账的两个账户是不同的银行,当然数据的操作就跨数据库了,或者叫处于不同的数据源之中。
跨越多个数据源的事务,就要使用JTA容器实现事务。
在分布式的情况下的JTA容指的是Web容器,大家很熟悉的Tomcat不能实现JTA的操作。
眼下支持JTA的容器有很著名的BEA公司的 Weblogic,IBM公司的WebSphere等企业级的Web应用server。
JTA分成两阶段提交
第一步。通过JNDI在分布式的环境中查找相关资源。
javax.transaction.UserTransactiontx = (UserTransaction)ctx.lookup(“jndiName");
tx.begin()
第二步,提交
tx.commit();
学习Java JDBC,看这篇就够了的更多相关文章
- Python GUI之tkinter窗口视窗教程大集合(看这篇就够了) JAVA日志的前世今生 .NET MVC采用SignalR更新在线用户数 C#多线程编程系列(五)- 使用任务并行库 C#多线程编程系列(三)- 线程同步 C#多线程编程系列(二)- 线程基础 C#多线程编程系列(一)- 简介
Python GUI之tkinter窗口视窗教程大集合(看这篇就够了) 一.前言 由于本篇文章较长,所以下面给出内容目录方便跳转阅读,当然也可以用博客页面最右侧的文章目录导航栏进行跳转查阅. 一.前言 ...
- Vue学习看这篇就够
Vue -渐进式JavaScript框架 介绍 vue 中文网 vue github Vue.js 是一套构建用户界面(UI)的渐进式JavaScript框架 库和框架的区别 我们所说的前端框架与库的 ...
- .NET Core实战项目之CMS 第二章 入门篇-快速入门ASP.NET Core看这篇就够了
作者:依乐祝 原文链接:https://www.cnblogs.com/yilezhu/p/9985451.html 本来这篇只是想简单介绍下ASP.NET Core MVC项目的(毕竟要照顾到很多新 ...
- C#实现多级子目录Zip压缩解压实例 NET4.6下的UTC时间转换 [译]ASP.NET Core Web API 中使用Oracle数据库和Dapper看这篇就够了 asp.Net Core免费开源分布式异常日志收集框架Exceptionless安装配置以及简单使用图文教程 asp.net core异步进行新增操作并且需要判断某些字段是否重复的三种解决方案 .NET Core开发日志
C#实现多级子目录Zip压缩解压实例 参考 https://blog.csdn.net/lki_suidongdong/article/details/20942977 重点: 实现多级子目录的压缩, ...
- [转帖]Zookeeper入门看这篇就够了
Zookeeper入门看这篇就够了 https://my.oschina.net/u/3796575/blog/1845035 Zookeeper是什么 官方文档上这么解释zookeeper,它是一个 ...
- net core体系-web应用程序-4asp.net core2.0 项目实战(CMS)-第二章 入门篇-快速入门ASP.NET Core看这篇就够了
.NET Core实战项目之CMS 第二章 入门篇-快速入门ASP.NET Core看这篇就够了 原文链接:https://www.cnblogs.com/yilezhu/p/9985451.ht ...
- ASP.NET Core WebApi使用Swagger生成api说明文档看这篇就够了
引言 在使用asp.net core 进行api开发完成后,书写api说明文档对于程序员来说想必是件很痛苦的事情吧,但文档又必须写,而且文档的格式如果没有具体要求的话,最终完成的文档则完全取决于开发者 ...
- ExpandoObject与DynamicObject的使用 RabbitMQ与.net core(一)安装 RabbitMQ与.net core(二)Producer与Exchange ASP.NET Core 2.1 : 十五.图解路由(2.1 or earler) .NET Core中的一个接口多种实现的依赖注入与动态选择看这篇就够了
ExpandoObject与DynamicObject的使用 using ImpromptuInterface; using System; using System.Dynamic; names ...
- 【转】ASP.NET Core WebApi使用Swagger生成api说明文档看这篇就够了
原文链接:https://www.cnblogs.com/yilezhu/p/9241261.html 引言 在使用asp.net core 进行api开发完成后,书写api说明文档对于程序员来说想必 ...
- 任务21 :了解ASP.NET Core 依赖注入,看这篇就够了
DI在.NET Core里面被提到了一个非常重要的位置, 这篇文章主要再给大家普及一下关于依赖注入的概念,身边有工作六七年的同事还个东西搞不清楚.另外再介绍一下.NET Core的DI实现以及对实例 ...
随机推荐
- oracle查看列数据类型
select * from user_tab_columns where table_name = upper('表名')
- Git:非Fast forward下的合并(--no-ff方式的git merge)
创建dev分支,并且修改readme.txt的内容,然后提交 使用git merge --no-ff -m "说明内容" 分支名称合并分支 使用git log --graph -- ...
- Oracle12c CDB架构图
- mac bash 下使用vi 快捷方式——因为没有alt键 所以没有办法 用vi模式也非常方便的
set -o emacs ##切到emacs模式 set -o vi ##切到vi模式 set -o ## 查看当前选项的设置状态 所以你只需要在.bashrc下加入 set -o vi 然后,使用E ...
- Struts 2 初步入门(六)之处理结果类型
Struts2 处理流程: 用户请求--->struts框架--->Action控制器--->struts框架--->视图资源 xml配置文件里: <result nam ...
- MakeFile中export的使用
在shell中,可以使用export修改当前进程的环境变量. 例如:export PATH=.:$PATH 将当前路径加入可执行文件查找路径(PATH)中,这样你就不要敲“./excutable” 来 ...
- POJ 2456 Agressive cows(二分)
POJ 2456 Agressive cows 农夫 John 建造了一座很长的畜栏,它包括N (2≤N≤100,000)个隔间,这 些小隔间的位置为x0,...,xN-1 (0≤xi≤1,000,0 ...
- hdu1695
题解: 莫比乌斯反演 设f[i]=Σgcd(i,j)%z==0 则f[i]=Σgcd(i,j)==zd 成莫比乌斯反演关系 代码: #include<cstdio> #include< ...
- EF-使用迁移技术让程序自动更新数据库表结构
承接上一篇文章:关于类库中EntityFramework之CodeFirst(代码优先)的操作浅析 本篇讲述的是怎么使用迁移技术让程序自动通过ORM框架将模型实体类结构映射到现有数据库,并新增或修改与 ...
- python 最小二乘拟合,反卷积,卡方检验
import numpy as np # from enthought.mayavi import mlab ''' ogrid[-1:5:6j,-1:5:6j] [array([[-1. ], [ ...