MySQL数据库——JDBC编程

news2024/11/26 18:26:12

文章目录

  • 一、什么是Java的JDBC
  • 二、JDBC编程
  • 三、代码整体展示

一、什么是Java的JDBC

JDBC,即Java Database Connectivity。意思是java数据库连接。是一种用来执行 SQL 语句的 JavaAPI,是Java中数据库的连接规范。这个 API 由 java.sql* 和 javax.sql* 包中的类和接口组成,可以为多种关系数据库提供统一访问。

JDBC的工作原理
在这里插入图片描述
JDBC优势:

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

二、JDBC编程

  1. 编程前准备
    前面我们知道,要进行 JDBC 编程需要使用 JavaAPI 和数据库进行连接。所以在进行编程之前需要先导入相应的 .jar 包。如下图所示:
    (本人这里使用的是 idea 编译器)
    在这里插入图片描述
    经过上面操作就可以进行编程了。

  2. 代码实现

  • 创建 DateSource 数据库,描述 mysql 在什么位置
        DataSource dataSource = new MysqlDataSource();
        //设置数据库所在的位置,端口以及数据库名
		        
       	((MysqlDataSource)dataSource).setURL("jdbc:mysql://127.0.0.1:3306/JDBCtest?characterEncoding=utf-8&useSSl=false");
        ((MysqlDataSource)dataSource).setUser("root");
        ((MysqlDataSource)dataSource).setPassword("123456");

在这里插入图片描述
注: 如上图所示,这里是一个向下转型,在后续的代码中使用的是 DataSource 类型的实例。

上面的四行代码,我们最需要注意的是第二句,如图:
在这里插入图片描述
这里的 IP 地址在解释一下:我们各自电脑的 IP 地址可能不同,但在这里统一写作 127.0.0.1。这是一个特殊的 IP 地址,叫做 “环回IP” 表示主机自己。只要数据库服务器和 JDBC 程序在同一个电脑,就可以使用这个 IP 地址。

在这里插入图片描述

  • 和数据库建立连接
        Connection connection = dataSource.getConnection();

        //通过控制台来输入信息
        Scanner scanner = new Scanner(System.in);
        System.out.println("请输入学号:");
        int id = scanner.nextInt();
        System.out.println("请输入姓名:");
        String name = scanner.next();

在这里插入图片描述
如图所示,这里的 connection 选择划红线的呢一个。

  • 构造 sql 语句

这里的构造有两种方式

第一种:直接使用字符串语句录入

        String sql = "insert into student values("+ id +",'"+ name + "')";
                //jdbc 中需要搭配一个特定的对象,来描述这里 sql 的情况
        PreparedStatement statement = connection.prepareStatement(sql);

这种形式的代码比较难以阅读,不好理解。此外,这个代码也是比较容易引起“SQL 注入攻击”
这也是一种入侵服务器的方式,假设输入name时这样操作:"); drop table … 这样就会删除后面的内容,造成很大的影响。

第二种:使用 PreparedStatement 通过占位符替换的方式,来实现动态 sql 构造。

        String sql = "insert into student values(?,?)";
        //jdbc 中需要搭配一个特定的对象,来描述这里 sql 的情况
        PreparedStatement statement = connection.prepareStatement(sql);
        statement.setInt(1,id);
        statement.setString(2,name);
        System.out.println("sql:" + statement);

上述的形式相对而言更加靠谱,需要注意的是,上面(?,?) 这个地方不是从 0 开始,而是从 1 开始计算。

注意,这里要选择红框中的这个关键字。
在这里插入图片描述

  • 执行SQL

使用 executeUpdate 执行增删改

        //4. 执行 sql,针对 增,删,改,使用 executeUpdate 来执行
        //               查,使用 executeQuery 来执行
        // 这里返回的含义是,这里的操作影响了几行
        int ret = (int) statement.executeLargeUpdate();
        System.out.println("ret = " + ret);

使用 executeQuery 执行查
注:这里的查操作存在于单独的一个类中

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;

public class JDBCSelectDemo {
    public static void main(String[] args) throws SQLException {
        DataSource dataSource = new MysqlDataSource();
        ((MysqlDataSource)dataSource).setURL("jdbc:mysql://127.0.0.1:3306/JDBCtest?characterEncoding=utf-8&useSSl=false");
        ((MysqlDataSource)dataSource).setUser("root");
        ((MysqlDataSource)dataSource).setPassword("wjh123456");

        Connection connection = dataSource.getConnection();

        String sql = "select*from student";
        PreparedStatement statement = connection.prepareStatement(sql);

		//实现查操作
        ResultSet resultSet = statement.executeQuery();
        while(resultSet.next()){
            //next 相当于移动一下光标,光标指向下一行
            //获取到每一列
            int id = resultSet.getInt("id");
            String name = resultSet.getString("name");
            System.out.println(id + ":"+ name);

        }
        //释放资源
        resultSet.close();
        statement.close();
        connection.close();
    }
}

在这里插入图片描述
如图所示,光标所指的位置就是数据表的第一行,每次读取后向下移动一个。

  • 释放资源
        statement.close();
        connection.close();

这里要注意的是,我们先连接(connection)了数据库再构造了(statement)对象。但是这里的顺序为什么要先关闭 statement 在关闭 connection?

如图所示:
在这里插入图片描述
这里要进入家中顺序是:大门 -> 二门
出家门的顺序是:二门 -> 大门
所以不难理解,这里的关闭顺序是:先创建后关闭。

三、代码整体展示

实现增删改操作的代码

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 JDBCinsertDemo {
    public static void main(String[] args) throws SQLException {
        //实现 JDBC 编程的步骤
        //1. 先创建 DataSource 数据库,描述了 mysql 在哪
        DataSource dataSource = new MysqlDataSource();
        //设置数据库所在的位置,端口以及数据库名
        ((MysqlDataSource)dataSource).setURL("jdbc:mysql://127.0.0.1:3306/JDBCtest?characterEncoding=utf-8&useSSl=false");
        ((MysqlDataSource)dataSource).setUser("root");
        ((MysqlDataSource)dataSource).setPassword("wjh123456");

        //2. 和数据库建立连接
        Connection connection = dataSource.getConnection();
        //通过控制台来输入信息
        Scanner scanner = new Scanner(System.in);
        System.out.println("请输入学号:");
        int id = scanner.nextInt();
        System.out.println("请输入姓名:");
        String name = scanner.next();


        //3. 构造 sql 语句
        //不安全

        //String sql = "insert into student values("+ id +",'"+ name + "')";

        String sql = "insert into student values(?,?)";
        //jdbc 中需要搭配一个特定的对象,来描述这里 sql 的情况
        PreparedStatement statement = connection.prepareStatement(sql);
        statement.setInt(1,id);
        statement.setString(2,name);
        System.out.println("sql:" + statement);

        //4. 执行 sql,针对 增,删,改,使用 executeUpdate 来执行
        //               查,使用 executeQuery 来执行
        // 这里返回的含义是,这里的操作影响了几行
        int ret = (int) statement.executeLargeUpdate();
        System.out.println("ret = " + ret);

        //5. 断开连接,释放资源
        statement.close();
        connection.close();
    }
}

运行展示:
添加元素前:
在这里插入图片描述
添加元素:
在这里插入图片描述
在这里插入图片描述
注:这里的删除,修改操作只需要修改 sql后的语句即可。
要注意的仍然是针对 增,删,改,使用 executeUpdate 来执行。

实现查找操作的代码

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;

public class JDBCSelectDemo {
    public static void main(String[] args) throws SQLException {
        DataSource dataSource = new MysqlDataSource();
        ((MysqlDataSource)dataSource).setURL("jdbc:mysql://127.0.0.1:3306/JDBCtest?characterEncoding=utf-8&useSSl=false");
        ((MysqlDataSource)dataSource).setUser("root");
        ((MysqlDataSource)dataSource).setPassword("wjh123456");

        Connection connection = dataSource.getConnection();

        String sql = "select*from student";
        PreparedStatement statement = connection.prepareStatement(sql);

        ResultSet resultSet = statement.executeQuery();
        while(resultSet.next()){
            //next 相当于移动一下光标,光标指向下一行
            //获取到每一列
            int id = resultSet.getInt("id");
            String name = resultSet.getString("name");
            System.out.println(id + ":"+ name);

        }
        //释放资源
        resultSet.close();
        statement.close();
        connection.close();
    }
}

运行结果:
在这里插入图片描述
与添加的元素情况一致,查找成功!

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

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

相关文章

Windows 环境下,使用 ESP32-S3 USB 接口进行 JTAG 调试的流程

前提 在 windows 上安装 esp-idf CMD 软件编译环境,可参考“Windows 上搭建 ESP-IDF SDK 编译环境 Visual Studio Code 软件编程环境”说明。硬件上使用 ESP32-S3 USB 接口与 PC 端建立连接,为方便测试,可使用官方发布的 ESP32-S3-DevKitC-…

“办”了三年数字化活动,这家公司成为行业独角兽

疫情三年,竟然有公司靠办活动成为行业独角兽?你没听错!持续的疫情,让各行各业的数字化进程大大提速,活动这个历史悠久的领域也不例外。在疫情期间,数字化深刻影响着各行业招聘、展览、发布会等多种活动&…

2023年新能源汽车行业研究报告

第一章 行业概况 新能源汽车,是指采用新型动力系统,完全或者主要依靠新型能源驱动的汽车,包括纯电动汽车、插电式混合动力汽车、增程式混合动力汽车和燃料电池汽车等。国际上,混合动力汽车(含中混、强混、插电式混动&…

浅谈常用的日志框架

文章目录1.为什么需要日志框架2.常见日志框架2.1.日志框架介绍2.2.市面上的日志框架3.Slf4j使用3.1.如何在系统中使用SLF4j3.2.可能存在的问题4.SpringBoot日志的默认配置5.SpringBoot指定日志文件6.切换日志框架1.为什么需要日志框架 通过日志的方式记录系统运行的过程或错误以…

vscode SSH 保存密码自动登录服务器

先在win local上拿到秘钥,然后再把这秘钥copy 进服务器 1. 创建 RSA 密钥对 第一步是在客户端机器(通常是您的计算机 win 10)上创建密钥对:打开powershell, 输入 ssh-keygen默认情况下ssh-keygen将创建一个 2048 位 RSA 密钥对…

套接字及分层模型(一)

套接字通信 1.内核开发的工程师将网络相关的头文件存储到一个专门目录include/net中,而不是存储到include/linux 2.ISO/OS和TCP/IP参考模型 应用层:网络服务与最终用户的接口; 表示层:数据的表示,安全及压缩&#xf…

SQL常用 增删改 语句

目录 1 插入语句 2 更新语句 2.1 更新单个值 2.2 更新表中的所有行 2.3 更新多个值 3 删除语句 1 插入语句 INSERT INTO 表名称 (字段名称) VALUES (值) 多个字段或值用逗号分隔字段与值的顺序要对应 我们添加后查询一下来验证结果 2 更新语句 2.1 更新单个值…

U盘安装CentOS 7 初体验

一、刻录镜像到U盘 把下载好的linux的 .iso 镜像文件 要通过刻录到U盘里才可以使用,不像虚拟机中一样可以直接导入使用。 使用软件 UltraISO 刻录到U盘上。 二、改启动方式 BIOS 改为U盘优先启动。 三、安装遇到的问题 1、找不到装有镜像的U盘盘符,…

企业级IM即时通讯私有云解决方案

信息无疑是当今社会最重要的资源之一,网络安全也成为了维护信息安全的一道防线。私有云办公通信平台成为不少企业的选择,不仅能实现自主部署,还能真正自主掌控云和数据,确保业务数据的安全、可控。然而企业如果自主研发私有云办公…

生产者消费者模型(多线程工作)

目录 1.模型前提 2.阻塞队列(消费场所) 3. 实验 4.有关效率 1.模型前提 以单生产者对单消费者为例子: 前提一:有一个缓冲区作为消费场所。 前提二:有两种功能不同的线程分别具有消费与生产的能力。 前提三&…

分布式事务框架Seata

分布式事务基础 <<分布式事务基础理论>> <<分布式事务解决方案>> Seata 一款开源的分布式事务解决方案&#xff0c;致力于提供高性能和简单易用的分布式事务服务。Seata 将为用户提供了 AT、TCC、SAGA 和 XA 事务模式&#xff0c;为用户打造一站式的…

Socket编程 | TCP服务器 之 并发阻塞模型(多进程实现)

TCP服务器IO模型 之 并发阻塞 1. 引言 在 Linux 环境下多进程的应用很多,其中最主要的就是网络/客户服务器。多进程服务器是当客户有请求时,服务器用一个子进程来处理客户请求。父进程继续等待其它客户的请求。这种方法的优点是当客户有请求时,服务器能及时处理客户,特别是…

JavaEE简单示例——动态SQL元素<where>

简单介绍&#xff1a; 在我们之前使用where关键字进行查询的时候&#xff0c;总是会在后面添加一个11恒等式&#xff0c;并且在每一个可能拼接的SQL语句前面都加上一个and关键字&#xff0c;防止当后续的所有条件都不满足的时候&#xff0c;where关键字在最后直接跟and的时候也…

系列三、约束

一、概述 1.1、定义 约束是作用于表中字段上的规则&#xff0c;用于限制存储在表中的数据。1.2、作用 保证数据库中数据的正确、有效性和完整性。1.3、分类 注意事项&#xff1a;约束是作用于表中字段上的&#xff0c;可以在创建表/修改表的时候添加约束。 二、演示 需求&am…

DEV C++的使用入门程序做算术运算

DEV C Dev-C &#xff08;有时候也称为 Dev-Cpp&#xff09;是一个免费软件&#xff0c;最早是由 BloodShed 公司开发的&#xff0c;在版本 4.9.2 之后该公司停止开发并开放源代码。然后由 Orwell 接手进行维护&#xff0c;陆续开发了几个版本&#xff0c;后来也有其他开发人员…

基于RK3399+Linux QT地面测试台多参数记录仪测试平台软件设计(二)

rk3399 是由本土芯片厂商瑞芯微&#xff08;Rockchip&#xff09;研发的高性能、低功耗“中国芯”。在 2016 年 4 月&#xff0c;rk3399 首次在香港举行的电子展上亮相。芯片使用六核大 LITTLE 处理器&#xff1a; 包括四核的 Cortex-A53 和双核的 Cortex-A72&#xff0c;主频可…

ubuntu22下phpstorm + xdebug调试php

文章目录前言环境主要步骤xedbug的安装xedbug.so的安装浏览器安装xdebug-helperphpstorm 配置xdebug前言 主要借鉴 https://blog.csdn.net/yinhangbbbbb/article/details/79247331 但是在linux下搭建还是遇到了不少问题 环境 phpstudy phpstorm xdebug 主要步骤 phpstudy、…

Nginx学习 (1) —— 初识Nginx(编译安装、启动停止、简单配置)

文章目录Nginx的发行版本Nginx的编译安装&#xff08;ubuntu18.04&#xff09;Nginx相关操作Nginx启动停止命令安装Nginx为系统服务Nginx的目录结构与基本原理目录结构&#xff1a;基本运行原理&#xff1a;基础配置&#xff1a;核心配置Nginx的发行版本 Nginx开源版&#xff…

【UE4 制作自己的载具】1-使用3dsmax制作载具

学习谌嘉诚课程所做笔记源视频链接&#xff1a;【虚幻4】UE4雪佛兰科迈罗汽车详细制作中文教程&#xff01;&#xff08;汽车骨骼绑定驾驶、动画蓝图&#xff09;汽车模型下载链接&#xff1a;https://pan.baidu.com/s/1ZH5gaAwckzRIZ0w6n0qvIA密码&#xff1a;19sj步骤&#x…

【2023蓝桥杯】2017年第八届C/C++A组真题(解析笔记)

目录 T1&#xff1a;迷宫 - 暴力dfs标注 T2&#xff1a;跳蚱蜢 - 9数算式 全排列 枚举乘号位置 T3&#xff1a;魔方状态 - 模拟 判重 &#xff08;高手入*****&#xff09; T4&#xff1a;方格分割 - dfs 从中心点去切割 T5&#xff1a;字母组串 - 递归思维-搞清楚参数…