JDBC
JDBC 是什么?
Java DateBase Connectivity (Java语言连接数据库)
JDBC的本质是什么?
- JDBC是SUN公司制定的一套接口(interface)
- 接口都有调用者和实现者
- 面向接口编程调用,面向接口写实现类,这些都属于面向接口编程
角色分类
服务器 (db):
- 接收 sql
- 执行 sql
- 返回结果
客户端 (java):
- 接收数据
- 组装sql
- 发送SQL(与数据库建立联系)
- 分析结果
面向接口编程
为什么要面向接口编程?
- 解耦合:降低程序的耦合度,提高程序的扩展力
java 制定标准 ,不同的数据库厂商实现 接口即可。java 中提供的接口 java.sql.* 包下,常用接口如下:
接口名称 | 作用 |
---|---|
java.sql.Connection | 连接 |
java.sql.Statement | 静态处理块 |
java.sql.PreparedStatement | 预处理块 |
java.sql.ResultSet | 结果集 |
java.sql.ResultSetMetaData | 结果集元信息 |
oracle 厂商实现接口 (jar)
D:\oracleexe\app\oracle\product\11.2.0\server\jdbc\lib\ojdbc6.jar 视安装路径而定
处理块
静态处理块 Statement
Statement 是 Java 执行数据库操作的一个重要接口,用于在已经建立数据库连 接的基础上,向数据库发送要执行的 SQL 语句。Statement 对象,用于执行不带参数 的简单 SQL 语句。
执行静态 SQL 语句并返回它所生成结果的对象。
**特点:**处理 不变的静态的 sql 语句
优点: 直接查看sql ,方便处理错误
缺点:性能不高 拼接 sql 麻烦 可能存在 sql 注入
预处理块 PreparedStatement
PreparedStatement 接口继承了 Statement,并与之在两方面有所不同:有人
主张,在 JDBC 应用中,如果你已经是稍有水平开发者,你就应该始终以
PreparedStatement 代替 Statement.
也就是说,在任何时候都不要使用 Statement。
由于 PreparedStatement 对象已预编译过,所以其执行速度要快于 Statement
对象。因此,多次执行的 SQL 语句经常创建为 PreparedStatement 对象,以提高效率。
特点** :处理 不变的静态的 sql 语句 |可变的 sql 语句 带 ? 的 sql
优点:性能高,方便编写sql 不存在sql注入 安全
缺点:不能直接打印sql语句 不方便处理错误
JDBC实现步骤
前提: 先去Oracle数据库安装路径下,获取到ojdbc6.jar 拿到项目中,新建一个资源文件夹,objc6.java放进去,点击右键build path->add to build path
- 1.加载驱动
- 硬编码: new oracle.jdbc.driver.OracleDriver();
- 软编码: class.forName(“oracle.jdbc.driver.OracleDriver”) 通过反射加载驱动,不用创建对象,在配置文件中设置属性,代码更加灵活 —>推荐使用
- 2.获取连接
- 3.准备sql
- 4.获取处理块 (打包发送)
- 5.执行完毕得到结果,接收结果集
- 6.处理数据
- 7.关闭
package com.shsxt.jdbc01;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
public class JDBCSimpleDemo01 {
public static void main(String[] args) throws ClassNotFoundException, SQLException {
//1.加载驱动(选择哪一个数据库)
Class.forName("oracle.jdbc.OracleDriver");
//2.获取连接(与数据库连接上)
Connection conn=DriverManager.getConnection("jdbc:oracle:thin:@localhost:1521:xe", "SCOTT", "TIGER");
//3.准备sql
String sql="select empno,ename from emp"; //注意:sql语句后面不要添加分号;
//4.获取处理块 (打包发送)
Statement state=conn.createStatement();
//5.执行完毕得到结果,接收结果集
ResultSet result=state.executeQuery(sql);
//6.处理数据
while(result.next()){
int i=result.getInt(1);
String name=result.getString("ename");
System.out.println(i+"-->"+name);
}
//7.关闭
result.close();
state.close();
conn.close();
}
}
/*
连接到数据库后查询到的结果:
7369-->SMITH
7499-->ALLEN
7521-->WARD
7566-->JONES
7654-->MARTIN
7698-->BLAKE
7782-->CLARK
7839-->KING
7844-->TURNER
7900-->JAMES
7902-->FORD
7934-->MILLER
*/