JDBC,Java的SQL调用级接口.
JDBC隔离了Java与不同数据库之间的对话,使得Java程序无须考虑不同数据库管理系统平台.
JDBC操作数据库的程序具有很好的移植性.
JDBC API中重要的接口和类
DriverManager | 处理驱动调入并且对产生的新的数据库连接提供支持. |
DataSource | 在JDBC2.0 API中被推荐使用代替DriverManager实现和数据库的连接. |
Connection | 代表队特定数据库的连接. |
Statement | 代表一个特定的容器,容纳并执行一条SQL语句. |
ResultSet | 控制执行查询语句得到的结果集. |
JDBC基础操作步骤
1.设置环境(包,数据库)
2.选择合适的JDBC驱动程序
3.分配一个Connection对象
4.分配一个Statement对象
5.用该Statement对象进行查询等操作.
6.从返回的ResultSet对象中获取相应的数据.
7.关闭Connection.
包
任何JDBC的操作都需要java.sql包.
所以至少要 import java.sql.*;
装载驱动器
Class.forName(String driverName);
JAVA规范中明确规定:所有的驱动程序必须在静态初始化代码块中将驱动注册到驱动程序管理器中。
该方法反射返回驱动器Class类实例,并自动调用驱动器管理器DriverManager类中的RegisterDriver方法来注册它.
驱动器类有可能不存在,所以需要捕获Class.forName()抛出的ClassNotFoundException异常.
创建与数据库连接
DriverManager位于JDBC管理层,作用于用户和驱动程序之间.它负责跟踪在一个系统中所有可用的JDBC驱动程序,并在数据库和相应的驱动程序之间建立连接.
DriverManager.getConnection(String url,String username,String password)
DriverManager的静态方法.该方法返回Connection接口的对象.
url:表示JDBC URL
格式: jdbc:子协议:子名称
jdbc:协议,JDBC URL中的协议总是jdbc;
子协议:驱动器名称;
子名称:数据库名称.
如果是位于远程服务器上的数据库,则应包括网络地址,且须遵循命名约定://主机名:端口/数据库名
username:表示数据库用户名.
password:表示数据库用户密码.
例: Connection con=DriverManager.getConnection(url,dbname,dbpassword)
Connection接口
Connection接口有三个方法.分别用来创建向数据库发送SQL语句的三种对象Statement对象,PrepareedStatement对象,CallableStatement对象.
Statement createStatement()
PrepareedStatement prepareStatement()
CallableStatement prepareCall()
Statement接口
Statement:用于简单的SQL语句.
PrepareedStatement:用于带一个或多个参数的SQL语句.
CallableStatement:用于调用存储过程.
Statement,PrepareedStatement,CallableStatement都是接口.
CallableStatement,PreparedStatement是Statement的子接口.
Connection的createStatement方法创建Statement.
Statement stmt=con.createStatement();
Statement使用executeQuery(String sql),executeUpdate(String sql),execute(String sql)方法,将SQL语句作为参数传递给Statement,而操作数据库.
(1)executeQuery用于返回单个结果集.适合SELECT语句
ResultSet rs=stmt.executeQuery(“select * from emp”);
(2)executeUpdate用于操作数据库.适合INSERT,UPDATE,DELETE语句(DML).以及DDL语句.
该方法返回int.若执行DML SQL后,数据库表受影响的行数.若执行DDL SQL,则返回0.
例:
stmt.executeUpdate ("delete from emp where name='scott'");
(3)execute用于任意SQL语句.返回多个结果集,或多个计数,或二者的组合.
例:执行某个已存储过程或动态执行SQL,这时可能会出现多个结果的情况.
结果集ResultSet
(1)使用next()方法
ResultSet对象中含有检索出来的行,期中有一个指示器,只想当前可操作的行,初始状态下指向第一行,以后每一次对next()调用都会将指示器移向下行.
(2)使用getXxx()方法
使用相应类型的getXxx()方法可以从当前行指定列中提取不同的数据类型的数据.
例,若列中数据类型为VARCHAR,则使用getString方法.
若列中数据类型为FLOAT方法,则使用getFloat方法.
getXxx方法的参数有两种(两个函数重载)
getXxx(int i) 表示获取当前行的第i列的数据,该列的数据是Xxx所对应的数据类型.返回的数据类型为Xxx.
getXxx(String name) 表示获取当前行的列名为name的数据,该列的数据是Xxx所对应的数据类型.返回的数据类型为Xxx.
注意:使用getXxx(int i)方法效率略高.
用何种getXxx,JDBC提供了很大的自由度.
例如getInt方法可以提取任何数字,字符类型,提取的数据都将被转化为int.但getInt方法最好只用于提取SQL的Integer类型的数据.像BINARY,DATE,TIME,等类型的对象无法使用getInt方法提取.
元数据接口ResultSetMetaData
ResultSetMetaData是数据库元数据访问接口。此接口是SQL查询语言的一种反射机制。
ResultSetMetaData接口可以通过数组的形式,遍历数据库的各个字段的属性。
得到结果集元数据对象:ResultSetMetaData meta = rs.getMetaData();
获取字段个数 | int count=meta.getColomnCount(); | count就是结果集的列数 |
获取字段名字 | meta.getColumnName(int i); | i为列序号,列从1开始. |
获取字段JDBC类型 | meta.getColumnType(); | |
获取字段数据库类型 | meta.getColumnTypeName(); |
得到数据库元数据对象:DatabaseMetaData dbmd = con.getMetaData();
数据库名 | dbmd.getDatabaseProductName(); | |
数据库版本号 | dbmd.getDatabaseProductVersion(); | |
数据库驱动名 | dbmd.getDriverName() | |
数据库驱动版本号 | dbmd.getDriverVersion(); | |
数据库Url | dbmd.getURL(); | |
数据库登陆名 | dbmd.getUserName(); |
JDBC事务
事务是具备以下特征(ACID)的工作单元:
(1) 原子性
事务的原子性指的是,事务中包含的程序作为数据库的逻辑工作单位,它所做的对数据修改操作要么全部执行,要么完全不执行。
原子操作,也就是不可分割的操作,必须一起成功一起失败。
(2) 一致性
事务的一致性指的是在一个事务执行之前和执行之后数据库都必须处于一致性状态。这种特性称为事务的一致性。假如数据库的状态满足所有的完整性约束,就说该数据库是一致的。
(3) 分离性
分离性指并发的事务是相互隔离的。即一个事务内部的操作及正在操作的数据必须封锁起来,不被其它企图进行修改的事务看到。
(4) 持久性
持久性意味着当系统或介质发生故障时,确保已提交事务的更新不能丢失。即一旦一个事务提交,DBMS保证它对数据库中数据的改变应该是永久性的,耐得住任何系统故障。持久性通过数据库备份和恢复来保证。
JDBC异常处理
JDBC中,和异常相关的两个类是SQLException和SQLWarning。
1. SQLException类:用来处理较为严重的异常情况。
例如① 传输的SQL语句语法的错误;
② JDBC程序连接断开;
③ SQL语句中使用了错误的函数。
SQLException提供以下方法:
getNextException() —— 用来返回异常栈中的下一个相关异常;
getErrorCode() —— 用来返回代表异常的整数代码 (error code);
getMessage() —— 用来返回异常的描述信息 (error message)。
2. SQLWarning类:用来处理不太严重的异常情况,也就是一些警告性的异常。其提供的方法和使用与SQLException基本相似。
import java.sql.Connection;
import java.util.Date;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
public class JDBCTest {
static {
try {
Class.forName("com.mysql.jdbc.Driver");
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
}
private static String url="jdbc:mysql://localhost:3306/mybatisdb?";
public static void main(String[] args) {
Connection con = null;
Statement stmt = null;
ResultSet rs = null;
try {
con = DriverManager.getConnection(url,"root","root");
stmt = con.createStatement();
String sql = "select * from t_user";
rs = stmt.executeQuery(sql);
while(rs.next()){
int id = rs.getInt(1);
String name = rs.getString(2);
Date date = rs.getDate(3);
System.out.println(id+";"+name+";"+date.toString());
}
} catch (SQLException e) {
e.printStackTrace();
}finally{
if (rs != null) {
try {
rs.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
if (stmt != null) {
try {
stmt.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
if (con != null) {
try {
con.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
}
}