MySQL的JDBC编程详解

news2024/11/26 13:48:45

1.JDBC编程概念

在实际项目中,我们对于数据库的操作大部分是通过代码来完成的,各种数据库在开发的时候,都会提供一组编程接口API。所以不同公司使用不同的数据库软件,那么程序员学习成本是非常大的,因为要学习不同数据库对应的编程风格和相关语法。所以在java层面就进行了统一,这就是JDBC。各大数据库厂商在自身原生的API接口的基础上进行封装,形成数据库驱动包,在由各个数据库的数据库驱动包集合形成JDBC。
JDBC,即Java Database Connectivity,java数据库连接。是一种用于执行SQL语句的Java API,它是
Java中的数据库连接规范。这个API由 java.sql.*,javax.sql.*包中的一些类和接口组成,它为Java
开发人员操作数据库提供了一个标准的API,可以为多种关系数据库提供统一访问。

1.1 JDBC的工作原理

JDBC 为多种关系数据库提供了统一访问方式,作为特定厂商数据库访问API的一种高级抽象,它主要包
含一些通用的接口类。
JDBC访问数据库层次结构:

在这里插入图片描述

1.2 JDBC优势

  1. Java语言访问数据库操作完全面向抽象接口编程
  2. 开发数据库应用不用限定在特定数据库厂商的API
  3. 程序的可移植性大大增强

2.JDBC使用

2.1JDBC驱动包的下载

首先是安装驱动包,驱动包可以从MySQL官网获取,但是oracle官网贼难用;或者可以去github下载,再者可以去maven中央仓库下载(这个maven就类似计算机系列软件程序的应用商店)
这里我们使用maven去下载

  1. 打开网站https://mvnrepository.com/
  2. 搜索mysql的相关软件
    在这里插入图片描述
  3. 点击第一个或者第二个(mysql-connector-java)都可以
    在这里插入图片描述
  4. 然后选择对应的版本,注意这里的大版本号一定要和数据库服务器版本匹配,比如我的mysql的数据库服务器用的是5版本,所以我的驱动包也必须用5版本
    在这里插入图片描述
  5. 进入下载页面
    在这里插入图片描述
  6. 我们下载的文件后缀是.jar,这个后缀可以理解为是多个.class文件合在一起的压缩包
    在这里插入图片描述

2.2驱动包的安装、导入

  1. 下载好驱动包(一个.jar文件)后,首先我们我们在idea创建一个新的项目
    在这里插入图片描述
  2. 在项目下面我们创建一个目录
    在这里插入图片描述
  3. 然后将我们下载下来的.jar文件复制粘贴到该目录下
    在这里插入图片描述
    在这里插入图片描述
  4. 将目录标记为库,标记为库后,idea就可以识别.jar文件了。从而就可以调用里面的类来写代码了。
    在这里插入图片描述
  5. 导入成功后我们就可以开始正常编程了,我们在src文件下创建类JDBCIsert
    在这里插入图片描述

2.3 IDEA内JDBC的使用

在新建好类,以及main方法后,我们开始编程。JDBC需要通过已下步骤来完成开发

2.3.1 创建并初始化一个数据源

  1. 创建并初始化MysqlDataSource
    所谓数据源就是数据从哪里来,也就是描述数据库服务器在哪里,我们通过DataSource这个接口来描述。
    但是DataSource本身是接口,是一个抽象类,不能直接new,所以实际上我们是new他的子类MysqlDataSource对象,来实现DataSource这个接口。

在这里插入图片描述

DataSource dataSource = new MysqlDataSource();//这里实际是向上转型,子类实现父类接口

但是这样还不够,还需要向下转型一次,转回来,因为我们需要使用setUrl、setUser、setPassword方法,这个方法是子类MysqlDataSource独有的,父类并没有,所以进行向下转型。

  1. 设置Url
((MysqlDataSource)dataSource).setUrl("jdbc:mysql://127.0.0.1:3306/JDBC?characterEncoding=utf8&useSSL=false);

所以上述两行代码实际上也可以写成以下代码

MysqlDataSource mysqlDataSource = new MysqlDataSource();
mysqlDataSource.setUrl("jdbc:mysql://127.0.0.1:3306/JDBC?characterEncoding=utf8&useSSL=false);

URL是唯一资源定位符,是一个计算机网络中的常见术语,用于标记网络资源的位置。
我们这里输入"jdbc:mysql://127.0.0.1:3306/JDBC?characterEncoding=utf8&useSSL=false"
首先jdbc是固定的,mysql是我们使用的数据库,127.0.0.1:3306是IP地址,mysql数据库是一个“客户端服务器”结构,客户端和服务器端通过网络通信,网络上确定主机位置就是通过IP地址来确定,而127.0.0.1表示环回地址,表示本地Ip因为我们测试的mysql的服务器端和客户端在同一台设备上(我们自己的主机)。3306是端口号,用于区别不同的应用程序,数据库服务器的默认端口号是3306。base1是数据库名字,也就是我们用SQL语句写时create database 数据库名里面的数据库名字。characterEncoding=utf8表示字符集使用utf8,useSSL=false中SSL是一个加密协议,这里表示不加密。

  1. 设置用户名和密码
((MysqlDataSource)dataSource).setUser("root");
((MysqlDataSource)dataSource).setPassword("120198087zbh");

用户名统一写成默认值root,不要写其他值;密码对应的是我们在装mysql时写入的密码。

2.3.2 建立连接

Connection connection = dataSource.getConnection();

在这里插入图片描述
但是这里是会报错的,这是一个受查异常,我们直接给他抛出,注意要抛出,还要导入这个异常的包。

然后我们用Conenction接口接收。注意Conection接收时我们一定使用java.sql这里包里面的Conection否则编译不了,千万不要使用mysql包里面的。

在这里插入图片描述

到这里的代码就可以先执行一下,判断是否有错误。

import com.mysql.jdbc.jdbc2.optional.MysqlDataSource;
import javax.sql.DataSource;
import java.sql.SQLException;

public class JDBCInsert {
    public static void main(String[] args) throws SQLException {
        //JDBC需要通过以下步骤来完成开发
        //1.创建并初始化一个数据源
//        MysqlDataSource mysqlDataSource = new MysqlDataSource();
//        mysqlDataSource.setUrl();
        DataSource dataSource = new MysqlDataSource();
        ((MysqlDataSource)dataSource).setUrl("jdbc:mysql://127.0.0.1:3306/base1?characterEncoding=utf8&useSSL=false");
        ((MysqlDataSource)dataSource).setUser("root");
        ((MysqlDataSource)dataSource).setPassword("120198087zbh");
        //2.建立连接
        Connection connection = dataSource.getConnection();
    }
}

2.3.3构造sql语句

在dos环境下我们打开我们的mysql,构建数据库,创建表。

Enter password: ************
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 3
Server version: 5.7.27-log MySQL Community Server (GPL)

Copyright (c) 2000, 2019, Oracle and/or its affiliates. All rights reserved.

Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
mysql> create database base1 character set utf8mb4;
Query OK, 1 row affected (0.00 sec)
mysql> use base1;
Database changed
mysql> create table student(student_id int primary key auto_increment,student_name varchar(20));
Query OK, 0 rows affected (0.02 sec)

假如我现在要在java里去新增数据,那么在IDEA里面写下如下代码

//3.构造SQL语句
String sql = "insert into student values(1,'张三')";//创建一个sql语句
PreparedStatement statement = connection.prepareStatement(sql);//使用PreparedStatement接口进行提前预编译我们的sql

让客户端进行预编译,服务器做的工作就简单一些,压力会小一些。PreparedStatement中Prepared可以理解为提前准备的,Statement语句

2.3.4执行sql语句

在构造好sql语句后(预编译)我们要将其发送给服务器端,并执行该语句

int ret  = statement.executeUpdate();//executeUpdate的返回值为int
System.out.println("ret = "+ ret);

insert、updata、delete操作都使用executeUpate方法,其返回值为int,表示影响了几行,实际上就是我们在dos环境下(如下图)这个里面的0 rows affected 里面的0就是这个返回值。
而select 操作使用的是executeQuery方法

在这里插入图片描述
在执行完这一句之后就我们可以去MySQL验证一下,是不是插入了数据

mysql> select * from student;
+------------+--------------+
| student_id | student_name |
+------------+--------------+
|          1 | 张三         |
+------------+--------------+
1 row in set (0.01 sec)

发现确实是插入了的。

2.3.5 释放资源

  1. 数据库的客户端和服务器之间进行通信的时候,是要消耗一定资源(包括cpu,内存,硬盘,带宽等)的。当客户端数量够大的时候,一定不能让客户端随意的占用消耗,也就是不用的时候要感觉释放。
  2. 语句(statement)和链接(connection)的释放是有一定顺序的,谁先创建谁后释放。
statement.close();
connection.close();

2.3.6 细节补充

在本例子中我们插入数据是通过nsert into student values(1,'张三')这样写死的硬编码去完成的,但是实际项目中,这个输入肯定是需要用户在控制台输入才对。
所以代码可以这样去改写


import javax.sql.DataSource;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.SQLException;
import java.util.Scanner;

public class JDBCInsert {
    public static void main(String[] args) throws SQLException {

        Scanner scanner = new Scanner(System.in);
        //JDBC需要通过以下步骤来完成开发
        //1.创建并初始化一个数据源
//        MysqlDataSource mysqlDataSource = new MysqlDataSource();
//        mysqlDataSource.setUrl();
        DataSource dataSource = new MysqlDataSource();
        ((MysqlDataSource)dataSource).setUrl("jdbc:mysql://127.0.0.1:3306/base1?characterEncoding=utf8&useSSL=false");//设置url
        ((MysqlDataSource)dataSource).setUser("root");//设置用户名
        ((MysqlDataSource)dataSource).setPassword("120198087zbh");//设置密码
        //2.建立连接
        Connection connection = dataSource.getConnection();//异常抛出
        //3.控制台输入
        System.out.println("请输入学号:");
        int student_id  = scanner.nextInt();
        System.out.println("请输入姓名:");
        String student_name = scanner.next();
        //4.构造SQL语句
        String sql = "insert into student values(" + student_id+ ",'" + student_name + "')";//创建一个sql语句
        PreparedStatement statement = connection.prepareStatement(sql);//使用PreparedStatement接口进行提前预编译我们的sql
        //5.执行SQL语句
        int ret  = statement.executeUpdate();//executeUpdate的返回值为int
        System.out.println("ret = "+ ret);
        //6.释放资源
        statement.close();
        connection.close();
    }
}

但是这个代码还是比较丑陋的。

有更好的写法,可以借助PreparedStaterment的拼装功能来实现。

String sql = "insert into student values(?,?)";//用?(占位符)来先取代两个参数的位置
PreparedStatement statement = connection.prepareStatement(sql);//使用PreparedStatement接口进行提前预编译我们的sql
statement.setInt(1,student_id);//将第一个占位符所表示的整型参数替换为student_id
statement.setString(2,student_name);//将第二个占位符所表示的字符串参数替换为student_name

那么我们的完整的代码可以就如下:

import com.mysql.jdbc.jdbc2.optional.MysqlDataSource;
import javax.sql.DataSource;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.SQLException;
import java.util.Scanner;
public class JDBCInsert {
    public static void main(String[] args) throws SQLException {

        Scanner scanner = new Scanner(System.in);
        //JDBC需要通过以下步骤来完成开发
        //1.创建并初始化一个数据源
//        MysqlDataSource mysqlDataSource = new MysqlDataSource();
//        mysqlDataSource.setUrl();
        DataSource dataSource = new MysqlDataSource();
        ((MysqlDataSource)dataSource).setUrl("jdbc:mysql://127.0.0.1:3306/base1?characterEncoding=utf8&useSSL=false");//设置url
        ((MysqlDataSource)dataSource).setUser("root");//设置用户名
        ((MysqlDataSource)dataSource).setPassword("120198087zbh");//设置密码
        //2.建立连接
        Connection connection = dataSource.getConnection();//异常抛出
        //3.控制台输入
        System.out.println("请输入学号:");
        int student_id  = scanner.nextInt();
        System.out.println("请输入姓名:");
        String student_name = scanner.next();
        //4.构造SQL语句
//        String sql = "insert into student values(" + student_id + ",'" + student_name + "')" ;//创建一个sql语句
        String sql = "insert into student values(?,?)";//用?(占位符)来先取代两个参数的位置
        PreparedStatement statement = connection.prepareStatement(sql);//使用PreparedStatement接口进行提前预编译我们的sql
        statement.setInt(1,student_id);//将第一个占位符所表示的整型参数替换为student_id
        statement.setString(2,student_name);//将第二个占位符所表示的字符串参数替换为student_name
        //5.执行SQL语句
        int ret  = statement.executeUpdate();//executeUpdate的返回值为int
        System.out.println("ret = "+ ret);
        System.out.println(statement);//如果我们发现出错,我们可以将statement打印出来,观察一下是不是我们的SQL语句写错了;
        //6.释放资源
        statement.close();
        connection.close();
    }
}

同时如果在项目开发中出错,我们可以通过打印statement看到我的SQL语句有么有出错。
执行结果
在这里插入图片描述
在这里插入图片描述

当前我们的JDBC是使用DataSourse 这样的方式来进行编写。
还有一种写法DriveManager,通过反射的方式加载驱动包中的类,进一步进行后续操作。
但是还是推荐DataSourse,因为反射的代码可读性是非常差的,编译器难以对代码的正确性进行检查。此外,DataSource内置了数据库连接池,可以复用连接,提高连接服务器的效率。
计算机中池的本质是一种预申请机制,利用空间换时间。

2.4 IDEA实现MySQL查询操作

示例

import com.mysql.jdbc.jdbc2.optional.MysqlDataSource;

import javax.sql.DataSource;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.Scanner;

public class JDBCSelect {
    public static void main(String[] args) throws SQLException {
        Scanner scanner = new Scanner(System.in);
        //1.创建并初始化数据源
        DataSource dataSource = new MysqlDataSource();
        ((MysqlDataSource)dataSource).setUrl("jdbc:mysql://127.0.0.1:3306/base1?characterEncoding=utf8&useSSL=false");
        ((MysqlDataSource)dataSource).setUser("root");
        ((MysqlDataSource)dataSource).setPassword("120198087zbh");
        //2.建立连接
        Connection connection = dataSource.getConnection();
        //3.构造SQL
        System.out.println("请输入查询语句");
        String sql = scanner.nextLine();
//        String sql  = "select * from student";
        //4.预执行
        PreparedStatement statement = connection.prepareStatement(sql);
        //5.执行SQL语句
        ResultSet resultSet = statement.executeQuery();//resultSet就是select里面创建的临时表
        //6.遍历结果集合
        while(resultSet.next()){//这个效果和迭代器类似
            //把resultSet想象成一个表格,同时有一个光标指向表格的最上面
            //每一次调用next,光标都会往下走一行
            //当光标指向某一行的时候就可以通过getXXX等方法来获取当前行对应的列里面的数据。
            //当这个表都遍历完了,next就会返回false;
            int id = resultSet.getInt("student_id");
            //getXXX方法必须类型匹配
            //getXXX方法的参数可以是列名,也可以是下标
            String name = resultSet.getString("student_name");
            System.out.println("id = " + id +", name - " + name );
        }
        //7.释放资源
        resultSet.close();
        statement.close();
        connection.close();
    }
}

结果
在这里插入图片描述

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

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

相关文章

超好用的5款软件,每一款都让你爱不释手

分享爱,分享时光,分享精彩瞬间,大家好,我是互联网的搬运工,今天继续给大家带来几款好用的软件。 1.GIF录制——LICEcap ​ LICEcap是一款用于录制屏幕为GIF动画的工具。它可以让你用一个可调整的窗口来捕捉你的屏幕上…

2023年前端面试高频考点HTML5+CSS3

目录 浏览器的渲染过程⭐⭐⭐ CSS 、JS 阻塞 DOM 解析和渲染 回流(重排)和重绘⭐⭐ 选择器 ID选择器、类选择器、标签选择器(按优先级高到低排序)⭐⭐ 特殊符号选择器(>,,~,空格&#xff0…

【JavaEE】网络编程之TCP套接字

目录 1、TCP套接字 1.1、ServerSocket 常用API 1.2、Socket 常用API 2、基于TCP套接字实现一个TCP回显服务器 2.1、服务器端代码 2.2、客户端代码 2.3、解决服务器不能同时和多个客户端建立链接的问题 3、基于TCP socket 写一个简单的单词翻译服务器 1、TCP套接字 T…

【中文编程】青语言

【引言】 青语言主页:https://qingyuyan.cn 青语言文档:https://doc.qingyuyan.cn 青语言社区:https://forum.qingyuyan.cn 青语言仓库:https://gitee.com/NjinN/Qing 长久以来,中文编程一直是开发者社区中争议不断的…

opencv读写png

[1] 测试了怎么手动加 alpha 通道设置透明度后,用 PIL.Image 存 png,通道顺序是 RGBA。这里测试用 opencv 读、写 3、4 通道的 png。 png 可以只存 3 通道的,即不要 alpha,也可以加上 alpha。而无 alpha 时 opencv 的通道顺序是 …

微信视频号加强打击肖像授权侵权短视频

我是卢松松,点点上面的头像,欢迎关注我哦! 视频号安全中心发布公告称:视频号将打击肖像权和侵权的短视频,并在7月份上线“视频授权功能”。 5月份视频号已经下架了3万多条视频,1万多个帐号减少推荐。你看3…

Spring框架-面试题核心概念

目录 1.Spring框架的作用是什么? 2. 什么是DI? 3.什么是AOP? 4.Spring常用注解 5.Spring中的设计模式 6.Spring支持的几种bean的作用域 7.Spring中Bean的生命周期? 8.Spring中的事务管理 9.Spring中的依赖注入方式有几种 10.Sprin…

SpringBoot项目热部署设置

目录 1.设置热部署的好处 2.设置热部署的坏处 3.设置热部署的流程 4.关闭热部署功能 1.设置热部署的好处 Spring Boot 热部署的主要好处是在开发过程中提高了开发效率和体验。它让开发者在修改代码后无需手动重启应用程序,而是可以快速自动重新加载应用程序&…

【新版】系统架构设计师 - 信息安全技术基础知识

个人总结,仅供参考,欢迎加好友一起讨论 文章目录 架构 - 信息安全技术基础知识考点摘要信息安全基础知识信息安全系统的组成框架信息加密技术对称加密(共享密钥)非对称加密(公开密钥)信息摘要数字签名数字信…

el-upload 多文件依次上传(防抖 + 递归)

需求描述 多图上传组件,1-9 张图选择完文件后自动上传,不需要上传按钮来进行手动上传 难点 接口有两种,多图集合上传接口 uploadImgs、单图上传接口 uploadImg 使用 uploadImgs 接口,参数为图片集合 fileList,但是缺…

Spring架构篇--2.7.4 远程通信基础--Netty原理--bind实现客户端acceptread事件处理

前言:本文在Netty 服务端已经实现NioServerSocketChannel 管道的初始化并且绑定了端口后,继续对客户端accept&read事件如何处理进行探究; 1 对客户端accept&read事件的触发: 从之前的ServerBootstrap 的bind 方法中似乎…

JMeter接口测试新思路——灵活使用BeanShell

目录 前言: BeanShell的简介 调用Java方法 执行Class文件 结合实际案例 总结 前言: 在JMeter进行接口测试时,我们可能会遇到需要调用Java方法或者执行Java代码的情况,这时候我们可以使用BeanShell来实现。BeanShell是一个类…

QuintoAndar 如何提高转化率

QuintoAndar 如何提高转化率 ——求关注、求点赞、求分享,二毛拜谢。 QuintoAndar 如何通过提高页面性能来提高每次会话的转化率和页面数 一个专注于优化 Core Web Vitals 并迁移到 Next.js 的项目使转换率提高了 5%,每个会话的页面增加了 87%。 Quint…

07.JavaWeb-Vue+elementUI

1.Vue 功能替代JavaScript和jQuery&#xff0c;基于JavaScript实现的前端框架 1.1配置Vue 1.1.1引入vue库 方法一&#xff1a;通过cdn链接引入最新版本的vue&#xff08;可能会慢些&#xff09; <head><script src"https://cdn.jsdelivr.net/npm/vue">…

基于yolov5开发构建道路路面病害检测识别系统——以捷克、印度、日本三国城市道路实况场景数据为例,开发对比分析模型并分析对应性能

城市道路病害检测是最近比较热门的一个任务领域&#xff0c;核心就是迁移深度学习目前已有的研究成果来实现实时城市道路路面病害的检测识别分析&#xff0c;在我之前的很多博文中都有做过类似桥梁、大坝、基建、隧道等水泥设施裂缝裂痕等目标检测相关的项目&#xff0c;除此之…

利用powershell脚本进行内网渗透

powershell知识点 ps1是powershell脚本的拓展名&#xff0c;就相当于cmd的.bat脚本&#xff0c;但是他更加强大。 获取版本信息 get-host #查看powershell的版本信息$psversiontable #查看powershell的版本信息执行策略 PowerShell 执行策略是一项安全功能&#xff0c;用于控…

softmax之温度系数

1.数学表示 这是传统的softmax&#xff1a; q i e x p ( z i ) ∑ j e x p ( z j ) q_i \frac{exp(z_i)}{\sum_jexp(z_j)} qi​∑j​exp(zj​)exp(zi​)​ 或者写&#xff1a; q i e x p ( z i ) / 1.0 ∑ j e x p ( z j / 1.0 ) q_i \frac{exp(z_i)/1.0}{\sum_jexp(z_j/…

《LCHub低代码指南》:ChatGPT会取代低代码开发平台吗?

目录 一、低代码开发平台的优势 1. 提高开发效率 2. 降低开发成本 3. 提高应用程序的质量 二、ChatGPT的优势 三、ChatGPT是否会取代低代码开发平台 四、结论 随着数字化时代的到来,低代码开发平台已经成为了企业数字化转型的重要工具之一。然而,随着人工智能技术的不…

提升教学质量,监督教室课堂秩序?这招小白也能轻松搞定

在当今快速发展的教育领域&#xff0c;提高教学质量和监督教师的工作表现是学校和教育机构的重要任务之一。 传统的巡课方式存在许多限制&#xff0c;如耗时、人力成本高以及数据收集和分析的困难等。为了应对这些挑战&#xff0c;越来越多的学校和教育机构转向在线巡课系统&am…

微信小程序怎么直播?

我们目前使用的小程序都是支持直播功能的&#xff0c;小程序直播功能是通过小程序直播组件实现的&#xff0c;这是微信为商家提供的实时视频直播工具&#xff0c;可以帮助商家快速通过小程序向用户提供优质的直播内容。同时&#xff0c;借助小程序丰富的营销功能&#xff0c;使…