JDBC编程方法及细节

JDBC(Java Database Connectivity)是Java编程语言用于连接和操作数据库的API(Application Programming Interface)。它为开发人员提供了一组Java类和接口,用于与各种关系型数据库进行通信。使用JDBC,开发人员可以轻松地执行数据库操作,如查询、插入、更新和删除数据。

JDBC提供了一种标准的方式来连接数据库,并通过执行SQL语句与数据库进行交互。它允许开发人员使用Java代码来创建数据库连接、发送SQL语句并处理结果。通过JDBC,开发人员可以跨不同的数据库系统,如MySQL、Oracle、SQL Server等,使用相同的编程接口进行数据库操作。

1. 引入JDBC驱动包

要想使用JDBC编程要先引入MySQL的JDBC驱动包,JDBC驱动包就是Java对于数据库原生接口的封装,这种驱动包属于第三方库并不包含在JDK中 ,所有需要把它下载下来并且引入项目中。

1.1 下载方法

打开网站:https://mvnrepository.com/

点击上方的搜索框,输入 mysql 然后点击 Search 

然后点击如下图第二个搜索结果

然后来到如下界面,向下找到对应自己的MySQL版本,然后点击版本号进去

然后点击如图所示的jar即可下载

1.2 引入项目

1. 先创建一个项目

2. 右键图中的.idea然后点检 新建 / 目录

命名可任意,一般命名为lib

3. 将下载好的jdbc驱动包复制然后粘贴到新建的目录中

 3. 右击目录 点击添加到库 然后点击确定即可

2. JDBC编程步骤

2.1 创建数据源

数据库是服务器,服务器可能可能在这台主机上,也可能在其他主机上,我们要明确这个服务器的位置才能对其进行操作

数据源就是描述你要操作的数据库在哪里

这里Java是通过  IP地址 + 端口号 + 数据库名 来定位数据库位置的 

 解释:

  • IP地址: IP地址是描述一台主机在网络上的位置的机制,通常由一串数字组成 
  • 端口号:一台主机上有很多服务程序,使用端口号区分不同的服务程序 

 注意:

127.0.0.1 是一个特殊的IP地址,叫做环回IP(loopback)表示本机

MySQL默认的端口号为3306

代码:

//1.创建数据源
DataSource dataSource = new MysqlDataSource();
//解释,DataSource 是Java JDBC 中原生的API接口,MysqlDataSource 是我们安装的驱动包中的内容
((MysqlDataSource)dataSource).setUrl("jdbc:mysql://127.0.0.1:3306/java1124?characterEncoding=utf8&uesSSL=false");
((MysqlDataSource)dataSource).setUser("root");
((MysqlDataSource)dataSource).setPassword("123456");

解释: 

1. ((MysqlDataSource)dataSource).setUrl("jdbc:mysql://127.0.0.1:3306/java1124?characterEncoding=utf8&uesSSL=false");

  1. jdbc:mysql://:表示使用JDBC连接到MySQL数据库。
  2. 127.0.0.1:表示数据库服务器的IP地址,这里为本地主机。
  3. 3306:表示MySQL数据库服务器的端口号,一般情况下默认为3306。
  4. java1124:表示要连接的具体数据库名称。
  5. ?characterEncoding=utf8&uesSSL=false:表示额外的连接参数。characterEncoding=utf8:指定字符编码为UTF-8,确保正确处理中文等特殊字符。useSSL=false:禁用SSL连接

2. ((MysqlDataSource)dataSource).setUser("root");

这行代码设置了数据库连接的用户名。同样是将dataSource转换为MysqlDataSource类型,然后调用setUser()方法,将数据库连接的用户名设置为root,这是一个常见的MySQL数据库的默认用户名,拥有所有权限

3. ((MysqlDataSource)dataSource).setPassword("123456");

这行代码设置了数据库连接的密码。同样是将dataSource转换为MysqlDataSource类型,然后调用setPassword()方法,将数据库连接的密码设置为123456,这是与用户名对应的数据库连接密码,即我们安装MySQL时自己设置的密码

2.2 和数据库服务器建立连接 

//2.和数据库服务器建立连接 
Connection connection = dataSource.getConnection();
//注意这里的Connection要使用java.sql包下的Connection
//使用getConnection()方法会抛出一个SQLException异常记得捕获或者抛出这个异常

2.3 构建一个SQL语句

1. 创建一个字符串类型的SQL语句

 //注意末尾不需要加“;” 
String sql = "insert into student values(1, 'Ting')";

2 .将String类型的SQL语句转化为语句对象

//将String类型的SQL语句转化为语句对象
PreparedStatement statement = connection.prepareStatement(sql);

注意:还有一个 Statement接口也可以完成该操作,但是他们有一些区别如下:

  1. 创建方式:

    • Statement: 通过Connection对象的createStatement()方法创建。
    • preparedStatement:通过Connection对象的preparedStatement()方法创建,需要传入SQL语句作为参数。
  2. 预编译:

    • Statement:不进行预编译,每次执行SQL语句时都会将SQL语句发送给数据库进行解析和编译。
    • preparedStatement:在创建时进行了预编译,即SQL语句被发送到数据库进行解析和编译,并生成可复用的执行计划。这样,在后续的执行过程中,只需要传递参数即可,无需重新解析和编译SQL语句,提高了执行效率。
  3. 参数设置:

    • Statement:执行SQL语句时,无法使用参数化查询,所有的参数值都必须通过字符串拼接的方式直接嵌入SQL语句中。
    • preparedStatement:支持参数化查询,可以使用占位符(如?)代替具体的参数值,然后通过调用setXXX()方法设置参数的值。
  4. 防止SQL注入:

    • Statement:由于无法参数化查询,容易受到SQL注入攻击。因为参数值直接嵌入到SQL语句中,如果参数值未经过正确的处理,可能会导致安全漏洞。
    • preparedStatement:使用参数化查询,可以有效预防SQL注入攻击。参数值在设置时会被正确处理,不会直接嵌入到SQL语句中,从而提高了安全性。

 2.4 把构造好的SQL语句发送给服务器执行

增删改操作使用 :executeUpdate() 方法 返回值为int类型 即为影响的行数。

查询操作使用:executeQuery() 方法 返回值为 ResultSet 为一个结果集 

int n = statement.executeUpdate();
System.out.println(n);

 2.5 释放资源

Connection connection 和 PreparedStatement statement 是需要释放资源的,

因为它们占据了一些计算机重要的软/硬件资源

 DataSource dataSource 不需要释放,因为它只储存了 一些信息

使用close() 方法释放资源 

//注意释放顺序要与创建顺序相反
statement.close();
connection.close();

 2.6 问题

在 2.3 中我们发现我们的SQL语句是写死的 如果要插入其他内容又需要重新修改代码,显然这样是不科学的

解决方案:

1. 字符串拼接

在构造SQL语句时我们使用字符串拼接的方式来构造

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

这样就把插入的内容改为可由用户输入了,避免了修改代码

但是这样写任然存在一些问题

1.出的代码太过冗余杂乱

2.有sql注入攻击的风险

例如:用户在输入时 输入 "  ');drop database;"

 

2. 使用 preparedStatement 提供的占位符

String sql = "insert into student values(?, ?)";
//将String类型的SQL语句转化为语句对象
PreparedStatement statement = connection.prepareStatement(sql);
statement.setInt(1, id);//把第一个 ? 设置为 id
statement.setString(2, name);//把第二个 ? 设置为 name

 2.7 查询

构造查询语句与增删改略有不同,注意查询结果的打印方式即可

    public static void main(String[] args) throws SQLException {
        //构造数据源
        DataSource datasource = new MysqlDataSource();
        ((MysqlDataSource)datasource).setUrl("jdbc:mysql://127.0.0.1:3306/java1124?characterEncoding=utf8&useSSL=false");
        ((MysqlDataSource)datasource).setUser("root");
        ((MysqlDataSource)datasource).setPassword("123456");
        //连接数据库
        Connection connection = datasource.getConnection();
        //构造SQL语句
        String sql = "Select * from student";
        PreparedStatement statement = connection.prepareStatement(sql);
        
        //发送到服务器执行
        ResultSet result = statement.executeQuery();
        while(result.next()){
            int id = result.getInt("id");
            String name = result.getString("name");
            System.out.println(id + " " + name);
        }
        //释放资源
        result.close();
        statement.close();
        connection.close();
    }

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

路径规划之Best-First Search算法

系列文章目录 路径规划之Dijkstra算法 路径规划之Best-First Search算法 路径规划之Best-First Search算法 系列文章目录前言一、Best-First Search算法1.1 起源1.2 过程 三、简单使用 前言 Best-First Search算法和Dijkstra算法类似,都属于BFS的扩展或改进 一、…

【Python进阶笔记】md文档笔记第6篇:Python进程和多线程使用(图文和代码)

本文从14大模块展示了python高级用的应用。分别有Linux命令,多任务编程、网络编程、Http协议和静态Web编程、htmlcss、JavaScript、jQuery、MySql数据库的各种用法、python的闭包和装饰器、mini-web框架、正则表达式等相关文章的详细讲述。 全套md格式笔记和代码自…

【hive】列转行—collect_set()/collect_list()/concat_ws()函数的使用场景

文章目录 一、collect_set()/collect_list():二、实际运用1、创建测试表及插入数据 :举例1:按照id,cur_day分组,取出每个id对应的所有rule(不去重)。举例2:按照id,cur_day分组,取出每…

【Unity入门】碰撞检测

碰撞器由来 1.系统默认会给每个对象(GameObject)添加一个碰撞组件(ColliderComponent),一些背景对象则可以取消该组件。 2.在unity3d中,能检测碰撞发生的方式有两种,一种是利用碰撞器,另一种则是利用触发器。这两种方式的应用非…

左孩子右兄弟(Java详解)

目录 一、题目描述 二、题解 一、题目描述 对于一棵多叉树,我们可以通过“左孩子右兄弟” 表示法,将其转化成一棵二叉树。 如果我们认为每个结点的子结点是无序的,那么得到的二叉树可能不唯一。 换句话说,每个结点可以选任意子结…

论文导读 | 10月专题内容精选:人的预测

编者按 本次论文导读,编者选择了10月份OR和MS上与"人的预测"有关的三篇文章,分别涉及群体智慧的提取,个体序列预测的评估,以及决策者对风险的扭曲感知在分布式鲁棒优化中的应用。其中,从基于"生成式可能…

红队攻防实战之从边界突破到漫游内网(无cs和msf)

也许有一天我们再相逢,睁大眼睛看清楚,我才是英雄。 本文首发于先知社区,原创作者即是本人 本篇文章目录 网络拓扑图: 本次红队攻防实战所需绘制的拓扑图如下: 边界突破 访问网站: http://xxx.xxx.xxx…

Flink 常用物理分区算子(Physical Partitioning)

Flink 物理分区算子(Physical Partitioning) 在Flink中,常见的物理分区策略有:随机分配(Random)、轮询分配(Round-Robin)、重缩放(Rescale)和广播(Broadcast)。 接下来,我们通过源码和Demo分别了解每种物理分区算子的作用和区别。 (1) 随机…

2024北京林业大学计算机考研分析

24计算机考研|上岸指南 北京林业大学 特色优势 Characteristics & Advantages:信息学院创建于2001年,是一个年轻而有朝气的学院。学院秉承“结构、特色、质量、创新”的八字方针,坚持以“质量提升、行业融合”为核心的内涵式发展战略&am…

Pycharm创建项目新环境,安装Pytorch

在python项目中,很多项目使用的各类包的版本是不一致的。所以我们可以对每个项目有专属于它的环境。所以这个文章就是教你如何创建新环境。 一、创建新环境 首先我们需要去官网下载conda。然后在Pycharm下面添加conda的可执行文件。 用conda创建新环境。 二、…

libmosquitto库的一个bug,任务消息id(mid)分配后不起作用

代码如图所示: 当订阅了所有主题后,每个主题的mid是他们的下标索引加100的数字,可是实际打印出来的值是: mid依然是1,2,这个参数在这里失效了,不知道是bug还是mqtt的什么机制?

Python之Pygame游戏编程详解

一、介绍 1.1 定义 Pygame是一种流行的Python游戏开发库,它提供了许多功能,使开发人员可以轻松创建2D游戏。它具有良好的跨平台支持,可以在多个操作系统上运行,例如Windows,MacOS和Linux。在本文中,我们将…

Linux后台运行Python的py文件,如何使ssh工具退出后仍能运行

常规运行 python3 mysqlbak.py ssh工具退出后,或ctrlc中断后,程序将不在运行 后台运行 nohup python3 mysqlbak.py > mysqlbak.log & > mysqlbak.log为可选项,输出日志到指定文件,如果不写,输出日志到nohup…

【Seata源码学习 】篇四 TM事务管理器是如何开启全局事务

TM发送 单个或批量 消息 以发送GlobalBeginRequest消息为例 TM在执行拦截器链路前将向TC发送GlobalBeginRequest 消息 io.seata.tm.api.DefaultGlobalTransaction#begin(int, java.lang.String) Overridepublic String begin(String applicationId, String transactionServi…

网络安全工程师究竟是什么?怎么入门?

首先啊骚年们我们必须先了解网络安全这个行业究竟是干啥的。 是打ctf的?一个个都像韩商言吴白那么帅刷刷敲几个代码就能轻易夺旗? 还是像十大黑客之一的米特尼克一样闯入了“北美空中防务指挥系统”的计算机主机内,还在被通缉逃跑期间控制了…

鸿蒙原生应用/元服务开发-AGC分发如何上架HarmonyOS应用

一、上架整体流程 二、上架HarmonyOS应用 获取到HarmonyOS应用软件包后,开发者可将应用提交至AGC申请上架。上架成功后,用户即可在华为应用市场搜索获取开发者的HarmonyOS应用。 配置应用信息 1.登录AppGallery Connect,选择“我的应用”。…

最重要的BI测试-适用于任何BI和分析平台

为什么 BI 测试是答案 相信你的数据可视化是成功执行商业智能 (BI) 和分析项目的关键因素。我敢肯定,你遇到过以下情况:业务主管或业务用户反馈说他们的分析看起来不对,他们的 KPI 看起来有问题,或者速度太慢而无法使用。要问自己…

Spring框架学习 -- Bean的生命周期和作用域

目录 前言 案例 案例分析 作用域的定义 Bean对象的6种作用域 Singleton prototype 设置作用域 ​编辑延迟初始化 Spring的执行流程 Bean的生命周期 前言 我们可以类比一下普通变量的生命周期和作用域, 大多数变量的生命周期和作用域都被限定在了花括号内 {}, 除…

贝锐花生壳:无需公网IP、简单3步,远程访问群晖NAS

面对NAS远程访问难题,贝锐花生壳一招搞定!并且无需公网IP、简单3步,即可实现固定域名远程访问NAS。 步骤1: 目前,群晖NAS已在套件中心内置花生壳客户端。 浏览器进入群晖NAS的DSM管理界面,点击【套件中心】…

SSM大学生社团信息管理系统-99953,(免费领取源码)计算机毕业设计选题开题+程序定制+论文书写+答辩ppt书写 包售后 全流程

SSM大学生社团信息管理系统APP 摘 要 随着科学技术的飞速发展,社会的方方面面、各行各业都在努力与现代的先进技术接轨,通过科技手段来提高自身的优势,高校当然也不能排除在外。大学生社团信息管理系统APP是以实际运用为开发背景&#xff0c…