JDBC基础
使用jdbc已经是好几年前的事情了,JDBC现在用的人很少,一些ORM持久层框架已经对其进行了很好的封装和扩展,例如Hibernate或者mybatis,更方便在程序当中去使用。
而JDBC作为JAVA数据库连接的基础API,是java实现数据访问的基础,因此掌握它还是很有必要的,趁着最近学习mybatis就顺便把jdbc的相关内容也整理下。
一、JDBC的基础
1. JDBC的定义
JDBC(Java Database Connectivity,java数据库连接)是一种用于执行SQL语句的java API,可以为多种关系型数据库提供统一访问。
JDBC本身是java语言的组成内容。
jdbc API的包:
java.sql
javax.sql
JDBC接口(API)包括两个层次:
- 面向应用的API:java API,一系列抽象接口,供应用程序开发人员使用(连接数据库,执行SQL语句,获得结果)。
- 面向数据库的API: Java Driver API, 供开发商开发数据库驱动程序用。
2.JDBC的作用
JDBC使我们用Java语言编写的软件具备和数据库交互的能力。
二、JDBC的应用
1. 加载和注册驱动程序Driver
-
Java.sql.Driver 接口是所有 JDBC 驱动程序需要实现的接口。这个接口是提供给数据库厂商使用的,不同数据库厂商提供不同的实现
-
在程序中不需要直接去访问实现了 Driver 接口的类,而是由驱动程序管理器类(java.sql.DriverManager)去调用这些Driver实现。
所用组件:DriverManager,该类是驱动程序管理器类,负责管理驱动程序。
实现方式:
- 方式一:
Class.forName(driverClass);
//加载oracle驱动
Class.forName("oracle.jdbc.driver.OracleDriver");
//加载MySql驱动
Class.forName("com.mysql.jdbc.Driver);
- 方式二:
Driver driver = new DriverImpl(); //例如oracle的oracleDriver, mysql的Driver
DriverManager.registerDriver(driver);
//通常不用显示调用该方法来注册驱动程序类的实例,因为Driver接口的驱动程序类都包含了静态代码块,在这个静态代码块中,会调用该方法来注册自身的一个实例。
- 方式三:
-Djdbc.drivers=oracle.jdbc.driver.OracleDriver
2. 建立连接,获取Connection
组件:Connection,代表数据库连接对象,表示通信上下文,与数据库的所有通信都建立在此连接上。
- 方式一:
Connection conn = DriverManager.getConnection( url,user,password);
/*
URL定义了连接数据库时的协议、自协议、数据源标识
书写形式:协议:子协议:数据源标识
协议:在JDBC中总是以jdbc开始
子协议:是桥连接的驱动程序或是数据库管理系统名称
数据源标识:标记找到数据来源的地址与连接端口
例如(mysql):jdbc:mysql://localhost:3306/test?userUnicode=true&characterEncoding=utf8
(oracle): jdbc:oracle:thin:@localhost:1521:test
*/
- 方式二:
Driver driver = new DriverImpl(); //例如oracle的oracleDriver, mysql的Driver
Connection conn = driver.connect(url,pro);
3. 定义SQL语句
4. 创建Statement/PreparedStatement/CallableStatement对象
组件:Statement,用于把SQL语句发送到数据库。特点:该对象用于执行静态的SQL语句,并且返回执行结果。
Statement stmt = conn.createStatement();
组件:PreparedStatement,用于执行动态SQL语句并进行预编译
//和数据库交互,传输sql语句到数据库,sql语句接下来在数据库内编译、优化好等着进一步执行;
PreparedStatement pstmt = conn.prepareStatement(sql);
组件:CallableStatement,用于执行对存储过程的调用
CallableStatement cstmt = conn.prepareCall(sql);
5. 执行SQL语句
//到此 stmt 已经存在了,但它还没有把 SQL 语句传递到 DBMS。我们需要提供 SQL 语句作为参数提供给我们使用的 Statement 的方法
boolean execute(sql); //用于执行返回多个结果集、多个更新计数或二者组合的语句。
int executeUpdate(sql); //用于执行INSERT、UPDATE、DELETE语句以及DDL语句
ResultSet stmt.executeQuery(sql); //用于执行查询数据库的SQL语句,返回一个结果集对象
6. 获取结果
1).执行更新返回的是本次操作影响到的记录数。
2).执行查询返回的结果是一个ResultSet对象。
- ResultSet包含符合SQL语句中条件的所有行,并且它通过一套get方法提供了对这些行中数据的访问。
• 使用结果集(ResultSet)对象的访问方法获取数据
while(rs.next()){
String name = rs.getString("name") ;
String pass = rs.getString(1) ; // 此方法比较高效
}
//列是从左到右编号的,并且从列1开始
7. 关闭JDBC对象
操作完成以后要把所有使用的JDBC对象全都关闭,以释放JDBC资源,关闭顺序和声明顺序相反:
1、关闭记录集
2、关闭声明
3、关闭连接对象
if(rs != null){ // 关闭记录集
try{
rs.close() ;
}catch(SQLException e){
e.printStackTrace() ;
}
}
if(stmt != null){ // 关闭声明
try{
stmt.close() ;
}catch(SQLException e){
e.printStackTrace() ;
}
}
if(conn != null){ // 关闭连接对象
try{
conn.close() ;
}catch(SQLException e){
e.printStackTrace() ;
}
}
至此,JDBC的所有步骤全部完成。