Java的数据库编程:JDBC
Content
🎉1什么是API
🎉2.什么是JDBC
🎉3.数据库驱动包的安装
🎉4.数据库安装包在idea的使用
🎉5.JDBC的增删改查的简单实现
今天为大家带来JAVA的数据库编程,也就是用Java实现数据库
数据库的最基本的操作就是增删改查
在实工作中,手敲sql语句几乎用不到,更多的是用代码来实现sql语句
像常见的数据库,比如mysal,sqlsever,Oracle等数据库软件,在开发的时候会提供编程的接口,叫做API
什么是API呢,也就是实现某种功能,例如Java的接口,就是API,比如Collection接口,里面有很多方法,可以实现很多功能,总的来说API多用于函数的形式来表示
现在要用Java实现数据库,那么也需要提供一个API用来对接Java和数据库,那么就要用JDBC,Java对数据库提出要求,数据库本来的功能上要增加一些来匹配Java,这样才可以让Java操作数据库,执行数据库.
JDBC,全称,Java Database Connectivity,是java和数据库的连接。是一种用于执行SQL语句的Java API,它是 Java中的数据库连接规范。可以为多种关系数据库提供统一访问.

Java通过JDBC操作数据库,那jdbc和数据库建立连接的时候,需要使用数据库驱动包,就是对不同数据库的原生API进行封装,封装成JDBC认识的API,,Java需要在项目导入数据库驱动包,也才能执行数据库,那么我们就需要下载驱动包,这里我们选择去maven中央仓库下载
上链接
https://mvnrepository.com/


这个要和自己下载的数据库的版本要匹配,因为我下载的是5系列的,所以我要用这个,5开头的都可以选

点击这个
然后下载了,之后,建立一个项目,然后在项目点新建directory,拷贝这个地址,就建立了lib文件

就像这样,这样数据库就和java建立连接了,现在就可以开始在idea编辑数据库代码了
还是和数据库一样,实现增删改查,上代码
import com.mysql.jdbc.jdbc2.optional.MysqlDataSource;import javax.sql.ConnectionEvent;
import javax.sql.DataSource;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;/*** Created with IntelliJ IDEA.* Description:* User: WHY* Date: 2023-03-03* Time: 20:57*/
//JDBC实现sql
public class JDBCInsert {public static void main(String[] args) throws SQLException {//JDBC需要以下步骤完成开发//1.创建并初始化一个数据源DataSource dataSource=new MysqlDataSource();//向上转型((MysqlDataSource) dataSource).setUrl("jdbc:mysql://127.0.0.1:3306/java107?characterEncoding=utf8&useSSL=false");//向下转型,因为seturl这个方法是子方法特有的((MysqlDataSource) dataSource).setUser("root");//设置用户名((MysqlDataSource) dataSource).setPassword("1111");//就是数据库的密码//2.和数据库服务器建立连接Connection connection=dataSource.getConnection();//3.构造sql语句String sql="insert into student values(1,'张三')";PreparedStatement statement=connection.prepareStatement(sql);//提前预编译一下sql,客户端对发出的请求进行预编译,减轻服务器的压力//4.执行sql语句int ret= statement.executeUpdate();System.out.println(ret);//5.释放必要的资源statement.close();connection.close();}
}


看看执行结果,在idea上结果是1的原因是,stament.executeUpdate这个方法返回类型就是int型的,代表修改的行数
执行完以后记得释放资源
现在对这段代码进行优化,发现在构造sql语句的时候比较麻烦,进行优化
String sql="insert into student values(1,'张三')";
这个语句把要输入的内容写死了,也就是硬编码,在现实开发环境中,要为用户考虑,所以要写用户输入
public class JDBCInsert {public static void main(String[] args) throws SQLException {Scanner scanner=new Scanner(System.in);//JDBC需要以下步骤完成开发//1.创建并初始化一个数据源DataSource dataSource=new MysqlDataSource();//向上转型((MysqlDataSource) dataSource).setUrl("jdbc:mysql://127.0.0.1:3306/java107?characterEncoding=utf8&useSSL=false");//向下转型,因为seturl这个方法是子方法特有的((MysqlDataSource) dataSource).setUser("root");//设置用户名((MysqlDataSource) dataSource).setPassword("1111");//就是数据库的密码//2.和数据库服务器建立连接Connection connection=dataSource.getConnection();//3.从控制台读取用户输入的的内容System.out.println("请输入姓名");String name=scanner.next();System.out.println("请输入学号");int id=scanner.nextInt();//4.构造sql语句String sql="insert into student values("+id+",'"+name+"')";PreparedStatement statement=connection.prepareStatement(sql);//提前预编译一下sql,客户端对发出的请求进行预编译,减轻服务器的压力//5.执行sql语句int ret= statement.executeUpdate();System.out.println(ret);//6.释放必要的资源statement.close();connection.close();}
但是这种写法容易产生sql注入问题
public static void main(String[] args) throws SQLException {Scanner scanner=new Scanner(System.in);//JDBC需要以下步骤完成开发//1.创建并初始化一个数据源DataSource dataSource=new MysqlDataSource();//向上转型((MysqlDataSource) dataSource).setUrl("jdbc:mysql://127.0.0.1:3306/java107?characterEncoding=utf8&useSSL=false");//向下转型,因为seturl这个方法是子方法特有的((MysqlDataSource) dataSource).setUser("root");//设置用户名((MysqlDataSource) dataSource).setPassword("1111");//就是数据库的密码//2.和数据库服务器建立连接Connection connection=dataSource.getConnection();//3.从控制台读取用户输入的的内容System.out.println("请输入姓名");String name=scanner.next();System.out.println("请输入学号");int id=scanner.nextInt();//4.构造sql语句String sql="insert into student values(?,?)";PreparedStatement statement=connection.prepareStatement(sql);//提前预编译一下sql,客户端对发出的请求进行预编译,减轻服务器的压力statement.setInt(1,id);statement.setString(2,name);//5.执行sql语句int ret= statement.executeUpdate();System.out.println(ret);//6.释放必要的资源statement.close();connection.close();}

问号代表占位符,下面的setint里面的1,id代表第一个问号放id,第二个问号放name ,然后根据动态输入就自动放入到sql语句中


这一段就是Preparestatement方法拼接以后 的数据
释放资源:
数据库的客户端和服务器通过网络进行通信,需要占用一定的资源,但客户端很多,服务器很少时,要即及时释放资源
谁先创建,谁就后释放
DataSource内置了数据库连接池,可以复用连接,提高连接服务器的效率
现在写查询操作
public class TestDemo {public static void main(String[] args) throws SQLException {//JDBC需要以下步骤完成开发//1.创建并初始化一个数据源DataSource dataSource=new MysqlDataSource();//向上转型((MysqlDataSource) dataSource).setUrl("jdbc:mysql://127.0.0.1:3306/java107?characterEncoding=utf8&useSSL=false");//向下转型,因为seturl这个方法是子方法特有的((MysqlDataSource) dataSource).setUser("root");//设置用户名((MysqlDataSource) dataSource).setPassword("1111");//就是数据库的密码//2.和数据库服务器建立连接Connection connection=dataSource.getConnection();//3.构造sql语句String sql="select* from student";PreparedStatement statement=connection.prepareStatement(sql);//提前预编译一下sql,客户端对发出的请求进行预编译,减轻服务器的压力//4.执行sql语句ResultSet resultSet= statement.executeQuery();//5遍历结果集合while(resultSet.next()){int id=resultSet.getInt("id");String name=resultSet.getString("name");System.out.println("+id+"+id+"name"+name);}//6.释放必要的资源resultSet.close();statement.close();connection.close();}
resultset这个代表查询的结果集,用到的get方法相当于就是拿到某下标 的元素
删除操作
public static void main(String[] args) throws SQLException {Scanner scanner=new Scanner(System.in);//JDBC需要以下步骤完成开发//1.创建并初始化一个数据源DataSource dataSource=new MysqlDataSource();//向上转型((MysqlDataSource) dataSource).setUrl("jdbc:mysql://127.0.0.1:3306/java107?characterEncoding=utf8&useSSL=false");//向下转型,因为seturl这个方法是子方法特有的((MysqlDataSource) dataSource).setUser("root");//设置用户名((MysqlDataSource) dataSource).setPassword("1111");//就是数据库的密码//2.和数据库服务器建立连接Connection connection=dataSource.getConnection();/*//3.从控制台读取用户输入的的内容System.out.println("请输入姓名");String name=scanner.next();System.out.println("请输入学号");int id=scanner.nextInt();*///4.构造sql语句String sql="delete from student where id=1";PreparedStatement statement=connection.prepareStatement(sql);//提前预编译一下sql,客户端对发出的请求进行预编译,减轻服务器的压力/* statement.setInt(1,id);statement.setString(2,name);*/System.out.println(statement);//5.执行sql语句int ret= statement.executeUpdate();System.out.println(ret);//6.释放必要的资源statement.close();connection.close();}
}
修改操作
public static void main1(String[] args) throws SQLException {Scanner scanner=new Scanner(System.in);//JDBC需要以下步骤完成开发//1.创建并初始化一个数据源DataSource dataSource=new MysqlDataSource();//向上转型((MysqlDataSource) dataSource).setUrl("jdbc:mysql://127.0.0.1:3306/java107?characterEncoding=utf8&useSSL=false");//向下转型,因为seturl这个方法是子方法特有的((MysqlDataSource) dataSource).setUser("root");//设置用户名((MysqlDataSource) dataSource).setPassword("1111");//就是数据库的密码//2.和数据库服务器建立连接Connection connection=dataSource.getConnection();/*//3.从控制台读取用户输入的的内容System.out.println("请输入姓名");String name=scanner.next();System.out.println("请输入学号");*//*int id=scanner.nextInt();*///3.构造sql语句String sql="update student set id=12 where name='张三'";PreparedStatement statement=connection.prepareStatement(sql);//提前预编译一下sql,客户端对发出的请求进行预编译,减轻服务器的压力System.out.println(statement);//4.执行sql语句int ret= statement.executeUpdate();System.out.println(ret);//5.释放必要的资源statement.close();connection.close();}
这就是今天的所有内容了,我们下期再见!!!
相关文章:
Java的数据库编程:JDBC
Content 🎉1什么是API 🎉2.什么是JDBC 🎉3.数据库驱动包的安装 🎉4.数据库安装包在idea的使用 🎉5.JDBC的增删改查的简单实现 今天为大家带来JAVA的数据库编程,也就是用Java实现数据库 数据库的最基本的操作就是…...
蓝桥冲刺31天之第六天
今天是摆子的一天,明天我要肝一整天的第四题!!! PS:一个普通的排序罢了 import java.io.*; import java.util.Arrays; import java.util.Scanner;/*** ClassName 考勤刷卡* Description TODO* Author 小怂很怂* Date 2…...
Streamlit 工具记录
Streamlit 是基于 Python 的 Web 应用程序框架,可视化数据,分析结果。 Streamlit 是一个开源库,可在短时间内开发机器学习可视化仪表板。只需几行代码就可以构部署强大的数据应用程序。Streamlit 可将仪表板的开发时间从几天缩短至几小时。 …...
GreenPlum小结
什么是GreenPlum?GreenPlum是业界最快最高性价比的关系型分布式数据库,它在开源的PostgreSQL的基础上采用MPP架构(Massive Parallel Processing,海量并行处理),具有强大的大规模数据分析任务处理能力。GreenPlum作为大数据融合存储…...
C语言中数组和指针
文章目录前言一、指针的概念二、指针的大小三、指针的用法1.指针指向变量2.指针指向数组3.指针指向函数总结前言 本文将给大家带来C语言中非常重要的两个知识点,指针和数组。 一、指针的概念 指针,是C语言中的一个重要概念及其特点,也是掌…...
Leetcode.剑指 Offer II 022 链表中环的入口节点
题目链接 Leetcode.剑指 Offer II 022 链表中环的入口节点 mid 题目描述 给定一个链表,返回链表开始入环的第一个节点。 从链表的头节点开始沿着 next指针进入环的第一个节点为环的入口节点。如果链表无环,则返回 null。 为了表示给定链表中的环&#…...
4种不同编程语言的打印方式
意义 打印方式是编程中不可或缺的一部分,它可以帮助开发人员有效地调试和测试代码,并提供有用的信息来监视程序的运行状态和性能。 编程语言中的打印方式是指将程序输出到终端或控制台上进行显示。这个功能在编程中非常重要,因为它可以帮助开…...
websocket介绍
我们聊聊轮询技术,什么是轮询?轮询就是在特定的时间间隔,由浏览器对服务器发出HTTP请求,然后由服务器返回最新的数据给客户端的浏览器。 轮询分为两种: 短轮询:通过不断的向服务端发送数据,客户端发送Request,服务端直接返回Response(不管服务端数据有没有改变)。长轮…...
Educational Codeforces Round 144 (Rated for Div. 2),C,D
C. Maximum Set 思路: 我们求最大数组,显然是L一直乘2,直到再乘2就越过区间位置。我们说过,再乘一个2就不行,那么我们除一个2,换句话说,就是再乘一个4就不行了。发现,我们可能有机会乘一个3&a…...
【redis学习篇】Redis三种持久化方式详解
官方文档 一、Redis持久性 Redis如何将数据写入磁盘 持久性是指将数据写入持久存储,如固态磁盘(SSD)。Redis提供了一系列持久性选项。其中包括: RDB(快照):RDB持久性以指定的时间间隔执行数据…...
垃圾回收中的分代年龄
为什么CMS里的分代年龄是6而不是15 CMS (Concurrent Mark Sweep) 是一种基于分代的垃圾收集器,其中分代年龄指的是一个对象在年轻代中经历了多少次垃圾收集。在 CMS 中,当一个对象的分代年龄达到阈值时,就会被晋升到老年代中。 在 CMS 中&a…...
蓝桥杯-左移右移(2022国赛)
蓝桥杯-左移右移1、问题描述2、解题思路与代码实现2.1 方法一:使用LinkedList双向链表实现(50%)2.2 方法二:使用HashMap左右临界值实现(100%)1、问题描述 小蓝有一个长度为 N 的数组, 初始时从左到右依次是 1,2,3,…N 。 之后小蓝对这个数组进行了 M 次操…...
你还在手撸SQL?ChatGPT笑晕在厕所
文章目录你还在手撸SQL?ChatGPT笑晕在厕所一、背景二、面向Chat编程1. 数据库设计2. 建表语句3. 加中文注释4. 数据模拟5. 查询成绩6. 修改课程任课老师7. 删除课程8. 删除一个有关联数据的课程总结你还在手撸SQL?ChatGPT笑晕在厕所 一、背景 经典3表设…...
【Redis】Redis慢查询
文章目录慢查询记录慢查询两个配置参数修改配置参数慢查询日志慢查询记录 我们都知道像mysql等持久化数据库会有慢查询日志,其实Redis中也有慢查询日志的功能。慢查询就是系统在执行命令的前后计算每条命令的执行时间,如果超过我们预设的时间,…...
【Kubernetes】第二十一篇 - k8s 项目部署流程和操作梳理
一,前言 上一篇,介绍了 k8s 污点和容忍度; 在了解前面 k8s 介绍之后,设计并完成一个前后端项目的部署和持续集成; 本篇,介绍基于 k8s 项目部署流程设计; 二,项目部署流程设计 本…...
推荐系统[九]项目技术细节讲解z2:搜索Query理解[Term Weight、Query 改写、同义词扩写]和语义召回技术
搜索Query理解和语义召回技术 随着用户规模和产品的发展, 搜索面临着越来越大的 query 长尾化挑战,query 理解是提升搜索召回质量的关键。本次将介绍搜索在 query term weighting,同义词扩展,query 改写,以及语义召回等方向上的实践方法和落地情况。 1.面临问题:长尾 qu…...
【项目精选】基于SSH的医院在线挂号系统(视频+论文+源码)
点击下载源码 医院挂号系统主要用于实现医院的挂号,前台基本功能包括:用户注册、用户登录、医院查询、挂号、取消挂号、修改个人信息、退出等。 后台基本功能包括:系统管理员登录、医院管理、科室管理、公告管理、退出系统等。 本系统结构如…...
Pandas库:从入门到应用(一)
一、Pandas简介 pandas是 Python 的核⼼数据分析⽀持库,提供了快速、灵活、明确的数据结构,旨在简单、直观地处理关系型、标记型数据。pandas是Python进⾏数据分析的必备⾼级⼯具。 pandas的主要数据结构是 **Series(**⼀维数据)与 DataFrame (⼆维数据…...
MySQL中concat()、concat_ws()、group_concat()函数使用
在平时工作中,经常记不清或者记混他们的用法,正好有时间就记录一下~concat()函数语法:concat(str1, str2, int1...)例如执行sql:SELECT CONCAT(id,USERNAME,USER_PHONE) FROM tb_user输出查询结果为: 1test15216756754…...
【JavaEE初阶】第四节.文件操作 和 IO (上篇)
提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 前言一、文件 1.1 文件的概念 1.2 文件的路径二、 Java中文件系统操作 2.1 File类的属性 2.2 File类的构造方法 2.3 File类的方法 …...
从WWDC看苹果产品发展的规律
WWDC 是苹果公司一年一度面向全球开发者的盛会,其主题演讲展现了苹果在产品设计、技术路线、用户体验和生态系统构建上的核心理念与演进脉络。我们借助 ChatGPT Deep Research 工具,对过去十年 WWDC 主题演讲内容进行了系统化分析,形成了这份…...
以下是对华为 HarmonyOS NETX 5属性动画(ArkTS)文档的结构化整理,通过层级标题、表格和代码块提升可读性:
一、属性动画概述NETX 作用:实现组件通用属性的渐变过渡效果,提升用户体验。支持属性:width、height、backgroundColor、opacity、scale、rotate、translate等。注意事项: 布局类属性(如宽高)变化时&#…...
uni-app学习笔记二十二---使用vite.config.js全局导入常用依赖
在前面的练习中,每个页面需要使用ref,onShow等生命周期钩子函数时都需要像下面这样导入 import {onMounted, ref} from "vue" 如果不想每个页面都导入,需要使用node.js命令npm安装unplugin-auto-import npm install unplugin-au…...
生成 Git SSH 证书
🔑 1. 生成 SSH 密钥对 在终端(Windows 使用 Git Bash,Mac/Linux 使用 Terminal)执行命令: ssh-keygen -t rsa -b 4096 -C "your_emailexample.com" 参数说明: -t rsa&#x…...
vue3 定时器-定义全局方法 vue+ts
1.创建ts文件 路径:src/utils/timer.ts 完整代码: import { onUnmounted } from vuetype TimerCallback (...args: any[]) > voidexport function useGlobalTimer() {const timers: Map<number, NodeJS.Timeout> new Map()// 创建定时器con…...
AspectJ 在 Android 中的完整使用指南
一、环境配置(Gradle 7.0 适配) 1. 项目级 build.gradle // 注意:沪江插件已停更,推荐官方兼容方案 buildscript {dependencies {classpath org.aspectj:aspectjtools:1.9.9.1 // AspectJ 工具} } 2. 模块级 build.gradle plu…...
Unsafe Fileupload篇补充-木马的详细教程与木马分享(中国蚁剑方式)
在之前的皮卡丘靶场第九期Unsafe Fileupload篇中我们学习了木马的原理并且学了一个简单的木马文件 本期内容是为了更好的为大家解释木马(服务器方面的)的原理,连接,以及各种木马及连接工具的分享 文件木马:https://w…...
Angular微前端架构:Module Federation + ngx-build-plus (Webpack)
以下是一个完整的 Angular 微前端示例,其中使用的是 Module Federation 和 npx-build-plus 实现了主应用(Shell)与子应用(Remote)的集成。 🛠️ 项目结构 angular-mf/ ├── shell-app/ # 主应用&…...
高效线程安全的单例模式:Python 中的懒加载与自定义初始化参数
高效线程安全的单例模式:Python 中的懒加载与自定义初始化参数 在软件开发中,单例模式(Singleton Pattern)是一种常见的设计模式,确保一个类仅有一个实例,并提供一个全局访问点。在多线程环境下,实现单例模式时需要注意线程安全问题,以防止多个线程同时创建实例,导致…...
ui框架-文件列表展示
ui框架-文件列表展示 介绍 UI框架的文件列表展示组件,可以展示文件夹,支持列表展示和图标展示模式。组件提供了丰富的功能和可配置选项,适用于文件管理、文件上传等场景。 功能特性 支持列表模式和网格模式的切换展示支持文件和文件夹的层…...
