JDBC
文章目录
学习目标
1 JDBC
JDBC (Java DataBase Connection) —> Java数据库连接
JDBC是一种可用于执行SQL语句的JAVA API(ApplicationProgramming Interface应用程序设计接口)。它由一些Java语言编写的类和界面组成
它是一个软件层,允许开发者在JAVA中编写客户端/服务器应用
2 角色分类
数据库
- 接收sql
- 执行sql
- 返回结果
java
- 接收数据
- 组装 sql
- 发送SQL(与数据库建立联系)
- 分析结果
3 面向接口编程
java 制定标准 ,不同的数据库厂商实现 接口即可。
java 中提供的接口 java.sql.* 包下,常用接口如下
接口名 | 作用 |
---|---|
java.sql.Connection | 连接 |
java.sql.Statement | 静态处理块 |
java.sql.PrepareStatement | 预处理块 |
java.sql.ResultSet | 结构集 |
java.sql.ResultSetMetaData | 结构集云信息 |
oracle 实现接口(jar包)
ojdbc6.jar
4 JDBC 步骤
java数据库连接步骤:
1、加载驱动(完整路径)
2、建立连接(url、用户名、密码)
3、创建处理块(Statement 或 PrepareStatement)
4、执行
execute(ddl)
int executeUpdate(dml)
ResultSet executeQuery(select)
5、分析结果
ddl:没有异常
dml:0
select:分析结果集
6、释放资源(.close)
核心为拼接SQL、操作结果、分析结果
5 连接
1 准备工作
- 引入驱动包,加载驱动
- 构建路径 build path
- 测试用户是否正确登录
2 建立连接
驱动:oracle.jdbc.driver.OracleDriver
加载驱动:
1、软编码:
class.forName(oracle.jdbc.driver.OracleDriver);
2、硬编码:
Driver driver = new oracle.jdbc.driver.OracleDriver();
url:jdbc.oracle.thin:@db 服务器地址:端口:实例
连接url:
jdbc.oracle.thin:@localhost:1521:XE
(本地用户登录)
用户名:SCOTT
密码:TIGER
建立连接:
Connection connection = DriverManager.getConnection("url","用户名","密码");
Connection connection = DriverManager.getConnection("jdbc:oracle:thin:@localhost:1521:XE","SCOTT ","TIGER");
6 处理块
静态处理块Statement
statement 是java执行数据库操作是一个重要接口,用于在已经建立数据库连接的基础上,向数据库发送要执行的 SQL 语句
Statement 对象,用于执行不带参数的简单 SQL 语句
执行静态 SQL 语句并返回它所生成结果的对象。
创建
Statement statement = connection.createStatement();
执行
ddl :execute(ddl语句) ---- 通常不在代码中执行
dml:executeUpdate(dml语句) ---- 包括 insert update delete
select:executeQuery(select)
String sql = "update emp set sal=5000 where empno =7369";
result = statement.executeUpdate(sql);
String sql = "select empno,ename,sal from emp where empno = 7369";
resultSet = statement.executeQuery(sql);
特点
处理不变的静态的sql语句
优点:直接查看sql,方便处理错误
缺点:性能不高,拼接sql麻烦,存在sql注入
预处理块preparedStatement
PreparedStatement 接口继承了 Statement
由于 PreparedStatement 对象已预编译过,所以其执行速度要快于 Statement对象。因此,多
次执行的 SQL 语句经常创建为 PreparedStatement 对象,以提高效率。
创建
PreparedStatement ps = connection.prepareStatement(sql);;
执行
存在 ?
,先填充参数在执行
ddl :execute()
dml:executeUpdate()
select:executeQuery()
String updateEmpSql = "update emp set sal=?,comm=?,deptno=? where empno=? ";
ps = connection.prepareStatement(updateEmpSql);
ps.setDouble(1,emp.getSal());
ps.setDouble(2,emp.getComm());
ps.setLong(3,emp.getDeptno());
ps.setLong(4,emp.getEmpno());
result = ps.executeUpdate();
String queryEmpSql = "select empno,ename,job,mgr,deptno,comm,sal,hiredate from emp " + "where empno = ?";
ps = connection.prepareStatement(queryEmpSql);
ps.setLong(1,empNo);
resultSet = ps.executeQuery();
特点
处理不变的静态的 sql 语句 ,可变的 sql 语句, 带 ? 的 sql
优点:性能高,方便编写sql, 不存在sql注入 ,安全
缺点:不能直接打印sql语句, 不方便处理错误
7 分析
执行完SQL 语句后可能成功也可能失败,如果成功,有数据则我们很大一部分情况是需要获取查询的结果
ddl:没有异常就是成功
dml:结果>0就是成功
select:分析结果集
对于 select 的结果集进行分析,类似于迭代器, 先判断(移动)再获取
while (resultSet.next()){
System.out.println(resultSet.getLong("empno")
+ "," + resultSet.getString("ename")
+ "," + resultSet.getDouble("sal"));
}
8 释放资源
释放资源的原则是 :先打开的后关闭
顺序一般为: 结果集 --> 处理块 --> 连接
实例
静态处理块 + executeUpdate(sql)
import java.sql.*;
public static void main(String[] args) {
//创建Connection对象、Statement静态处理块对象、结果
Connection connection = null;
Statement statement = null;
int result = 0;
try {
//载入驱动
Class.forName("oracle.jdbc.driver.OracleDriver");
//建立连接(本地,用户名SCOTT,密码TIGER)
connection = DriverManager.getConnection(
"jdbc:oracle:thin:@localhost:1521:XE","SCOTT","TIGER");
//获取静态处理块
statement = connection.createStatement();
//定义sql语句
String sql = "update emp set sal=5000 where empno =7369";
//执行sql语句,获取结果
result = statement.executeUpdate(sql);
//打印结果分析
System.out.println("更新结果--->"+result);
} catch (ClassNotFoundException e) {
e.printStackTrace();
} catch (SQLException throwables) {
throwables.printStackTrace();
}finally {
//关闭处理块
if(null != statement){
try {
statement.close();
} catch (SQLException throwables) {
throwables.printStackTrace();
}
}
//关闭连接
if(null != connection){
try {
connection.close();
} catch (SQLException throwables) {
throwables.printStackTrace();
}
}
}
}
预处理块 + executeQuery()
public static void main(String[] args) {
EmpDao empDao =new EmpDao();
System.out.println(empDao.queryEmpByEmpNo(2100L));
}
public class EmpDao {
/**
* 根据雇员编号查询雇员记录
* @param empNo
* @return emp
*/
public Emp queryEmpByEmpNo(Long empNo){
Connection connection = null;
PreparedStatement ps = null;
ResultSet resultSet = null;
Emp emp = null;
try {
Class.forName("oracle.jdbc.driver.OracleDriver");
connection = DriverManager.getConnection(
"jdbc:oracle:thin:@localhost:1521:XE","SCOTT ","TIGER");
String queryEmpSql = "select empno,ename,job,mgr,deptno,comm,sal,hiredate from emp" + "where empno = ?";
ps = connection.prepareStatement(queryEmpSql);
ps.setLong(1,empNo);
resultSet = ps.executeQuery();
if(resultSet.next()){
emp =new Emp();
emp.setEmpno(resultSet.getLong("empno"));
emp.setComm(resultSet.getDouble("comm"));
emp.setDeptno(resultSet.getLong("deptno"));
emp.setEname(resultSet.getString("ename"));
emp.setHiredate(resultSet.getDate("hiredate"));
emp.setJob(resultSet.getString("job"));
emp.setMgr(resultSet.getLong("mgr"));
emp.setSal(resultSet.getDouble("sal"));
}
} catch (Exception e) {
e.printStackTrace();
}finally {
if(null != resultSet){
try {
resultSet.close();
} catch (SQLException throwables) {
throwables.printStackTrace();
}
}
if(null != ps){
try {
ps.close();
} catch (SQLException throwables) {
throwables.printStackTrace();
}
}
if(null != connection){
try {
connection.close();
} catch (SQLException throwables) {
throwables.printStackTrace();
}
}
}
return emp;
}
}