Java的 JDBC 编程

news2025/3/13 6:25:23

1. Java的数据库编程:JDBC

JDBC:Java 通过JDBC这样的技术来操作 MySQL
MySQL 是一个基于 C/C++ 实现的数据库。
本身也提供了一系列的 API (Application Progromming Interface),让程序员调用,从而通过代码来操作数据库,也可以理解为 ” 一组类/一组方法“。

  1. 编程语言,如Java,C、C++、Python等
  2. 数据库,如Oracle,MySQL,SQL Server等
  3. 数据库驱动包:不同的数据库,对应不同的编程语言提供了不同的数据库 API ,如:MySQL提供了Java的驱动包 mysql-connector-java,需要基于Java操作MySQL即需要该驱动包。同样的,要基于Java操作Oracle数据库则需要Oracle的数据库驱动包ojdbc。

2. JDBC工作原理

在这里插入图片描述

3. JDBC使用

3.1 驱动包的下载与导入

下载地址:中央仓库

  1. 下载MySQL驱动包
  • 搜索MySQL驱动包
    在这里插入图片描述
    在这里插入图片描述
  • 找到和自己的mysql大版本对应的驱动包
    在这里插入图片描述
  • 点击 jar 下载
    在这里插入图片描述
  • 查看
    在这里插入图片描述
  1. 导入 jar 包到项目中使用
  • 新建目录
    在这里插入图片描述
  • 通过 CTRL + C 和 CTRL + V 来拷贝到目录中
    在这里插入图片描述
  • 告诉IDEA,当前这个目录是存放第三方库的目录
    在这里插入图片描述
  • 这就是展开的效果,代表IDEA已经识别到了驱动包
    在这里插入图片描述
    那么就可以编写代码了!!!

3.2 JDBC使用步骤(插入)

  • 首先,想编写JDBC,还需要准备好数据库和数据表(虽然 JDBC 也可以进行建表操作,但是一般都是提前创建好)
    在这里插入图片描述
    创建数据源对象,数据源对象就描述了要访问的数据库是什么和数据库位置在哪里
  1. 建立数据库连接
    在这里插入图片描述
    每种数据库都会提供对应的类来实现DataSourse接口

在这里插入图片描述

  1. 让代码和数据库服务器建立连接

在这里插入图片描述

  • 解决方式:

![在这里插入图片描述](https://i-blog.csdnimg.cn/direct/be4e40eccc1c45349985a798810b5705.p
在这里插入图片描述
3. 创建操作命令

		// 3. 构造操作数据库语句的 sql语句
        /**
         * PreparedStatement "预编译的语句"
         * 将字符串语句的对象转换成sql语句
         */
        String sql = "insert into test values(1,'张三')";
        PreparedStatement preparedStatement = connection.prepareStatement(sql);
  1. 发给数据库服务器和释放资源
		 //4. 执行sql,把刚才解析好的语句发给数据库服务器
        /**
         * 返回值是int类型,表示这个操作影响了几行数据
         */
        int n = preparedStatement.executeUpdate();
        System.out.println("n = "+n);
        //5. 执行完毕,有收尾操作,释放前面创建的各种资源
        // 主要释放 语句对象 和连接对象,DataSource 是不必释放的
        /**
         * 资源释放
         * 释放资源的顺序,要和创建资源的顺序相反
         * 建立连接/创建语句的时候,就需要消耗一定的内存/硬盘/网络等资源
         * 这些资源,都是跟随这个连接来走的
         * 如果连接不再使用了,就需要把这些资源释放掉
         */
        preparedStatement.close();
        connection.close();

在这里插入图片描述

  • 但是要实现用户自行输入怎么办
 // 3. 构造操作数据库语句的 sql语句
        /**
         * PreparedStatement "预编译的语句"
         * 将字符串语句的对象转换成sql语句
         */
        System.out.print("请输入学号:");
        Scanner scanner = new Scanner(System.in);
        int id = scanner.nextInt();
        System.out.print("请输入姓名:");
        String name = scanner.next();

        //String sql = "insert into test values(1,'张三')";
        String sql = "insert into test values("+ id +",'"+ name +"')";

        PreparedStatement preparedStatement = connection.prepareStatement(sql);

在这里插入图片描述

这种拼接字符串的做法可以,但是不推荐

  • 影响可读性,引号忒多了
  • 写法不安全,可能引起 sql 注入攻击这样的漏洞
  • 建议这样写:
		String sql = "insert into test values(?,?)";

        PreparedStatement preparedStatement = connection.prepareStatement(sql);
        preparedStatement.setInt(1,id);
        preparedStatement.setString(2,name);

4. JDBC修改删除查询

(1)修改:

import com.mysql.cj.jdbc.MysqlDataSource;

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

public class JDBCDemo2 {
    public static void main(String[] args) throws SQLException {
        DataSource dataSource = new MysqlDataSource();
        ((MysqlDataSource) dataSource).setURL("jdbc:mysql://127.0.0.1:3306/mysqltest?characterEncoding=utf8&useSSL=false");
        ((MysqlDataSource) dataSource).setUser("root");
        ((MysqlDataSource) dataSource).setPassword("1234");

        Connection connection = dataSource.getConnection();

        Scanner scanner = new Scanner(System.in);
        System.out.print("请输入需要修改的学号:");

        int id = scanner.nextInt();
        System.out.print("请输入需要修改的姓名:");

        String name = scanner.next();
        String sql = "update test set name = ? where id= ?";
        PreparedStatement preparedStatement = connection.prepareStatement(sql);
        preparedStatement.setString(1,name);
        preparedStatement.setInt(2,id);

        int n = preparedStatement.executeUpdate();
        System.out.println("n = "+n);

        preparedStatement.close();
        connection.close();
    }
}

在这里插入图片描述


(2)删除:

import com.mysql.cj.jdbc.MysqlDataSource;

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

public class JDBCDemo3 {
    public static void main(String[] args) throws SQLException {
        DataSource dataSource = new MysqlDataSource();
        ((MysqlDataSource) dataSource).setURL("jdbc:mysql://127.0.0.1:3306/mysqltest?characterEncoding=utf8&useSSL=false");
        ((MysqlDataSource) dataSource).setUser("root");
        ((MysqlDataSource) dataSource).setPassword("1234");

        Connection connection = dataSource.getConnection();

        Scanner scanner = new Scanner(System.in);
        System.out.print("请输入需要删除的学号:");
        int id = scanner.nextInt();

        String sql = "delete from test where id = ?";
        PreparedStatement preparedStatement = connection.prepareStatement(sql);
        preparedStatement.setInt(1,id);

        int n = preparedStatement.executeUpdate();
        System.out.println("n = "+n);

        preparedStatement.close();
        connection.close();
    }
}

在这里插入图片描述


(3)查询:

import com.mysql.cj.jdbc.MysqlDataSource;

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

public class JDBCDemo4 {
    public static void main(String[] args) throws SQLException {
        // 创建一个数据源对象,用于连接MySQL数据库
        DataSource dataSource = new MysqlDataSource();
        
        // 设置数据库连接的URL,包括数据库地址、端口、数据库名以及编码和SSL设置
        ((MysqlDataSource) dataSource).setURL("jdbc:mysql://127.0.0.1:3306/mysqltest?characterEncoding=utf8&useSSL=false");
        
        // 设置数据库连接的用户名
        ((MysqlDataSource) dataSource).setUser("root");
        
        // 设置数据库连接的密码
        ((MysqlDataSource) dataSource).setPassword("1234");

        // 通过数据源获取数据库连接
        Connection connection = dataSource.getConnection();

        // 定义SQL查询语句,查询test表中的所有数据
        String sql = "select * from test";
        
        // 创建PreparedStatement对象,用于执行SQL语句
        PreparedStatement preparedStatement = connection.prepareStatement(sql);
        
        // 执行查询操作,返回结果集
        ResultSet resultSet = preparedStatement.executeQuery();
        
        // 遍历结果集,获取查询结果
        while (resultSet.next()){
            // 获取结果集中当前行的id列的值
            int id = resultSet.getInt("id");
            
            // 获取结果集中当前行的name列的值
            String name = resultSet.getString("name");
            
            // 打印查询结果
            System.out.println("id = " + id + " name = " + name);
        }
        
        // 关闭结果集,释放资源
        resultSet.close();
        
        // 关闭PreparedStatement,释放资源
        preparedStatement.close();
        
        // 关闭数据库连接,释放资源
        connection.close();
    }
}
/**
 * id = 2 name = 李四
 * id = 3 name = 王五
 */
  • 如果是要使用条件查询也是可以的
import com.mysql.cj.jdbc.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 JDBCDemo4 {
    public static void main(String[] args) throws SQLException {
        DataSource dataSource = new MysqlDataSource();
        ((MysqlDataSource) dataSource).setURL("jdbc:mysql://127.0.0.1:3306/mysqltest?characterEncoding=utf8&useSSL=false");
        ((MysqlDataSource) dataSource).setUser("root");
        ((MysqlDataSource) dataSource).setPassword("1234");

        Connection connection = dataSource.getConnection();

        Scanner scanner = new Scanner(System.in);
        System.out.print("请输入需要查询的学号:");
        int id = scanner.nextInt();

        String sql = "select * from test where id = ?";
        PreparedStatement preparedStatement = connection.prepareStatement(sql);
        preparedStatement.setInt(1,id);

        ResultSet n = preparedStatement.executeQuery();

        while (n.next()){
            int i = n.getInt("id");
            String name = n.getString("name");
            System.out.println("id = "+i+" name = "+name);
        }
        n.close();
        preparedStatement.close();
        connection.close();
    }
}
/**
 * 请输入需要查询的学号:3
 * id = 3 name = 王五
 */

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

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

相关文章

开源!速度100Kb/s的有线和无线双模ESP32S3芯片的DAP-Link调试器

开源!速度100Kb/s的有线和无线双模ESP32S3芯片的DAP-Link调试器 目录 开源!速度100Kb/s的有线和无线双模ESP32S3芯片的DAP-Link调试器本项目未经授权,禁止商用!本项目未经授权,禁止商用!本项目未经授权&…

如何将ipynb文件转换为pdf文件

事情起因: 基本我所有的code以及代码注释,以及出图说明都统一放在jupyter notebook中, 代码注释,或者文档说明,实际上就是markdown所做的那一切,都是在markdown中写的; 代码的话,…

具备多种功能的PDF文件处理工具

软件介绍 在日常办公和学习场景中,PDF文件使用极为频繁,而一款功能强大的PDF编辑软件能大幅提升处理效率。 今天要介绍的Adobe Acrobat Pro DC 2024.005.20414,就具备像编辑Word文档一样便捷编辑PDF的能力。 PDF文档在学习和工作中广泛应用…

如何做好滚珠导轨的防尘工作?

滚珠导轨滑块在使用过程中,会吸附大量的灰尘和污垢,导致摩擦力增大,使用寿命缩短。那么,我们应该如何做好滚珠导轨的防尘工作呢? 1、使用防护罩:对于外露的滚珠导轨,可安装如螺旋弹簧钢带套管、…

nettrace rtt分析器

开源工具学习记录之流程梳理 近期对腾讯的的开源项目: nettrace(网络故障分析工具) ,进行源码学习。 开源仓库:Nettrace开源仓库 开源工具实现注释:nettrace学习记录 Nettrace学习记录之流程梳理Nettrace eBPF程序自动挂载方式探究 nettrace rtt分析器…

裂变营销策略在“开源链动2+1模式AI智能名片S2B2C商城小程序”中的应用探索

摘要:在当今数字化时代,企业营销手段日新月异,裂变营销作为一种高效的用户增长策略,正逐渐成为众多企业竞相探索的焦点。本文旨在探讨“开源链动21模式AI智能名片S2B2C商城小程序”中裂变营销的应用,通过“分名、分利、…

WangEditor快速实现版

WangEditor快速实现版 效果 案例代码 后端 package com.diy.springboot.controller;import cn.hutool.core.util.IdUtil; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; import io.swagger.annotations.ApiImplicitParam; import org.sp…

Java常见面试技术点整理讲解——后端框架(整理中,未完成)

前言: 对于后端常用框架的技术整理,其实框架在平时就是会用就行,但面试时多半需要描述实现原理,这个要靠自己理解,不推荐死记硬背。 这篇和另外几篇文章区分开,主要用于规整Java后端各种框架,…

Dify 本地部署教程

目录 一、下载安装包 二、修改配置 三、启动容器 四、访问 Dify 五、总结 本篇文章主要记录 Dify 本地部署过程,有问题欢迎交流~ 一、下载安装包 从 Github 仓库下载最新稳定版软件包,点击下载~,当然也可以克隆仓库或者从仓库里直接下载zip源码包。 目前最新版本是V…

Python----数据可视化(Seaborn二:绘图一)

常见方法 barplot方法 单独绘制条形图 catplot方法 可以条形图、散点图、盒图、小提亲图、等 countplot方法 统计数量 一、柱状图 seaborn.barplot(dataNone, xNone, yNone, hueNone, colorNone, paletteNone) 函数描述data用于绘图的数据集。x用于绘制长格式数据的输入。…

加速科技Flex10K-L测试机:以硬核创新重塑显示驱动芯片测试新标杆!

在2024年召开的世界显示产业创新发展大会上,加速科技自主研发的高密度显示驱动芯片测试设备Flex10K-L凭借其突破性技术创新,成功入选"十大创新技术(产品)"。作为国内显示驱动芯片测试领域的标杆性设备,Flex1…

linux-文本处理命令(echo,cut,sort,uniq,wc,tr,grep)

echo 打印(标准输入输出命令) [rootlocalhost ~]# echo $HOSTNAME-----$引用变量 localhost [rootlocalhost ~]# echo "$HOSTNAME"----“”弱引用符(可以解释特殊含义的字符) localhost [rootlocalhost ~]# echo $HOSTN…

spring-boot-starter和spring-boot-starter-web的关联

maven的作用是方便jar包的管理,所以每一个依赖都是对应着相应的一个或者一些jar包,从网上看到很多对spring-boot-starter的描述就是“这是Spring Boot的核心启动器,包含了自动配置、日志和YAML。”没看太明白,所参与的项目上也一直…

群晖DS223 Docker搭建为知笔记

群晖DS223 Docker搭建为知笔记,打造你的专属知识宝库 一、引言 在数字化信息爆炸的时代,笔记软件成为了我们管理知识、记录灵感的得力助手。为知笔记,作为一款专注于工作笔记和团队协作的云笔记产品,以其丰富的功能和便捷的使用体…

NLP文本分析之依存句法分析(理论及技术实践)

引言 在自然语言处理(NLP)领域中,理解句子的语法结构是实现语义理解的基础。依存句法分析(Dependency Parsing) 作为句法分析的核心任务之一,通过揭示句子中词语之间的依存关系,为机器翻译、信…

Nginx(基础安装+配置文件)

目录 一.Nginx基础 1.基础知识点 2.异步非阻塞机制 二.Nginx安装 2.1安装nginx3种方式 1.包管理工具安装(yum/apt) 2.本地包安装(rpm/dpkg) 3.源码编译安装 3.1 源码编译安装nginx流程(ubuntu) 1.…

uni-app+vue3学习随笔

目录相关 static文件 编译器会把static目录中的内容整体复制到最终编译包内, 非 static 目录下的文件(vue组件、js、css 等)只有被引用时,才会被打包编译。 css、less/scss 等资源不要放在 static 目录下,建议这些…

prompt大师高效提示词解析

Prompt大师李继刚高效提示词示例解析 一、「汉语新解」提示词 核心结构 采用Lisp语言框架嵌套中文语义,通过(defun 新汉语老师 ()...)定义角色风格(融合奥斯卡王尔德、鲁迅的批判性语言),用(隐喻 (一针见血...))构建解释逻辑链。…

QT系列教程(18) MVC结构之QItemSelectionModel模型介绍

视频教程 https://www.bilibili.com/video/BV1FP4y1z75U/?vd_source8be9e83424c2ed2c9b2a3ed1d01385e9 QItemSelectionModel Qt的MVC结构支持多个View共享同一个model,包括该model的选中状态等。我们可以通过设置QItemSelectionModel,来更改View的选…

【Java面试题汇总】Java面试100道最新合集!

1.说说你对面向对象的理解 得分点 封装,继承,多态、概念、实现方式和优缺点 面向对象的三大基本特征是:封装、继承、多态。 封装:将对象的状态和行为包装在一个类中并对外界隐藏实现的细节,可以通过访问修饰符控制成员的访问权限&#xff0c…