什么是JDBC(一)-使用JDBC-详解JDBC系列

JDBC简介

介绍

JDBC :java database Connectivity java与数据库的连接 JDBC市 java官方提供的一套使用java语言链接操纵数据的API,主要是java.sql包
学习下面的内容首先要学习CoreJavaMySql

三方责任

1.在java程序中访问数据库
2.方案:

1.程序员手动实现java连接各种数据库,它需要开发人员关注连接的细节,而且换项目还需要重新写连接封装成jar包(不现实不可行)
2.JAVA官方实现java连接各种数据库 所有链接需要JAVA官方实现,对于JAVA官方一个数据库对应一个连接(不可行)
3.数据库厂商实现JAVA连接各自数据库 数据库厂商开发驱动 提供自己数据库和java真正连接的类库也就是jar包,<==驱动开发者,对于应用程序开发者对于代码的可读性有难题
JAVA官方出现:指定标准(接口interface) 厂商实现标准
应用程序开发者从此不需要关注具体怎么实现连接,只需要使用驱动,离不开驱动,但不用真正关注它

3.1 JAVA制定的API java.sql包

1.java.sql.Driver:[I]驱动
--该接口是获得连接的标准 每一个驱动程序 都是先该接口及其中的connect方法
2.java.sql.DriverManager:[C] 驱动管理器
--底层管理驱动 对外提供获得连接的方法
--当外部需要连接时 外部调DriverManager
--Connection con =DriverManager.getConnection(url,username,password);
3.java.sql.Connection [I] 连接
--Connection对象可以创建SQL执行器
--Statement sta =con.createStatement();
--PrepareStatment pst = con.prepareStatement();
4.java.sql.Statement[I] Sql语句执行器
--Statement sta =con.createStatement();
--String sql ="select * from student"
5.java.sql.ResultSet[I] 结果集 存数据库里返回的内容
--ResultSet rs = sta.executeQuery(sql);
--另外还有增删 execute
--更改executeUpdate()

3.2 javax.sql API (dataSourse)


第一个JDBC程序

笔者这里用的idea 先去官网上下载mysql的jar包到本地,打开idea

1.首先设置工作区 先在本地建一个文件夹 idea打开

设置工作区
设置main入口
在这里插入图片描述
在这里插入图片描述
然后apply 确定 工作区就设置完毕了

2.导入jar包

在这里插入图片描述
在这里插入图片描述
选择刚才下载的jar包打上勾 apply 确定
ok可以放飞自我了
首先mysql里面有我建的学生表 给大家看一下
在这里插入图片描述
打开java程序开始写就可以了

import java.sql.*;

public class FirstJDBC {
    public static void main(String[] args) throws Exception {
    	//注册驱动,导入jar包
        Class.forName("com.mysql.jdbc.Driver");
        //获得桥梁
        String url = "jdbc:mysql://127.0.0.1:3306/你的数据库名称";
        String user = "root";
        String pwd = "你的密码";
        Connection con = DriverManager.getConnection(url, user, pwd);
        //造车sql语句执行器
        Statement sta = con.createStatement();
        String sql = "select * from student";
        //加载查询语句 获得结果集
        ResultSet rs = sta.executeQuery(sql);
        //迭代器
        while (rs.next()) {
            int id = rs.getInt("id");
            String name = rs.getString("name");
            //String code =rs.getString("code");
            System.out.println(id + "\t" + name + "\t");
        }
        rs.close();
        sta.close();
        con.close();
    }
}

ctrl +shift +F10运行看一下 刚才的数据库里的表是否已经展示出来了
运行结果

JDBC流程的细节

细节一 注册驱动

以下涉及源码分析~~

Class.forName("com.mysql.jdbc.Driver");//加载这个Driver

当这一句话执行的时候,告诉计算机加载一个类,我们打开官方下载的jar包,反编译一下进入到源码找到Driver这个类会看到这么一个静态代码块👇,也就是说类加载时会执行DriverManager.registerDriver(new Driver());这么一句

static{
     try{
     DriverManager.registerDriver(new Driver());//这里传了一个Driver的对象
     }catch (SQLException E)
     {
     throw new RuntimeException("Can't registe driver!");
     }
     }

再进入导DriverManager.registerDriver()这个方法中看看

DriverManager{
	public static registerDriver(java.sql.Driver driver){
       	 registerDriver(driver, null);
    }

有朋友会问这个函数要求传一个接口,而我们怎么给他一个Driver对象呢?
A:Driver这个类实现了.java.sql.Driver这个接口,也就相当于他需要一个Object,而我们传一个String是完全没有问题的 典型的JAVA多态思想
而真正干活的则是DriverManager类中 registerDriver(driver, null)这个函数,而继续往下挖,看看 registerDriver(driver, null);这个函数到底干了点啥

registerDriver(Driver driver,DriverAction action ){
         public static synchronized void registerDriver(java.sql.Driver driver,
            DriverAction da)
        throws SQLException {
        /* Register the driver if it has not already been added to our list */
        if(driver != null) {
            //把驱动对象扔到 存放驱动的集合中。
            registeredDrivers.addIfAbsent(new DriverInfo(driver, da));
        } else {
            // This is for compatibility with the original DriverManager
            throw new NullPointerException();
        }

        println("registerDriver: " + driver);

    }
        
    }
	}

DriverInfo就是Driver的一个包装类,没啥里面没啥东西就重写了以下tostring(),hashcode()这些方法,本质就一句话registeredDrivers.addIfAbsent(new DriverInfo(driver, da));而往上找找就能看见CopyOnWriteArrayList registeredDrivers =new CopyOnWriteArrayList ()显而易见这是个集合
也就是说这一整套下来就一个事,把一个driver对象扔进一个集合里
那么到这Class.forName(“com.mysql.jdbc.Driver”)这一句也就完了

细节二 Connection 只要连数据库就需要四个参数 driver url user pwd

三个参数

String url="jdbc:mysql://127.0.0.1:3306/XX";//你的数据库名称
String user ="root";
String password ="你的密码";
DriverManager.getCoinnection(url,user,password);

两个参数

import java.uitl.properties:Properties;//导包
import java.io.*;

建立配置文件

在这里插入图片描述

String url="jdbc:mysql://127.0.0.1:3306/XX";
Properties info = new Properties();
info.load(new FileInputStream(new File("confige.properties")));//load()方法读配置文件
Connection con =DriverManager.getConnection(url,info);

我们分析一下源码看怎么实现的,这里我们最最最关键的一句话是DriverManager.getCoinnection(url,user,password);
那我们进入DriverManager类看看这个方法在这里插入图片描述
在这里插入图片描述
我圈起来的这个地方就很清晰了,它用了个for循环遍历刚才存driver对象的集合,用driver自己的connect方法去获得Connection对象,传入的info和url也是从这个时候发挥作用的

细节三 Statement (车)

1.使用JDBC 创建一张表 users(id,name,pwd)
2.添加10条数据
3.查询数据

核心代码👇,用"桥"区配置一部"车"

Statement sta = con.createStatement();//桥.createStatement()
String sql ="你的sql语句";
sta.execute(sql);

上代码:

import java.io.FileInputStream;
import java.sql.*;
import java.util.Properties;
import java.io.*;
public class Exec1 {
    public static void main(String[] args)throws Exception {
        //createTable();
        //insertData();
        queryData();
    }
    //建表 的方法
    static void createTable()throws Exception{
        //注册驱动
        Class.forName("com.mysql.jdbc.Driver");
        String url="jdbc:mysql://127.0.0.1:3306/你的数据库";
        String user="root";
        String password ="你的密码";
        //造桥
        Connection con =DriverManager.getConnection(url,user,password);
        //用桥适配出啥样的车
        Statement sta = con.createStatement();
        String sql ="create table user(id int primary key auto_increment,name varchar(20));";
        //车执行sql语句
        sta.execute(sql);//不太明确使用哪个执行的方法可以使用这个 万能方法 任意sql都可以执行 返回Boolean 执行select语句返回true 其余返回false
        sta.close();
        con.close();
    }
    //添加数据的方法
    static void insertData()throws  Exception{
        Class.forName("com.mysql.jdbc.Driver");
        String url="jdbc:mysql://127.0.0.1:3306/你的数据库";
        String user ="root";
        String password="你的密码";
        Connection con = DriverManager.getConnection(url,user,password);
        Statement sta = con.createStatement();
        String sql ="insert into user (name)values ('小明'),('小张'),('小林'),('小王'),('小管'),('小青'),('小傻'),('小狗'),('et001'),('et002');";
        sta.executeUpdate(sql);//返回int 影响行数
        sta.close();
        con.close();

    }
    //查询数据的方法 这里我用的读取配置文件的方法 主要是让大家练习两种方式 当然前面连接那部分最单独封装成一个函数,这里主要是多写几遍让大家熟悉整个流程
    static void queryData()throws  Exception{
        Class.forName("com.mysql.jdbc.Driver");
        String url ="jdbc:mysql://127.0.0.1:3306/你的数据库";
        Properties info = new Properties();
        info.load(new FileInputStream(new File("confige.properties")));
        Connection con =DriverManager.getConnection(url,info);
        Statement sta =con.createStatement();
        String sql ="select * from user";
        ResultSet rs =sta.executeQuery(sql);//返回结果集
        while(rs.next()){
            String name =rs.getString("name");
            int id = rs.getInt("id");
            System.out.println(name+"   "+id);
        }
        rs.close();
        sta.close();
        con.close();
    }
}

另外

//关于execute的返回值
sta.execute(sql);//返回一个Boolean类型 当sql是查询语句时为true
sta.executeUpDate(sql);//返回一个int数 代表影响表的的行数
sta.executeQuery(sql);//返回一个查询到的结果集 
sta.executeBat(sql);//批处理对于一批数据的更新和添加效率很高 返回影响行数(int)

执行结果👇
在这里插入图片描述


细节四 ResultSet:

ResultSet代表数据库查询返回的记录,通常有一个指针最初位于第一行之前和迭代器一个熊样 所以我们刚上来往往都

while(rs.next()){
	//getString or getInt...
	rs.getXXXX("查询字段列表中的别名");
	rs.getXXXX(int); //查询字段列表中的索引值从1开始,注意时查询字段列表而不是字段
}

总结

JDBC的流程就讲完了,希望大家有收获,有不对的地方欢迎大家指正

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

商朝

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值