【JDBC上篇】什么是JDBC

news2024/12/25 9:03:56

文章目录

  • 1、对JDBC本质的理解
  • 2、代码模拟JDBC的本质
  • 3、JDBC编程的六步
  • 4、通过类加载的方式注册驱动
  • 5、属性配置文件与JDBC
  • 6、处理查询结果集

1、对JDBC本质的理解

Java DataBase Connectivity(Java语言连接数据库),其本质是SUN公司指定的一套接口(interface),这套接口在 java.sql.* 下

既然是一套接口,接口都有调用者和实现者,面向接口调用,面向接口写实现类,都属于面向接口编程。面向接口编程的优势是解耦合,降低程序的耦合度,提高程序的扩展力。

JDBC
驱动:

数据库的驱动大多以jar包的形式存在,解压后得到很多class文件,这些class文件就是对JDBC接口的实现,驱动由各大数据库厂家提供。
驱动

2、代码模拟JDBC的本质

SUN公司提供接口规范:

/**
 * SUN公司提供
 */
public interface JDBC {
    //连接数据库的方法
    void getConnection();
}

各数据库厂商面向接口写各自的实现类,称驱动:

/**
 * 数据库厂商角色,如MySql
 * 编写JDBC接口的实现类,称为驱动
 */
public class MySQL implements JDBC{
    @Override
    public void getConnection() {
        //这里写MySQL底层的一些具体实现
        System.out.println("连接MySQL成功");
    }
}

用户面向接口编程:

/**
 * Programmer面向接口编程
 */
public class JavaProgrammer {
    public static void main(String[] args) {
        JDBC jdbc = new MySQL();
        jdbc.getConnection();
    }
}

运行效果:
在这里插入图片描述

3、JDBC编程的六步

  • 注册驱动:告诉Java程序,即将要连接的是哪个品牌的数据库
  • 获取连接:表示JVM进程和数据库进程之间的通道打开,属于进程之间的通信
  • 获取数据库操作对象:即专门执行SQL语句的对象
  • 执行SQL语句:DQL、DML…
  • 处理查询结果集:只有上一步是SELECT查询语句的时候,才有这一步
  • 释放资源:资源使用完成后,关闭资源

IDEA配置JDBC驱动—方式一

MySQL驱动下载地址:http://dev.mysql.com/downloads/connector/j/
在这里插入图片描述

在这里插入图片描述
解压完成后,将驱动(jar包)复制到对应工程的lib目录下,右键Add as a library
在这里插入图片描述

IDEA配置JDBC驱动—方式二

在对应模块上右键,选择open Moudle Setting
在这里插入图片描述
选择Libraries后点击加号
在这里插入图片描述
选择对应的jar驱动包,点击OK
在这里插入图片描述
选择对应需要添加的模块后点击OK
在这里插入图片描述

代码实现:

import java.sql.*;

public class JdbcTest {
    public static void main(String[] args) {
        Connection conn = null;
        Statement statement = null;

        try {
            /**
             * 注册驱动
             */
            Driver driver = new com.mysql.cj.jdbc.Driver(); //多态,左边的是Driver接口java.sql.Driver,右边的是MySQL的实现类Driver
            DriverManager.registerDriver(driver);
            /**
             * 获取连接
             */
            String url = "jdbc:mysql://127.0.0.1:3306/testDB";
            String user = "root";
            String password = "code9527";
            conn = DriverManager.getConnection(url, user, password);
            System.out.println("数据库连接对象:" + conn);
            /**
             * 获取数据库操作对象
             */
            statement = conn.createStatement();
            /**
             * 执行SQL语句
             */
            String sql = "insert into dept(deptno,dname,loc) VALUES (001,'研发','天津')";
            int count = statement.executeUpdate(sql);
            System.out.println(count == 1 ? "保存成功" : "保存失败");
            /**
             * 处理查询结果集
             * 上面不是SELECT,暂时不管
             */

        } catch (SQLException e) {
            e.printStackTrace();
        } finally {
            /**
             * 在finally中释放资源,确保被一定关闭
             * 从小到大依次关闭,分别try..catch
             */

            try {
                if (statement != null) {
                    statement.close();
                }
            } catch (SQLException e) {
                e.printStackTrace();
            }
            try {
                if (conn != null) {
                    conn.close();
                }
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }
    }
}

☀ 代码格式化调整快捷键Alt+Ctrl+L

  • 注意区分两个Driver:
java.sql.DriverJava提供的Driver接口

com.mysql.jdbc.DriverMySQL厂商写的MySQL驱动类,实现了上面的Driver接口
  • int executeUpdate(String sql)方法是用来执行INSERT、UPDATE、DELETE语句的,返回值是“影响数据库中记录的条数”,如上面程序中插入了一条数据,则返回1

运行结果:
在这里插入图片描述
在这里插入图片描述

4、通过类加载的方式注册驱动

分析com.mysql.jdbc.Driver的源代码,发现其在静态代码块中进行了注册驱动的操作:
static

而类加载的时候会执行静态代码块:(小复习)

在这里插入图片描述
所以可以通过调用forName方法让类加载进而来注册驱动,这时也不用接收返回值,因为我们要的仅仅是类加载这个动作:

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.sql.Statement;

public class JdbcTest1 {
    public static void main(String[] args) {
        Connection conn= null;
        Statement statement = null;
        try{
            //注册驱动
            Class.forName("com.mysql.cj.jdbc.Driver");
            //获取连接
            conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/testDB","root","95279527");
            //获取数据库操作对象
            statement = conn.createStatement();
            //执行SQL语句
            String sql = "UPDATE dept SET dname='智能研发' WHERE deptno=1";
            int count = statement.executeUpdate(sql);
            System.out.println(count == 1 ? "更新成功" : "更新失败");
        }catch(ClassNotFoundException e){
            e.printStackTrace();
        } catch (SQLException e) {
            e.printStackTrace();
        }finally{
        	//关闭资源
        }
    }
}

牢记:通过类加载注册驱动 Class.forName(“com.mysql.cj.jdbc.Driver”);

运行后:
run

5、属性配置文件与JDBC

将驱动信息与数据库连接信息全部写入properties配置文件:
在这里插入图片描述
实际开发中,不要把数据库的信息写死在Java程序中。引入配置文件后:
code

6、处理查询结果集

返回的结果集对象是如下的一个东西:
结果集

  • 光标(resourceSet.next())返回true,说明这一行有数据。调用getString()方法取出数据即可。

  • getString()方法:不管数据库中的数据类型是什么,都以String类型取出

  • getString方法可以传入列的下标(JDBC中下标从1开始),也可以传入列名,但后者更加健壮

  • getString方法传入列名的时候,传入的是查询结果集的列名。如下:此时,传入getString的应该是no,而不是deptno

Sting sql = "select deptno as no ,dname,loc from dept";
  • 和getString类比,想以int类型取出数据,则用getInt(),依此有getDouble()等。这样拿出来以后就可以直接做数学运算了
  • close的时候,根据关系,应该是先resultSet再statement,最后是conn

完整代码:

import java.sql.*;
import java.util.ResourceBundle;

public class JdbcTest3 {
    public static void main(String[] args) {
        ResourceBundle bundle = ResourceBundle.getBundle("jdbc");
        String driver = bundle.getString("driver");
        String url = bundle.getString("url");
        String user = bundle.getString("user");
        String password = bundle.getString("password");

        Connection conn = null;
        Statement statement = null;
        ResultSet resultSet = null;
        try {
            Class.forName(driver);
            conn = DriverManager.getConnection(url, user, password);
            statement = conn.createStatement();
            String sql = "SELECT deptno as no,dname,loc FROM dept";
            /**
             * executeQuery方法是专门执行查询语句的(DQL),返回时ResultSet类型
             * executeUpdate是专门执行增删改语句的,返回时int
             */
            resultSet = statement.executeQuery(sql);
            while (resultSet.next()) {
                int deptno = resultSet.getInt("no");
                String dname = resultSet.getString("dname");
                String loc = resultSet.getString("loc");
                System.out.println(deptno + " " + dname + " " + loc);
            }
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            if (resultSet != null) {
                try {
                    resultSet.close();
                } catch (SQLException e) {
                    e.printStackTrace();
                }
            }
            if(statement != null){
                try{
                    statement.close();
                }catch(SQLException e){
                    e.printStackTrace();
                }
            }
            if(conn != null){
                try {
                    conn.close();
                } catch (SQLException e) {
                    e.printStackTrace();
                }
            }
        }
    }
}

运行结果:
run

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/83470.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

CSP22.3 T4通信系统管理

之前在CCF CSP认证2022年3月完整题解这篇博客记录了自己花了两天时间乱搞出来的方法,但是实际上动态维护区间最值,通过setsetset实现会更简洁,用优先队列需要额外开数组记录堆中节点的有效性。 而且在处理额度失效上,我也使用了最…

教你用响应式建站平台搭建网站

响应式网站搭建大家知道是什么吗?我们可以经常听到PC端网站、移动端网站,这些就是为特定终端而制作的网站版本,而响应式网站就是一个网站能够兼容多个终端,而不是为每个终端做一个特定的版本。那么我们怎么用响应式建站平台搭建网…

基于极限学习机(ELM)进行多变量用电量预测(Matlab代码实现)

💥💥💥💞💞💞欢迎来到本博客❤️❤️❤️💥💥💥 🎉作者研究:🏅🏅🏅本科计算机专业,研究生电气学硕…

使用adb命令导出hprof文件

我们可以使用android studio profiler导入hprof文件分析android应用的内存问题。那么如何从手机上面导出这份文件呢? 把应用的heap 区的数据取出来保存在一个hprof文件上,然后把hprof文件导入到可以查看这个文件的工具上(如android studio p…

Spring Security总结

目录 介绍 项目搭建 Security认证 UserDetailsService 内存认证 数据库认证 PasswordEncoder密码解析器 自定义登录页面 退出登录 CSRF防护 Remember me Security授权 RBAC 权限表设计 查询访问权限 配置类设置访问权限 自定义访问控制逻辑 注解设置访问权限 Secured Pre…

29.前端笔记-HTML-Html5的新特性

目录1、HtML5新增的语义化标签2、HTML5新增的多媒体标签&#xff08;1&#xff09;音频标签&#xff1a;< audio>audio的常见属性&#xff08;2&#xff09;视频标签&#xff1a;< video>video常见属性3、新增表单元素input的类型type4、新增表单属性1、HtML5新增的…

R语言中的生存分析Survival analysis晚期肺癌患者4例

第1部分&#xff1a;生存分析简介 最近我们被客户要求撰写关于生存分析的研究报告&#xff0c;包括一些图形和统计输出。本演示文稿将介绍生存分析 &#xff0c;参考&#xff1a; Clark, T., Bradburn, M., Love, S., & Altman, D. (2003). Survival analysis part I: Ba…

06 数学软件与建模---拟合

一、知识储备 1.曲线拟合问题的提法 已知一组&#xff08;二维&#xff09;数据&#xff0c;即平面上 n个点&#xff08;xi,yi) i1,…,n, 寻求一个函数&#xff08;曲线&#xff09;yf(x), 使 f(x) 在某种准则下与所有数据点最为接近&#xff0c;即曲线拟合得最好&#xff0…

前后端分离项目-Springboot 【后端框架搭建,SSM】

1.创建新项目 点击File->New->Project 选择Spring Initializr 填写信息 修改Group修改Artifact修改管理类型Maven&#xff08;带有文件目录&#xff09;修改Java version 选择依赖 这里只需要选择Web->Spring Web即可 创建的文件目录如下 2.创建文件目录 controlle…

【深入浅出Spring原理及实战】「原理分析专题」从零开始教你SpringEL表达式使用和功能分析讲解指南(上篇)

Spring EL表达式语言,这种语言jsp中学到的el,但是在整个spring之中其表达式语言要更加的复杂,而且支持度更加的广泛,最重要的是他可以进行方法的调用,对象的实例化,集合操作等等,但是唯一的难点就是:代码太复杂了,表达式太复杂了。深刻领会,spring中针对于字符串的改进,程序员使…

基于jsp+mysql+ssm医院出车管理与绩效分配系统-计算机毕业设计

项目介绍 本毕业设计主要实现集人性化、高效率、便捷等优点于一身的出车管理系统与绩效分配系统&#xff0c;完成系统用户管理、车辆信息管理、调度员信息管理、驾驶员信息管理、救护员信息管理、科室人员管理、院领导信息管理、调度信息管理、出车统计等功能模块。系统通过浏…

Spring Cloud微服务之loadbalancer负载平衡

Spring Cloud微服务之loadbalancer负载平衡 小学时候&#xff0c;曾经做过这样的数学题。 说有一个水池子&#xff0c;上面有一个排水管&#xff0c;下面有一个进水管&#xff0c;开一个进水管&#xff0c;6个小时灌满水池&#xff0c;开一个排水管&#xff0c;10个小时放光整…

给博客网站添加loading加载中动画代码

只需添加几行代码&#xff0c;就可以加强浏览者的体验,不在等待页面加载时感到枯燥&#xff0c;从而关闭网页&#xff0c;很多网站都会制作一个“网页正在加载中”的提示效果或显示加载进程&#xff0c;加载完成后提示消失&#xff0c;大部分都应用在网站的首页。当然网上很多教…

02时间复杂度与空间复杂度

开始系统学习算法啦&#xff01;为后面力扣和蓝桥杯的刷题做准备&#xff01;这个专栏将记录自己学习算法是的笔记&#xff0c;包括概念&#xff0c;算法运行过程&#xff0c;以及代码实现&#xff0c;希望能给大家带来帮助&#xff0c;感兴趣的小伙伴欢迎评论区留言或者私信博…

如何将多个视频剪辑到一起?如何把两段视频合成一段

如何将多个视频剪辑到一起&#xff1f;那么如何拼接视频&#xff1f;接下来小编就带大家一起了解下有关视频拼接的几款工具推荐。 工具一&#xff1a;TS视频拼合工具 TS视频合并工具是一款轻便简单的视频合并工具&#xff0c;主要是用于合并TS视频文件的工具&#xff0c;当用…

【分享】本地js文件替换源网页js文件的方法

本文所有教程及源码、软件仅为技术研究。不涉及计算机信息系统功能的删除、修改、增加、干扰,更不会影响计算机信息系统的正常运行。不得将代码用于非法用途,如侵立删!本地js文件替换源网页js文件的方法 环境 win10Fiddlerchrome方法一:Fiddler抓包替换js文件 自动回复器–…

HashMap源码分析以及面试题

目录 5、HashMap源码分析 5.1、初始化容量 5.2、负载因子是多少&#xff1f; 5.3、负载因子可以大于或小于0.75吗&#xff1f; 5.4、扩容长度为多少&#xff1f; 5.5、下标是怎么计算的&#xff1f; 5.6、hash冲突&#xff0c;是怎么解决的&#xff1f; 5.7、什么时候…

[附源码]JAVA毕业设计英语课程学习网站(系统+LW)

[附源码]JAVA毕业设计英语课程学习网站&#xff08;系统LW&#xff09; 项目运行 环境项配置&#xff1a; Jdk1.8 Tomcat8.5 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术…

安装 NVSwitch GPU 服务器的 cuda 驱动版本、nvidia-docker 指南

一&#xff0c;安装 Cuda 驱动 可参考笔者之前写过的文章&#xff1a; 升级 GPU 服务器 cuda 驱动版本指南 如果出现如下报错&#xff0c;则需安装 gcc、kernel-devel&#xff0c;请参考下面第二步安装 gcc、kernel-devel。 二&#xff0c;安装 gcc、kernel-devel 1&#…

基于狮群算法优化的lssvm回归预测-附代码

基于狮群算法优化的lssvm回归预测 - 附代码 文章目录基于狮群算法优化的lssvm回归预测 - 附代码1.数据集2.lssvm模型3.基于狮群算法优化的LSSVM4.测试结果5.Matlab代码摘要&#xff1a;为了提高最小二乘支持向量机&#xff08;lssvm&#xff09;的回归预测准确率&#xff0c;对…