JDBC操作数据库的方法

目录

一、JDBC介绍

二、使用方法(以MySQL为例)

(1)MySQL的jar包,导入到IDEA

(2)使用代码,操作数据库

1)设置数据源

1.创建MysqlDataSource对象,使用set方法

2.关于set...()方法的填写

1*  setURL()

2* setUser()

3* setPassword()

2)和数据库建立网络连接

3)使用程序构造SQL语句

4)关闭资源

三、JDBC操作数据库的补充

1.数据的插入

*1 .字符串拼接——不安全

*2.statement.setXXX()——推荐

2.数据的查询

3.JDBC学习的重要性


一、JDBC介绍

全称:Java DataBase Connectivity——java数据库连接

我们知道数据库厂商有很多,比如Oracle 、IBM 、MySQL、SAP

不同的厂商都有数据自己较为独特的API

什么是API?

API——(Application Programming Interface,应用程序编程接口,简称接口

是一组定义了软件组件之间交互方式的规范。

它允许不同的软件系统之间进行通信和交互,使得开发者可以利用已有的功能和服务来构建自己的应用程序。

比如说咱们最熟悉的:

JAVA标准库中,提供的各种类以及类中的各种方法(PriorityQueue等),就是API。

因为是不同的厂商,他们构建的API都是不一样的。

这就导致,如果操作不同数据库,程序猿就要重新学习一套新的语法,这样就大大提高了学习成本。

为了避免这种情况,JAVA的公司(现在是Oracle公司的一部分)规定了一套规范的API,让其他的数据库厂商去遵守。

程序猿只要学会JDBC这一套API,就可以操作各种厂商的数据库了。

为什么数据库厂商那么听话?——因为JAVA市场份额很大,他是老大。

二、使用方法(以MySQL为例)

(1)MySQL的jar包,导入到IDEA

教程见连接:

(2)使用代码,操作数据库

在上面jar文件导入到IDEA后,就可以使用JAVA代码操作数据库了。

1)设置数据源

1.创建MysqlDataSource对象,使用set方法

简单来讲就是new一个MysqlDataSource的类,

使用该类的setURL()、setUser()、setPassword()方法

分别设置好要连接的那个数据库、数据库使用者、数据库的密码:

注意:URL和Url都可以:

如图,只要把红色波浪线的空格填好,这一步就完成了。

除了以上这种方式调用set方法,还有另一种常见的方式调用set方法:

这种创建方式就比较简介,好理解。

这两种创建方法褒贬不一,很难说谁好谁坏。

为什么?

想要了解为什么,需要直到什么是耦合、什么是内聚

支持方式一的人认为:

虽然代码看起来有点繁杂,类型转来转去的。

但是这种写法耦合程度更高,以后代码修改的成本会小。

因为实际的类型是父类DataSource,看不到MysqlDataSource类中的相关方法

所以在后序代码中,不用关心是使用的那个类型的数据库,这样就使得后序代码可以和MySQL解耦合了。

不过我个人认为,开发途中更换数据库是一个频率很低的事情,即使要更改,考量的范围和要做出的调整也有很多,不是十几行代码就可以完成的


支持方式二的人认为:

虽然第二种方式耦合程度变得低了,但是代码更加简洁易读啊。

更何况更改数据库是及其少数的情况,大部分情况写第二种都是非常不错的。


以上两种创建方式,见仁见智,不过两种方式都要掌握。

说我了创建,那么set...()方法中的括号如何填写呢?

2.关于set...()方法的填写
1*  setURL()
 dataSource.setURL("jdbc:mysql://127.0.0.1:3306/testjdbc?characterEncoding=utf8&useSSL=false");

URL是资源资源占位符的缩写*(Uniform Resource Locator)

用来表述网络上某一个资源的位置(类似于网址)

数据库可以理解为一种网络资源(客户端——服务器的结构)

URL具有相对固定的格式:

jdbc:mysql

描述了url的用途是什么?——是给jdbc的mysql使用的

 

127.0.0.1

IP地址,代表mysql服务器所在主机的位置


3306

叫做端口号。

端口号是用来区分一个主机上的不同应用程序的。

比如点脑上有酷狗、QQ音乐、网易云音乐,这是发来网络数据,想要把数据给到那个程序,就要用端口号来做区分。

MySQL默认安装的端口号是3306


testjdbc

它是我之前就创建的一个数据库的名字


characterEncoding=utf8

说明数据库指定的字符集是那种。


useSSL=false

代表资源是否需要加密

等于false代表把加密关掉(因为咱们的数据库不值钱,所以咱们的数据库很安全,被必要加锁)。

设置URL很重要,一步都不能错,不然后续会出问题。

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

“root”代表管理员身份。

3* setPassword()
        dataSource.setPassword("1111");

填入的字符串就是安装MySQL时,设置的数据库密码。


2)和数据库建立网络连接

通过刚才创建的对象,使用getConnection()方法:

Connection connection=dataSource.getConnection();

但是,我们直接使用这个方法,会抛出一个异常:

SQLException是一个受查异常,我们直接alt+enter抛出即可。

这样与数据库进阿里了网络连接:

关于JAVA中的异常详细介绍,知识回顾请看:JAVA中的异常

3)使用程序构造SQL语句

我们以插入一个数据行为例,这是我们stuent表的结构(id,name):

表的内容:

构造SQL语句分为两步:

1.通过字符串把代码输入(语句的分号可加可不加)

2.对代码进行预编译(预编译在MySQL服务器上也可以进行,不过为了提高性能还是在客服端上把他解析了),然后上传到服务器上执行

  //3、使用程序构造SQL语句//输入SQL语句    String sql="insert into student values(3,'王五')";//对sql语句进行预编译PreparedStatement statement=connection.prepareStatement(sql);//放到服务器执行预编译好的语句statement.executeUpdate();

注意:

只要SQL语句不是查找(是更新数据),就用statement.executeUpdate()

如果是SQL查找,用statement.executeQuery()

4)关闭资源

先创建的后关闭:

三、JDBC操作数据库的补充

1.数据的插入

数据库插入数据的写法不一定要想上面介绍的那样,把数据写死在代码里。

还有两种书写方式:

两种方式,都可以用户进行输入操作:

*1 .字符串拼接——极不推荐

拼接很简单,就是我们学过的:

//3、使用程序构造SQL语句String sql="insert into student values("+id+",'"+name+"')";

不推荐的原因有2:

1.代码看起来很乱,不利于维护。

2.可能会导致“sql注入攻击”。

比如有人故意使坏,输入一些特别的字符串,是的sql语句不在是之前原有的语意。而是另外一些语意,那么就会对数据库带来负面效果。

*2.statement.setXXX()——推荐

我们不再把id和name拼接到字符串中,而是把他换成占位符:

注意必须是英文的问号(?),不然程序不认识,会编译失败。

占位符类似于C语言中printf的%d这种作用。

接下来我们设置两个问号的具体参数:

 //3、使用程序构造SQL语句String sql="insert into student values(?,?)";//对sql语句进行预编译PreparedStatement statement=connection.prepareStatement(sql);//使用statement自带的setXXX方法,设置?的值statement.setInt(1,id);statement.setString(2,name);

setXXX有很多类型,匹配数据列的参数即可:

setXXX的第一个参数代表当前数据位于数据行的第几列参数从1开始

这样就大功告成了,整体代码:

import com.mysql.jdbc.MySQLConnection;
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;/*** Created with IntelliJ IDEA* Description:* User:34398* Date:2024-06-07* Time:14:26*/
public class Main {public static void main(String[] args) throws SQLException {//1、设置数据源//        DataSource dataSource=new MysqlDataSource();//向上转型
//        //接着又向下转型
//        ((MysqlDataSource) dataSource).setURL();
//        ((MysqlDataSource) dataSource).setUser();
//        ((MysqlDataSource) dataSource).setPassword();Scanner scanner=new Scanner(System.in);System.out.println("输入学生ID:");int id=scanner.nextInt();System.out.println("输入学生姓名:");String name=scanner.next();MysqlDataSource dataSource=new MysqlDataSource();dataSource.setURL("jdbc:mysql://127.0.0.1:3306/testjdbc?characterEncoding=utf8&useSSL=false");dataSource.setUser("root");dataSource.setPassword("1111");//2、和数据库建立网络连接Connection connection=dataSource.getConnection();//3、使用程序构造SQL语句String sql="insert into student values(?,?)";//对sql语句进行预编译PreparedStatement statement=connection.prepareStatement(sql);statement.setInt(1,id);statement.setString(2,name);//解析后的语句放到服务器,执行statement.executeUpdate();//4、关闭资源文件statement.close();connection.close();}
}

2.数据的查询

如图只要在更行数据的代码基础上更改第三步即可:

测试结果:

3.JDBC学习的重要性

JDBC在实际开发中用的很少。

因为代码写起来比较的复杂。

后来就有了很多库和框架,来针对JDBC进行简化(都是基于JDBC

像Mybaits框架,就是针对JDBC简化后的组件。

这些框架的使用的确可以提高我们的开发效率,但是有使用遇到特殊的场景,这些通用的框架可能就发挥不了作用了。

需要我们利用JDBC的知识,去修改或者自己开发一个框架,来应对某些独特的场景

因此JDBC的学习非常必要!


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

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

相关文章

国产MCU芯片(2):东软MCU概览

前言: 国产芯片替代的一个主战场之一就是mcu,可以说很多国内芯片设计公司都打算或者已经在设计甚至有了一款或多款的量产产品了,这也是国际大背景决定的。过去的家电市场、过去的汽车电子市场,的确国产芯片的身影不是很常见,如今不同了,很多fabless投身这个行业,一种是…

【数据结构】排序(下)

个人主页~ 排序(上) 栈和队列 排序 二、常见排序的实现8、快速排序的优化9、非递归快速排序(1)基本思想(2)代码实现(3)时间复杂度(4)空间复杂度 10、归并排序…

一个基于大模型的多功能的本地网页语音合成工具

ChatTTS-ui 是一个开源项目,这是一个利用 ChatTTS 技术将文本转换为语音的本地网页界面工具。它不仅支持中英文和数字的混合输入,还提供了丰富的API接口,为开发者和用户提供了极大的便利。 项目地址:https://github.com/jianchang…

1.华为路由器-三层交换机-二层交换机组网连接

AR1配置GE 0/0/0接口IP [Huawei]int g0/0/0 [Huawei-GigabitEthernet0/0/0] [Huawei-GigabitEthernet0/0/0]ip add 1.1.1.1 24 [Huawei]iP route-static 192.168.0.0 16 1.1.1.2三层交换机配置如下 创建vlan [Huawei]vlan batch 10 20配置接口ip [Huawei]int g0/0/1 [Huawei…

数电逻辑门电路分析和Digital仿真

文章目录 1. 逻辑门电路 2. 非门(NOT Gate) 3. 与门(AND Gate) 4. 或门(OR Gate) 5. 与非门(NAND Gate) 6. 或非门(NOR Gate) 7. 异或门(XO…

开源模型应用落地-LangChain高阶-LCEL-表达式语言(七)

一、前言 尽管现在的大语言模型已经非常强大,可以解决许多问题,但在处理复杂情况时,仍然需要进行多个步骤或整合不同的流程才能达到最终的目标。然而,现在可以利用langchain来使得模型的应用变得更加直接和简单。 LCEL是什么&…

每天五分钟深度学习框架pytorch:多维tensor向量在某一维度的拼接和分割

本文重点 在深度学习中,我们常常需要完成多个向量拼接,同时也要完成向量的分割,在pytorch中已经有封装好的库,我们可以直接调用完成这部分任务。 Cat拼接 c=torch.cat([a,b],dim=0)表示将a和b按0维度进行拼接,需要注意再非dim维度,两个矩阵的维度必须是一致的,不然会拼…

单调栈(续)、由斐波那契数列讲述矩阵快速降幂技巧

在这里先接上一篇文章单调栈,这里还有单调栈的一道题 题目一(单调栈续) 给定一个数组arr, 返回所有子数组最小值的累加和 就是一个数组,有很多的子数组,每个数组肯定有一个最小值,要把所有子…

Caffe、PyTorch、Scikit-learn、Spark MLlib 和 TensorFlowOnSpark 概述

在 AI 框架方面,有几种工具可用于图像分类、视觉和语音等任务。有些很受欢迎,如 PyTorch 和 Caffe,而另一些则更受限制。以下是四种流行的 AI 工具的亮点。 Caffee Caffee是贾扬青在加州大学伯克利分校(UC Berkeley)时开发的深度学习框架。该工具可用于图像分类、语音和…

胡说八道(24.6.12)——数字电子技术以及Modelsim

上回书说到数电中的最常用的表达式——逻辑表达式(由布尔代数组成)以及常用的两种图表——真值表(真值表表示的是所有的输入可能的线性组合以及输出)和卡诺图(卡诺图则是一种化简工具,排除冗余项,合并可合并项)。 今天,先来看看昨天说的基本逻…

DP:01背包问题

一、背包问题的概述 背包问题是⼀种组合优化的NP完全问题。 本质上是为了找出“带有限制条件的组合最优解” 1、根据物品的个数,分为如下几类: • 01背包问题:每个物品只有⼀个(重点掌握)• 完全背包问题&#xff1…

ffmpeg封装和解封装介绍-(10)综合完成视频重编码为h265,解封装解码编码再封装

主函数逐句解析: 由于代码太多我们只解析主函数,(其他封装函数见前面文章,同时用到了解码编码封装代码)。 初始化和参数处理 int main(int argc, char* argv[]) {/// 输入参数处理string useage "124_test_x…

【计算机网络】已解决:“‘ping‘ 不是内部或外部命令,也不是可运行的程序或批处理文件”报错

文章目录 一、问题分析背景二、可能出错的原因三、错误代码示例四、正确解决方法与示例五、注意事项 已解决“‘ping’ 不是内部或外部命令,也不是可运行的程序或批处理文件”报错 一、问题分析背景 在Windows操作系统中,ping 命令是一个常用的网络诊断…

线程池ThreadPoolExecutor使用指南

线程池ThreadPoolExecutor使用指南 🧐使用线程池的好处是什么? 统一管理,减少资源获取创建的开销,提高利用率。 🔧线程池的参数 ​ThreadPoolExecutor​ 3 个最重要的参数: ​corePoolSize​ : 任务队列…

docker login 报错: http: server gave HTTP response to HTTPS client

环境: 自建 Harbor、Docker 1. 问题分析 # 命令,这里用的是 IP,可以为域名 docker login -u test 172.16.51.182:31120 # 输入密码 Password:# 报错如下: Error response from daemon: Get "https://172.16.51.182:31120/…

[Algorithm][贪心][增减字符串匹配][分发饼干][最优除法][跳跃游戏Ⅱ][跳跃游戏]详细讲解

目录 1.增减字符串匹配1.题目链接2.算法原理详解3.代码实现 2.分发饼干1.题目链接2.算法原理详解3.代码实现 3.最优除法1.题目链接2.算法原理详解3.代码实现 4.跳跃游戏 II1.题目链接2.算法原理详解3.代码实现 5.跳跃游戏1.题目链接2.算法原理详解3.代码实现 1.增减字符串匹配 …

期末复习6--链表头插法(逆序)尾插法(顺序)---输出链表

头插法 #include <stdio.h> #include <stdlib.h>struct Node //定义结构体 {char data; //数据域struct Node * next; //指针域 };/* 请在这里填写答案 */void PrintList (struct Node * head) {struct Node * s;if(head NULL){printf("None&qu…

Apipost模拟HTTP客户端

模拟HTTP客户端的软件有很多&#xff0c;其中比较著名的就有API-FOX、POSTMAN。 相信很多小伙伴都使用POSTMAN。这篇博客主要介绍Apipost的原因是&#xff0c;Apipost无需下载&#xff0c;具有网页版。 APIFOX的站内下载&#xff1a; Api-Fox&#xff0c;类似于PostMan的软件…

JavaFX 节点

JavaFX Node类javafx.scene.Node是添加到JavaFX 场景图的所有组件 的基类&#xff08;超类&#xff09; 。JavaFX Node 类是抽象的&#xff0c;因此你只需将 Node 类的子类添加到场景图中。场景图中的所有 JavaFX Node 实例共享一组由 JavaFX Node 类定义的公共属性。本 JavaFX…

一文了解Redis

一.什么是Redis 与MySQL一样&#xff0c;Redis也是客户端服务器结构的程序&#xff0c;是基于内存的键值对存储系统&#xff0c;属于NoSQL的一种。与很多键值对数据库不同的是&#xff0c;Redis 中的值可以是由 string&#xff08;字符串&#xff09;、hash&#xff08;哈希&a…