JDBC总结

一 概念:

  • JDBC:
    Java DataBase Connectivity 即java数据库连接。
    jdbc是oracle公司指定的一套规范(一套接口)

  • 驱动:jdbc的实现类.由数据库厂商提供.
    ps :我们可以使用厂商提供的jar例如mysql的jar包mysql-connector-java-5.1.39-bin.jar(随便下了一个版本的jar)来操作(通过jar包内的api)数据库

  • 提供商 例如mysql提供了mysql的jar包,oracle 提供了oracle的jar包
    (使用不同的jar包提供的api 就可以操作不同的数据库)

所以我们总结了jdbc 的功能:
1 连接数据库
2 发送sql语句
3 处理结果

二 使用jdbc操作数据库(简单的查询举例)

1 使用java代码操作之前我们先在数据库中建立个表 添加一些简单的信息
初始化数据库和表:
        CREATE DATABASE day07;
        USE day07;  
        
        create table category(
            cid varchar(20) primary key,
            cname varchar(20)
        );
        
        insert into category values('c001','电器');
        insert into category values('c002','服饰');
        insert into category values('c003','化妆品');
        insert into category values('c004','书籍');
2 在编辑工具中添加驱动jar(本栗子基于idea)
JDBC总结_第1张图片
image.png

操作十分简单,建立个lib文件夹用于存放我们的jar包,然后把下载好的jar粘贴过来,这时我们选中jar包在鼠标右键 add as library 选 module 确定 就ojbk了。

3 啥也别说了直接贴代码(十分简单直接粘过来,修改几个参数就能用,代码中表明了那些需要修改称为自己的十分简单)

首先来个思路:(可以参考 代码中会详细注释)

编码:
        1注册驱动 :                     (反射注册)
        2获取连接对象:              (驱动管理静态调用 获得链接方法(有参数) 返回链接对象)
        3编写sql:                    String 类型的sql语句
        4创建预编译的语句执行者:           链接对象掉预编译函数预编译sql 获得预编译对象
        5执行sql :                          预编译对象执行sql
        6处理结果:                         获得查询 更新等结果
        7释放资源:                        (关闭链接)


代码实现:

package jdbc;

import java.sql.*;

/**
 * Create by SunnyDay on 2018/11/10
 */
public class JdbcDemo {
    // mysql的固定驱动包名   (不需要更改)
    private static final String DRIVER_NAME = "com.mysql.jdbc.Driver";
    //数据库连接地址  注意: 后面的day07为我的数据库名字此处更改为你自己的数据库名字就行了
    private static final String URL = "jdbc:mysql://localhost:3306/day07";
    //用户名 (一般用户名都为root 安装mysql软件时设置的  如果你的不是 使用你自己的安装时自己起的名字就行)
    private static final String USER_NAME = "root";
    //密码 (填写你安装mysql时的密码 我的123456)
    private static final String PASSWORD = "123456";

    public static void main(String[] args) {
        Connection connection = null;
        try {
            //1 加载mysql的驱动类 传mysql驱动包名
            Class.forName(DRIVER_NAME);
            //2 获取数据库连接
            connection = DriverManager.getConnection(URL, USER_NAME, PASSWORD);
            //3 编写sql语句 (自己写 此处是我查询我day07 数据库中的category这张表,你查自己的行)
            String sql = "SELECT * FROM CATEGORY";
            // 4预编译sql 
            PreparedStatement prst = connection.prepareStatement(sql);
            //5执行sql 获得结果
            ResultSet rs = prst.executeQuery();
            while (rs.next()) {
                // 6 打印你自己的表字段 就行
                System.out.println(rs.getString("cid") + "::" + rs.getString("cname"));
            }
            rs.close();
            prst.close();
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            if (connection != null) {
                try {
                    //7 关闭连接 释放资源
                    connection.close();
                } catch (SQLException e) {
                    e.printStackTrace();
                }
            }
        }
    }

}

简单的查询结果如下图:

JDBC总结_第2张图片
image.png

是不是十分简单就搞好了(这个只是个简单的初学者使用的参考,如果老鸟们就可以跳过了哈哈)

三 相关 api详解

图解:(jdbc常用)


JDBC总结_第3张图片
image.png
JDBC总结_第4张图片
image.png
JDBC总结_第5张图片
image.png
JDBC总结_第6张图片
image.png
1 包 如上文我们所有使用的包都是 java.sql 或者 javax.sql包下的
2 DriverManager

2.1注册驱动方法:
2.1.1static void registerDriver(Driver driver)
注意:参数我们一般 new com.mysql.jdbc.Driver(); 这个包下的Driver是sql包下Driver的子类。
为什么我们不使用这种方式注册代码呢? 看Driver的源码如下:

package com.mysql.jdbc;

import java.sql.DriverManager;
import java.sql.SQLException;

public class Driver extends NonRegisteringDriver implements java.sql.Driver {
    public Driver() throws SQLException {
    }

    static {
        try {
            DriverManager.registerDriver(new Driver());
        } catch (SQLException var1) {
            throw new RuntimeException("Can't register driver!");
        }
    }
}

ps: 看实现了接口的包名正如我们所说的继承关系
看try内的语句 我们发现我们调用就是这个注册语句,结果这儿的静态代码块又调用了一次,这相当于代码执行了两次,其实让静态代码块执行就是类加载时执行,也就是类加载时静态代码块就执行,所以我们可以使用反射只需要一行代吗就行了(参考类加载原理)
所以注册驱动(我们一般使用反射的方式)

2.1.2反射的三种方式(随便选择)
如上文Class.forName(DRIVER_NAME);我们以后开发中习惯这种

2.2连接数据库 获得连接对象
static Connection getConnection(String url, String user, String password)
参数1:告诉我们连接什么类型的数据库及连接那个数据库
协议:数据库类型:子协议 参数
mysql: jdbc:mysql://localhost:3306/数据库名称
oracle: jdbc:oracle:thin@localhost:1521@实例
参数2:账户名 root
参数3:密码

3 Connection
Connection里面有两个常用的方法:
1 Statement createStatement() 
2 PreparedStatement prepareStatement(String sql)
常用方法:
            获取语句执行者:
                (了解)Statement createStatement() :获取普通的语句执行者  会出现sql注入问题
                ★PreparedStatement prepareStatement(String sql) :获取预编译语句执行者
                (了解)CallableStatement prepareCall(String sql):获取调用存储过程的语句执行者

            了解:
                setAutoCommit(false) :手动开启事务
                commit():提交事务
                rollback():事务回滚
4 Statement
Statement:语句执行者 接口
    PreparedStatement:预编译语句执行者 接口
        常用方法:
            设置参数:(问号为sql语句中的?占位符)
                setXxx(int 第几个问号,Object 实际参数);
                    常见的方法:
                         setInt
                         setString
                         setObject
        
            执行sql:
                 ResultSet executeQuery() :执行 r 语句 返回值:结果集
                 int executeUpdate() :执行cud 语句 返回值:影响的行数(通过这个数值可以知道是否执行成功)

5 ResultSet 结果集 接口
        执行查询语句之后返回的结果
            常用方法:
                boolean next():判断是否有下一条记录,
                               若有返回true且将光标移到下一行,若没有呢则返回false
                    光标一开始处于第一条记录的上面
                
                获取具体内容
                    getXxx(int|string)
                        若参数为int :第几列
                        若参数为string:列名(字段名)
                    例如:
                        获取cname的内容可以通过
                            getString(2)
                            getString("cname")
                    常用方法:
                        getInt
                        getString 也可以获取int值
                    getObject 可以获取任意


完!!!

你可能感兴趣的:(JDBC总结)