三分钟让你彻底搞懂 JDBC

JDBC

在这里插入图片描述

学习目标

在这里插入图片描述

1 JDBC

JDBC (Java DataBase Connection) —> Java数据库连接

JDBC是一种可用于执行SQL语句的JAVA API(ApplicationProgramming Interface应用程序设计接口)。它由一些Java语言编写的类和界面组成

它是一个软件层,允许开发者在JAVA中编写客户端/服务器应用

2 角色分类

  • 服务器

数据库

  1. 接收sql
  2. 执行sql
  3. 返回结果
  • 客户端

java

  1. 接收数据
  2. 组装 sql
  3. 发送SQL(与数据库建立联系)
  4. 分析结果

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;
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值