JDBC API是一个Java API可以访问任何类型的数据库的数据,尤其是存储在关系数据库中的数据。 JDBC的工作原理与Java在各种平台一样,如Windows,Mac OS和各种版本的UNIX系统
RDBMS关系型数据库(relational database management system),
JDBC代表java与数据库的连接,这对java编程语言和广泛的数据库之间独立于数据库的连接标准的JavaAPI
JDBC库包含的API为每个通常与数据库使用相关联的任务
1)连接到数据库
2)创建SQL语句
3)执行SQL语句
JDBC是一种规范,它提供的接口,一套完整的,可移植的访问底层数据库的程序。可以由Java来写不同类型的可执行文件。
java应用程序
java Applets
java Servlet
JSP
EJBS
所有这些可执行文件就可以使用JDBC驱动程序来访问数据库,并把存储的数据的优势。
JDBC提供了ODBC相同的功能,允许Java程序包含与数据库无关的代码。
JDBC架构
JDBC API支持两层和三层处理模型进行数据库访问,但在一般的JDBC体系结构由两层组成:
JDBC API :提供了应用程序对JDBC的管理连接。
JDBC Driver API:支持JDBC管理到驱动器连接。
JDBC API的使用驱动程序管理器和数据库特定的驱动程序提供透明的连接到异构数据库。
JDBC驱动程序管理器可保正确的驱动程序来访问每个数据源,该驱动管理器能够支持连接到多个异构数据库的多个并发驱动程序。
常见的JDBC组件
DriverManager:这个类管理数据库驱动程序的列表。确定内容是否符合从Java应用程序使用的通信子协议正确的数据库驱动程序的连接请求。识别JDBC在一定子协议的第一个驱动器将被用来建立数据库连接。
Driver:此接口处理与数据库服务器通信,很少直接使用驱动程序(Driver)对象,一般使用DriverManager中的对象,它用于管理此类型的对象。它也抽象与驱动程序对象工作相关的详细信息。
Connection:此接口与接触数据库的所有方法,连接对象表示通信上下文,即,数据库中的所有通信都是通过唯一的对象。
Statement:可以使用这个接口创建的对象的SQL语句提交到数据库,一些派生的接口接受除执行存储过程的参数
ResultSet:这些对象保存从数据库后,执行使用Statement对象中的SQL查询中检索数据,他作为一个迭代器,可以通过移动它来检索下一个数据。
SQLException:这个类用于处理发生在数据库应用程序中任何错误。
创建JDBC程序
导入包
import java.sql.*;
注册JDBC程序
Class.forName("com.mysql.jdbc.Driver");
打开一个连接
//STEP 3: Open a connection
// Database credentials
static final String USER = "root";
static final String PASS = "pwd123456";
System.out.println("Connecting to database...");
conn = DriverManager.getConnection(DB_URL,USER,PASS);
执行一个查询
//STEP 4: Execute a query
System.out.println("Creating statement...");
stmt = conn.createStatement();
String sql;
sql = "SELECT id, first, last, age FROM Employees";
ResultSet rs = stmt.executeQuery(sql);
从结果集中提取数据
//STEP 5: Extract data from result set
while(rs.next()){
//Retrieve by column name
int id = rs.getInt("id");
int age = rs.getInt("age");
String first = rs.getString("first");
String last = rs.getString("last");
//Display values
System.out.print("ID: " + id);
System.out.print(", Age: " + age);
System.out.print(", First: " + first);
System.out.println(", Last: " + last);
}
6. 清理环境资源
//STEP 6: Clean-up environment
rs.close();
stmt.close();
conn.close();
mysql
到数据库mysql的bin文件夹下 输入mysql -uroot -p 然后输出密码 密码默认123456
输入指令的时候记得写分号,要不然不会执行指令。
第一个JDBC实例先暂停一下,有些问题。
**SQLException中的方法** 一个SQLException类既可以发生在驱动程序中也可以发生在数据库中,当这样的异常,SQLException类型的对象将被传递到catch子句中。 通过SQLException对象有以下几种方法可用于获取更多的关于异常的信息。 getErrorCode() getMessage() getSQLState() printStackTrace()
**JDBC是什么** JDBC代表Java数据库连接(Java Database Connectivity),它是Java编程语言和数据库之间的数据库无关的API,换句话说:JDBC是用于在Java语言编程中与数据库连接的API JDBC库包括通常与数据库使用相关,如下面每个任务提到的API 连接到数据库 创建sql语句 执行sql语句 查看和修改结果
JDBC SQL语法
结构化查询SQL是一种标准化语言,允许对数据库进行操作,创建数据记录,读取内容,更新内容和删除数据记录等。
创建数据库
CREATE DATABASE DATABASE_NAME;
删除数据库
DROP DATABASE DATABASE_NAME;
创建表
CREATE TABLES table_name
(
column_name column_data_type,
column_name column_data_type,
column_name column_data_type,
)
示例,创建一个Employees的表
CREATE TABLES Employees(
id INT,
age INT,
fitst varchar(255),
last varchar(255),
)
INSERT数据
INSERT INTO table_name VALUES(column1,column2,...)
查找数据
SELECT colunm_name1,column_name2
FROM table_name
WHERE contiditions;
更新数据
UPDATE table_name
SET column_name1=value,colunm_name2=value,...
WHERE conditions;
JDBC应用程序
导入包
注册JDBC驱动程序
打开一个连接器
执行查询
从结果集中提取数据
清理环境
自己做一个项目才知道实为不易阿 [关于如何导入jar包进行依赖](https://blog.youkuaiyun.com/diligentkong/article/details/79587464)
import java.sql.*;
public class Demo {
static final String JDBC_DRIVER="com.mysql.jdbc.Driver"; //JDBC driver name and database URL
static final String DB_URL="jdbc:mysql://localhost/demo?useSSL=false";
//database用户名和密码
static final String USER="root";
static final String PASS="password";
public static void main(String[] args) {
Connection conn=null; //代表数据库的物理连接
Statement stmt=null; //提交SQL语句到数据库进行查询
try {
//注册JDBC的driver
Class.forName("com.mysql.jdbc.Driver");
//创建一个连接
System.out.println("Connecting to Database...");
conn =DriverManager.getConnection(DB_URL,USER,PASS);
System.out.println("Creating statement..");
stmt=conn.createStatement();
String sql;
sql="SELECT VERSION()";
ResultSet rs=stmt.executeQuery(sql);
//获取并打印数据
while(rs.next()){
System.out.println("This Mysql version is:"+rs.getString(1));
}
rs.close();
stmt.close();
conn.close();
}catch (SQLException e){
e.printStackTrace();
}catch (Exception e){
e.printStackTrace();
}
}
}
JDBC驱动程序是什么
JDBC驱动程序在JDBC api中实现定义的接口,用于与数据库服务器进行交互
例如,使用JDBC驱动程序,可以通过发送SQL或者数据库命令,然后使用Java接受结果来打开数据库连接并与数据库进行交互
JDK附带的java.sql包包含各种类,其类的行为被定义,实现在第三方驱动程序中完成。第三方供应商在其数据库驱动程序中实现java.sql.Driver接口
JDBC数据库连接
导入JDBC包,使用java语言的import语句在java代码的开头导入所需要的类
注册JDBC驱动程序,使JVM将所需的驱动程序实现加载到内存中,从而可满足JDBC的请求
数据库URL配置,创建一个正确格式化的地址,指向要连接到的数据库
创建连接对象,最后调用DriverManager对象的getConnection()方法来建立实际的数据库的连接
导入JDBC包
import告诉Java编译器在哪里找到代码中引用的类,import语句一般放置在源代码的开头,
注册JDBC驱动程序
在使用程序之前,必须注册该驱动程序,注册驱动程序是将Oracle驱动程序的类文件加载到内存中的过程,因为可以将其用作JDBC接口的实现。
只需要在程序中注册一次即可,可以通过两种方式之一来注册程序。
class.forName
注册驱动程序最常见的方法是使用Java的Class.forName()方法,将驱动程序的类文件动态加载到内存中,并将其自动注册,这个方法是推荐使用的方法,因为它使驱动程序注册可配置与携带。
数据库URL配置
加载驱动程序后,可以使用DriverManager.getConnection()方法建立连接。为了方便思考,这里列出三个重载的方法
url在mysql中
jdbc:mysql://localhost/databaseName
关闭JDBC连接
在JDBC程序结束后,显式地需要关闭与数据库的所有连接以结束每个数据库会话,但是,如果在编写程序中忘记了关闭也没有关系,Java垃圾收集器将会在清除对象时也会关闭这些连接。
依靠垃圾收集,特别是数据库编程,是一个非常差的编程实践,所以应该要使用与连接对象关联的close()方法关闭连接。
要确保连接已经关闭,可以将关闭连接的代码编写在finally块中,一个finally块总是会执行,不管是否发生异常
JDBC Statement ,PreparedStatement和CallableStatement语句
当获取了与数据库的连接之后,就可以与数据库交互了。JDBC Statment,CallableStatement和PreparedStatement接口定义了可以发送SQL命令,并从数据库接受属性和方法。
它们还定义了有助于在Java和SQL数据类型的数据类型差异转换的方法。下表提供了每个接口定义,以及这些接口的目的的总结
Statement 用于对数据库进行通用访问,在运行时使用静态SQL语句时很有用,Statement接口不能接受参数
PreparedStatement 当计划要多次使用SQL语句,PreparedStatement接口在运行时接受输入参数
CallableStatement 当想要访问数据库存储过程中使用,CallableStatement接口也可以接受运行时接收参数。
Statement对象
在使用Statement对象执行SQL语句之前,需要用Connection对象的createStatement()方法创一个Statement对象,
在创建Statement对象之后,可以使用它来执行一个SQL语句,它有三个执行方法分别是,
boolean execute(String sql):如果检索到ResultSet对象,则返回一个布尔值true,否则是false。使用此方法执行SQL ddl语句 或需要使用真正动态的SQL,可使用于执行创建数据库,创建SQL语句等。
int executeUpdate(String sql):返回SQL语句执行影响的行数,使用此方法执行预期会影响的多行SQL语句,例如:INSERT UPDATE DELETE 语句
ResultSet executeQuery(String sql):返回一个ResultSet对象,当您希望获得结果集时,请使用此方法,就像用SELECT语句一样。
关闭Statement对象
就像关闭一个Connection对象一样,以保存数据库资源一样,由于同样的原因还应该关闭Statement对象。
一个简单的调用close()方法将执行该作业,如果先关闭Connection对象,它也会关闭Statement对象,但是,应该始终显式关闭Statement对象,以确保正确的处理顺序
PreparedStatement对象
PreparedStatement接口扩展了Statement接口,它添加了比Statement对象更好的一些优点的功能,此语句可以动态的提供/接受参数。
创建PreparedStatement对象
PreparedStatement pstmt =null;
try{
String sql= "Update Employees SET age= ? WHERE id=?",
pstmt =conn.preparedStatement(SQL)
}catch(Exception e){
}
finally{
}
JDBC中所有的参数都由?符号作为占位符,这被称为参数标记,在执行SQL语句之前,必须为每个占位符提供值。
setXXX()方法将值绑定到参数,其中XXX表示要绑定到输入参数的值的Java数据类型,如果忘记拱绑定值,则会抛出一个SQLException
每个参数标记是其它顺序位置引用,第一个标记表示位置1,下一个位置是2等等,该方法与Java数组索引不同,
所有的Statement对象与数据库交互的方法a)execute b)executeQuery() 和 c)executeUpdate() 也可以用于PreparedStatement对象,但是,这些方法被修改为可以使用输入参数的SQL语句。
关闭preparedStatement对象
就像关闭Statement对象一样,由于同样的原因(节省数据库资源)也应该关闭PreparedStatement对象
简单的调用close()方法将执行关闭,如果关闭Connection,它也会关闭PreparedStatement对象,但是,应该始终显式关闭PreparedStatement对象,以保证以正确顺序清理资源。
CallableStatement对象
类似Connection对象创建Statement和PreparedStatement对象一样,它还可以使用同样的方式创建CallableStatement对象,该对象将用于执行对数据库存储过程的调用。
创建CallableStatement对象
关闭CallableStatement对象
**JDBC结果集** sql语句执行后从数据库查询数据,返回的数据放在结果集中,SELECT语句从数据库中选择并在结果集中查看它们的标准方法,java.sql.ResultSet接口表示数据库查询的结果集。 ResultSet对象维护指向结果集中当前行的游标,术语“结果集”是指包含在ResultSet对象中的行和列数据。 ResultSet接口分为三类 浏览方法:用于移动光标 获取方法:用于查看光标指向的当前行列的数据 更新方法:用于更新当前行的列中的数据。在基础数据库中更新数据。
光标可以基于ResultSet的属性移动,当创建生成ResultSet的相应Statement时,将指定这些属性。
查看结果集
ResultSet接口包含数十种获取当前行数据的方法
每个可能的数据类型都有一个get方法,每个get方法都有两个版本。
一个是采用列形式
另一个是采用列索引
public int getInt(String columnName)throws SQLException
返回名为columnName的列中当前行中的int值
public int getInt(int columnIndex)throws SQLException
返回指定列索引当前行的int值,索引从1开始,
JDBC事务
如果JDBC连接处于自动提交模式下,默认情况下,则每个SQL语句在完成后都会提交到数据库,
对于简单的应用程序可能没有问题,但是有三个原因需要考虑是否关闭自动提交的事务,
提高性能
保持业务流程的完整性
使用分布式事务
事务能够能控制,何时更改提交并应用于数据库,它将单个SQL语句或一组SQL语句视为一个逻辑单元,如果任何语句失败,整个事务失败。
要启用手动事务支持,而不是使用JDBC驱动程序默认使用的自动提交模式,请调用Connection对象的setAutoCommit()方法,如果将布尔的false传递给setAutoCommit(),则关闭自动提交,也可以传递一个布尔值true重新打开他
例如,如果有一个名为conn的Connection对象,请将下列代码关闭自动提交
conn.setAutoCommit(false)
提交和回滚
完成更改后,若要提交更改,那么可连接对象上调用commit()方法
conn.commit();
否则,要使用连接名为conn的数据库回滚更新,请使用一下代码
conn.rollback();