当前位置: 首页 > news >正文

JDBC学习笔记

1 JDBC简介

1.1 前言

当谈论JDBC时,我们可以将其看作是一种用于Java程序与数据库进行通信的方式。如果你想编写一个Java程序,并且希望能够连接到数据

库、执行查询或更新数据,JDBC就是你需要的工具。

JDBC提供了一组类和接口,可以帮助我们连接到数据库、执行SQL语句(例如查询、插入、更新和删除数据),并获取执行结果。

1.2 概念

JDBC(Java DataBase Connectivity :java数据库连接技术)是一种用于执行SQL语句的Java API,可以为多种关系型数据库提供统一访问,它是由一组用Java语言编写的类和接口组成的。

1.3 作用

可以通过java代码操作数据库。通过Java连接广泛的数据库,并对表中数据执行增、删、改、查等操作。

实质就是java官方提供的一套规范(接口),用于帮助开发人员快速实现不同关系型数据库的连接。

2 JDBC入门

2.1 流程

第一步:编写Java代码

第二步:Java代码将SQL发送到MySQL服务端

第三步:MySQL服务端接收到SQL语句并执行该SQL语句

第四步:将SQL语句执行的结果返回给Java代码

2.2 步骤

  • 创建工程,导入驱动jar包

  • 注册驱动

  • 获取连接

    Java代码需要发送SQL给MySQL服务端,就需要先建立连接

  • 定义SQL语句

  • 获取执行SQL对象

    执行SQL语句需要SQL执行对象,而这个执行对象就是Statement对象

  • 执行SQL

  • 处理返回结果

  • 释放资源

import java.sql.*;public class JDBCDemo {public static void main(String[] args) throws Exception {
//        1.注册驱动Class.forName("com.mysql.jdbc.Driver");//        2.获取连接String url = "jdbc:mysql://127.0.0.1:3307/student?useSSL=false";String username = "root";String password = "root";Connection Conn = DriverManager.getConnection(url, username, password);//        3.定义SQL语句String sql = "UPDATE `user` SET adress = 200 WHERE id = 1";//        4.获取执行SQL的对象 statementStatement stmt = Conn.createStatement();//        5.执行SQLint count = stmt.executeUpdate( sql );//受影响的行数//        6.处理结果System.out.println(count);//        7.释放资源stmt.close();Conn.close();}
}

3 JDBC API详解

3.1 DriverManager

DriverManager(驱动管理类)作用:

  • 注册驱动

  • 获取数据库连接

public class JDBCDemo2_DriverManager {public static void main(String[] args) throws Exception {//1. 注册驱动//Class.forName("com.mysql.jdbc.Driver");//2. 获取连接:如果连接的是本机mysql并且端口是默认的 3306 可以简化书写String url = "jdbc:mysql://127.0.0.1:3307/db1?useSSL=false";String username = "root";String password = "root";Connection conn = DriverManager.getConnection(url, username, password);//3. 定义sqlString sql = "update account set money = 2000 where id = 1";//4. 获取执行sql的对象 StatementStatement stmt = conn.createStatement();//5. 执行sqlint count = stmt.executeUpdate(sql);//受影响的行数//6. 处理结果System.out.println(count);//7. 释放资源stmt.close();conn.close();}
}

3.2 Connection

Connection中定义了3个对应的方法:

  • 开启事务

  • 提交事务

  • 回滚事务

/*** JDBC API 详解:Connection*/
public class JDBCDemo3_Connection {public static void main(String[] args) throws Exception {//1. 注册驱动//Class.forName("com.mysql.jdbc.Driver");//2. 获取连接:如果连接的是本机mysql并且端口是默认的 3306 可以简化书写String url = "jdbc:mysql://127.0.0.1:3307/db1?useSSL=false";String username = "root";String password = "root";Connection conn = DriverManager.getConnection(url, username, password);//3. 定义sqlString sql1 = "update account set money = 3000 where id = 1";String sql2 = "update account set money = 3000 where id = 2";//4. 获取执行sql的对象 StatementStatement stmt = conn.createStatement();try {// ============开启事务==========conn.setAutoCommit(false);//5. 执行sqlint count1 = stmt.executeUpdate(sql1);//受影响的行数//6. 处理结果System.out.println(count1);int i = 3/0;//5. 执行sqlint count2 = stmt.executeUpdate(sql2);//受影响的行数//6. 处理结果System.out.println(count2);// ============提交事务==========//程序运行到此处,说明没有出现任何问题,则需求提交事务conn.commit();} catch (Exception e) {// ============回滚事务==========//程序在出现异常时会执行到这个地方,此时就需要回滚事务conn.rollback();e.printStackTrace();}//7. 释放资源stmt.close();conn.close();}
}

3.3 Statement

Statement对象的作用就是用来执行SQL语句。而针对不同类型的SQL语句使用的方法也不一样。

  • 执行DDL、DML语句

  • 执行DQL语句

  • 执行DML语句

    /*** 执行DML语句* @throws Exception*/
    @Test
    public void testDML() throws  Exception {//1. 注册驱动//Class.forName("com.mysql.jdbc.Driver");//2. 获取连接:如果连接的是本机mysql并且端口是默认的 3306 可以简化书写String url = "jdbc:mysql://127.0.0.1:3307/db1?useSSL=false";String username = "root";String password = "root";Connection conn = DriverManager.getConnection(url, username, password);//3. 定义sqlString sql = "update account set money = 3000 where id = 1";//4. 获取执行sql的对象 StatementStatement stmt = conn.createStatement();//5. 执行sqlint count = stmt.executeUpdate(sql);//执行完DML语句,受影响的行数//6. 处理结果//System.out.println(count);if(count > 0){System.out.println("修改成功~");}else{System.out.println("修改失败~");}//7. 释放资源stmt.close();conn.close();
    }
    
  • 执行DDL语句

    /*** 执行DDL语句* @throws Exception*/
    @Test
    public void testDDL() throws  Exception {//1. 注册驱动//Class.forName("com.mysql.jdbc.Driver");//2. 获取连接:如果连接的是本机mysql并且端口是默认的 3306 可以简化书写String url = "jdbc:mysql:///db1?useSSL=false";String username = "root";String password = "1234";Connection conn = DriverManager.getConnection(url, username, password);//3. 定义sqlString sql = "drop database db2";//4. 获取执行sql的对象 StatementStatement stmt = conn.createStatement();//5. 执行sqlint count = stmt.executeUpdate(sql);//执行完DDL语句,可能是0//6. 处理结果System.out.println(count);//7. 释放资源stmt.close();conn.close();
    }
    

3.4 ResultSet

  • 代码实现

    /*** 查询account账户表数据,封装为Account对象中,并且存储到ArrayList集合中* 1. 定义实体类Account* 2. 查询数据,封装到Account对象中* 3. 将Account对象存入ArrayList集合中*/
    @Test
    public void testResultSet2() throws  Exception {//1. 注册驱动//Class.forName("com.mysql.jdbc.Driver");//2. 获取连接:如果连接的是本机mysql并且端口是默认的 3306 可以简化书写String url = "jdbc:mysql://127.0.0.1:3307/db1?useSSL=false";String username = "root";String password = "root";Connection conn = DriverManager.getConnection(url, username, password);//3. 定义sqlString sql = "select * from account";//4. 获取statement对象Statement stmt = conn.createStatement();//5. 执行sqlResultSet rs = stmt.executeQuery(sql);// 创建集合List<Account> list = new ArrayList<>();// 6.1 光标向下移动一行,并且判断当前行是否有数据while (rs.next()){Account account = new Account();//6.2 获取数据  getXxx()int id = rs.getInt("id");String name = rs.getString("name");double money = rs.getDouble("money");//赋值account.setId(id);account.setName(name);account.setMoney(money);// 存入集合list.add(account);}System.out.println(list);//7. 释放资源rs.close();stmt.close();conn.close();
    }
    

3.5 PreparedStatement

  • java测试代码如下:

     /*** PreparedStatement原理* @throws Exception*/
    @Test
    public void testPreparedStatement2() throws  Exception {//2. 获取连接:如果连接的是本机mysql并且端口是默认的 3306 可以简化书写// useServerPrepStmts=true 参数开启预编译功能String url = "jdbc:mysql://127.0.0.1:3307/db1?useSSL=false&useServerPrepStmts=true";String username = "root";String password = "root";Connection conn = DriverManager.getConnection(url, username, password);// 接收用户输入 用户名和密码String name = "zhangsan";String pwd = "' or '1' = '1";// 定义sqlString sql = "select * from tb_user where username = ? and password = ?";// 获取pstmt对象PreparedStatement pstmt = conn.prepareStatement(sql);Thread.sleep(10000);// 设置?的值pstmt.setString(1,name);pstmt.setString(2,pwd);ResultSet rs = null;// 执行sqlrs = pstmt.executeQuery();// 设置?的值pstmt.setString(1,"aaa");pstmt.setString(2,"bbb");// 执行sqlrs = pstmt.executeQuery();// 判断登录是否成功if(rs.next()){System.out.println("登录成功~");}else{System.out.println("登录失败~");}//7. 释放资源rs.close();pstmt.close();conn.close();
    }
    

相关文章:

JDBC学习笔记

1 JDBC简介 1.1 前言 当谈论JDBC时&#xff0c;我们可以将其看作是一种用于Java程序与数据库进行通信的方式。如果你想编写一个Java程序&#xff0c;并且希望能够连接到数据 库、执行查询或更新数据&#xff0c;JDBC就是你需要的工具。 JDBC提供了一组类和接口&#xff0c;…...

亚信科技AntDB数据库与库瀚存储方案完成兼容性互认证,联合方案带来约20%性能提升

近日&#xff0c;亚信科技AntDB数据库与苏州库瀚信息科技有限公司自主研发的RISC-V数据库存储解决方案进行了产品兼容测试。经过双方团队的严格测试&#xff0c;亚信科技AntDB数据库与库瀚数据库存储解决方案完全兼容、运行稳定。除高可用性测试外&#xff0c;双方进一步开展TP…...

【MySQL】基础知识(一)

MySQL基础知识&#xff08;一&#xff09; 文章目录 MySQL基础知识&#xff08;一&#xff09;00 MySQL安装01 数据库介绍1.1 什么是数据库1.2数据库分类 02 SQL分类03 数据库操作3.1显示数据库3.2创建数据库3.3选中数据库3.4删除数据库 04 常用数据类型4.1数值类型4.2字符串类…...

Ansible专栏目录

我的博客&#xff1a;www.itwk.cc 希望能够给大家带来帮助&#xff01; 1、什么是Ansible&#xff1f;Ansible 简介及核心概念详解 https://blog.csdn.net/qq_34185638/article/details/131079320 2、Ansible Inventory 主机清单的作用、使用方法及示例详解 https://blog.cs…...

【locust】使用locust + boomer实现对接口的压测

目录 背景 环境安装 脚本编写 master slave节点&#xff08;golang/boomer&#xff09; 问题 资料获取方法 背景 很早之前&#xff0c;考虑单机执行能力&#xff0c;使用locust做过公司短信网关的压测工作&#xff0c;后来发现了一个golang版本的locust&#xff0c;性能…...

亿欧智库:2023中国宠物行业新趋势洞察报告(附下载)

关于报告的所有内容&#xff0c;公众【营销人星球】获取下载查看 核心观点 户外赛道本质上迎合了全球共性需求的增长&#xff0c;从养宠意愿的转化到养宠生活的需求&#xff0c;多层次的需求推动行业发展新趋势 从需求端进行分析&#xff0c;可以将养宠意愿的转化分为三个层…...

时序数据库 TDengine 与 WhaleStudio 完成相互兼容性测试认证

近年来&#xff0c;开源及其价值获得社会各界的广泛认可&#xff0c;无论是国家政策导向还是企业数字化转型&#xff0c;都在加速拥抱开源。对于如操作系统、数据库等基础软件来说&#xff0c;开源更是成为驱动技术创新的有力途径。 在此背景下&#xff0c;近日&#xff0c;涛…...

Spring-1-深入理解Spring XML中的依赖注入(DI):简化Java应用程序开发

学习目标 前两篇文章我们介绍了什么是Spring,以及Spring的一些核心概念&#xff0c;并且快速快发一个Spring项目&#xff0c;以及详细讲解IOC&#xff0c;今天详细介绍一些DI(依赖注入) 能够配置setter方式注入属性值 能够配置构造方式注入属性值 能够理解什么是自动装配 一、…...

负载均衡–HAProxy安装及搭建tidb数据库负载服务

作为一名开发人员&#xff0c;随着经验的增加和技术的沉淀&#xff0c;需要提高自己架构方面的知识&#xff0c;同时对于一个企业来说&#xff0c;搭建一套高可用、高性能的技术架构&#xff0c;对于公司的业务开展和提高服务的性能也是大有裨益的。本文重点从软件安装和搭建ti…...

Django各种缓存的配置

Django提供了多种缓存后端&#xff0c;如内存缓存、文件缓存、数据库缓存、Memcached和Redis等。根据项目需求选择合适的缓存后端。 settings配置 在Django项目的settings.py文件中&#xff0c;找到或新增CACHES配置项。根据所选的缓存后端&#xff0c;配置相应的参数。以下是…...

实现跨域的几种方式

原理 前后端的分离导致了跨域的产生 跨域的三要素&#xff1a;协议 域名 端口 三者有一个不同即产生跨域 例如&#xff1a; http://www.csdn.com https://www.csdn.com 由于协议不同&#xff0c;端口不同而产生跨域 注&#xff1a;http的默认端口80&#xff0c;https的默…...

OpenCV: 对“google::protobuf::internal::Release_CompareAndSwap”的未定义

解决办法&#xff1a; 需要在文件 protobuf/src/google/protobuf/stubs/atomicops_internals_generic_gcc.h 中的以下补丁 inline Atomic64 Release_CompareAndSwap(volatile Atomic64* ptr, Atomic64 old_value, …...

无涯教程-Perl - References(引用)

Perl引用是一个标量数据类型&#xff0c;该数据类型保存另一个值的位置&#xff0c;该值可以是标量&#xff0c;数组或哈希。 创建引用 变量&#xff0c;子程序或值创建引用很容易&#xff0c;方法是在其前面加上反斜杠&#xff0c;如下所示: $scalarref \$foo; $arrayref …...

马斯克收购AI.com域名巩固xAI公司地位;如何评估大型语言模型的性能

&#x1f989; AI新闻 &#x1f680; AI拍照小程序妙鸭相机上线商业工作站并邀请摄影师进行内测 摘要&#xff1a;AI拍照小程序妙鸭相机将上线面向商业端的工作站&#xff0c;并邀请摄影师进行模板设计的内测。妙鸭相机希望为行业提供更多生态产品&#xff0c;扩大行业规模&a…...

uni-app:实现点击按钮出现底部弹窗(uni.showActionSheet+自定义)

一、通过uni.showActionSheet实现底部选择 效果 代码 <template><view><button click"showActionsheet">点击打开弹窗</button></view> </template><script> export default {methods: {showActionsheet() {uni.showAct…...

flume系列之:监控zookeeper的flume配置写入节点,新增和删除flume agent节点,通过ansible自动部署和卸载flume agent

flume系列之:监控zookeeper的flume配置写入节点,新增和删除flume agent节点,通过ansible自动部署和卸载flume agent 一、相关技术二、流程梳理三、部署和删除flume agent效果四、监控zookeeper节点五、新增zookeeper节点部署flume agent六、删除zookeeper节点删除flume agen…...

了解以太网通信中的九阳神功 - SOME/IP协议

智能座舱SOME/IP通信 概述SOME/IP基础协议SOME/IP SD协议通信行为流程开机流程关机行为行为时序总结概述 SOME/IP协议是目前国内座舱SOA化应用比较广泛的一种ECU或车辆网络内设备之间交换数据的网络通信协议。它允许不同车辆组件,如发动机控制单元、信息娱乐系统、车身控制模…...

redis List类型命令

在Redis中&#xff0c;List&#xff08;列表&#xff09;是一种有序的、可重复的数据结构&#xff0c;它支持插入、删除和获取元素的操作。以下是一些常见的Redis List类型命令&#xff1a; LPUSH&#xff1a;将一个或多个值从列表的左侧插入。LPUSH key value1 value2 ...其中…...

【博客685】prometheus 出现NaN场景以及如何去除干扰(Not a Number)

prometheus 出现NaN场景以及如何去除干扰(Not a Number) 1、在prometheus中使用NaN来表示无效数值或者结果 场景&#xff1a; 一些监控系统使用 NaN 作为空值或缺失值&#xff0c;但在 Prometheus 中 NaN 只是另一个浮点值。Prometheus 表示缺失数据的方式是让数据缺失。Prom…...

【计算机网络】网络层协议 -- ICMP协议

文章目录 1. ICMP协议简介2. ICMP协议格式3. ping命令4. ping命令与端口号没有关系&#xff01;&#xff01;&#xff01;5. traceroute命令 1. ICMP协议简介 ICMP&#xff08;Internet Control Message Protocol&#xff0c;控制报文协议&#xff09;&#xff0c;用于在IP主机…...

NotebookLM显著性判断失效真相:92%用户忽略的3个统计学前提及实时校验脚本

更多请点击&#xff1a; https://codechina.net 第一章&#xff1a;NotebookLM显著性判断失效的典型现象与影响评估 NotebookLM 在处理多源异构文档时&#xff0c;其内置的“显著性判断”模块&#xff08;Significance Scorer&#xff09;常因语义稀疏、上下文截断或引用锚点偏…...

拆解正点原子STM32F103综合例程:如何用一块MCU实现MP3播放器、NES游戏机和简易手机?

STM32F103多功能系统设计&#xff1a;从MP3播放器到NES游戏机的工程实践 在嵌入式系统开发领域&#xff0c;如何利用有限资源实现复杂功能一直是工程师面临的挑战。正点原子STM32F103战舰开发板的综合例程展示了这款经典MCU的强大潜力——通过精心设计的软件架构&#xff0c;将…...

2026特级防火卷帘门价格明细、国标参数及选购避坑指南(河北厂家实测)

在商业综合体、地下车库、厂房消防验收场景中&#xff0c;特级防火卷帘门是核心防火分隔设备&#xff0c;因具备3小时极限耐火极限&#xff0c;成为大型建筑消防报审的刚需产品。很多工程采购、消防从业者在选型时&#xff0c;容易混淆普通卷帘与特级卷帘的区别&#xff0c;同时…...

凡亿AD最小系统板--元件模型组成介绍

一、课程整体概述原理图库创建是PCB设计流程的第二步核心工作&#xff0c;也是电子设计建模的源头工序。所有电路板上的电子元器件&#xff0c;都需要先在原理图库中绘制对应的电气模型&#xff0c;才能完成后续原理图绘制、封装匹配、PCB布局布线等操作。本系列课程将通过多类…...

2026学数据分析对产品岗位的价值分析

一、数据分析在产品岗位中的核心价值数据分析能力帮助产品经理更精准地理解用户需求&#xff0c;优化产品决策。通过数据驱动的方法&#xff0c;减少主观臆断&#xff0c;提升产品迭代效率。数据可视化工具&#xff08;如Tableau、Power BI&#xff09;和统计分析能力&#xff…...

如何快速完成北航毕业论文:LaTeX模板终极指南

如何快速完成北航毕业论文&#xff1a;LaTeX模板终极指南 【免费下载链接】BUAAthesis 北航毕设论文LaTeX模板 项目地址: https://gitcode.com/gh_mirrors/bu/BUAAthesis 还在为毕业论文格式调整而烦恼吗&#xff1f;每年都有无数北航学子在毕业季被繁琐的格式要求折磨得…...

华硕笔记本性能优化终极指南:G-Helper轻量控制工具全面解析

华硕笔记本性能优化终极指南&#xff1a;G-Helper轻量控制工具全面解析 【免费下载链接】g-helper Lightweight Armoury Crate alternative for Asus laptops with nearly the same functionality. Works with ROG Zephyrus, Flow, TUF, Strix, Scar, ProArt, Vivobook, Zenboo…...

Makefile中FORCE伪目标的原理与应用:实现强制构建与版本信息生成

1. 项目概述与FORCE的引入在嵌入式开发&#xff0c;尤其是像RT-Thread这类复杂操作系统的构建过程中&#xff0c;Makefile是绕不开的核心工具。它不仅仅是编译指令的集合&#xff0c;更是整个项目构建逻辑的蓝图。很多工程师&#xff0c;特别是从IDE环境转过来的朋友&#xff0…...

智改数转:制造企业绕不开的必答题

近几年&#xff0c;"智改数转"这个词频繁出现在各地政策文件和行业论坛里。对很多制造企业来说&#xff0c;它已经从"可选项"变成了"必答题"。但真正落地的时候&#xff0c;问题远比口号复杂。先说句实话&#xff1a;多数企业的数字化还停留在表…...

FlashAttention 反向传播:删掉 O(N²) 的中间结果,怎么还能算对梯度?

FlashAttention 反向传播&#xff1a;删掉 O(N) 的中间结果&#xff0c;怎么还能算对梯度&#xff1f; 之前有人跟我争&#xff1a;FlashAttention 反向传播不存注意力矩阵&#xff0c;那梯度从哪来&#xff1f;你前向传播的时候 Softmax 的分母、分子都扔了&#xff0c;反向传…...