如何通过JDBC获取数据库连接 , 实现对单表数据增、删、改 ,实现对单表数据查询以及根据别名查询处理结果集扩展

1、获取连接

能够通过JDBC获取数据库连接

讲解

API介绍

java.sql.DriverManager类中有如下方法获取数据库连接

static Connection getConnection(String url, String user, String password) 
连接到给定数据库 URL ,并返回连接。 
参数说明
  1. String url:连接数据库的URL,用于说明连接数据库的位置
  2. String user:数据库的账号
  3. String password:数据库的密码

连接数据库的URL地址格式:协议名:子协议://服务器名或IP地址:端口号/数据库名?参数=参数值
在这里插入图片描述

MySQL写法:jdbc:mysql://localhost:3306/day04_db
如果是本地服务器,端口号是默认的3306,则可以简写:jdbc:mysql:///day04_db

在这里插入图片描述

注意事项

如果数据出现乱码需要加上参数: ?useUnicode=true&characterEncoding=utf8,表示让数据库以UTF8编码来处理数据。
如: jdbc:mysql://localhost:3306/day04_db?useUnicode=true&characterEncoding=utf8

使用步骤

1.DriverManager.getConnection(url, user, password); 传入对应参数即可

案例代码
public class Demo01 {public static void main(String[] args) throws Exception {Class.forName("com.mysql.jdbc.Driver");/*1)使用DriverManager类中的静态方法获取和数据库的连接:static Connection getConnection(String url, String user, String password)参数:url:表示建立和数据库服务器连接的地址,书写格式几乎是固定的。jdbc:mysql://连接mysql服务器的ip地址:mysql服务器的端口号/连接的数据库名补充:如果连接的数据库软件在本地,那么url可以简写为:jdbc:mysql:///连接的数据库名user:连接mysql服务器的用户名,这里暂时书写rootpassword:接mysql服务器的密码返回值:Connection,属于java.sql 包下的一个接口,表示连接接口,和数据库的连接。*/// 连接到MySQL// url: 连接数据库的URL// user: 数据库的账号// password: 数据库的密码Connection conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/day04_db", "root", "1234");System.out.println(conn);}
}
案例效果

1.连接成功
在这里插入图片描述

2.连接失败
在这里插入图片描述

小结

  1. JDBC获取数据库连接使用哪个API?

    DriverManager.getConnection(数据库url, 账号, 密码)
    
  2. 通过JDBC连接mysql的URL写法?

    jdbc:mysql://服务器ip地址:3306/数据库
    

3.如果连接mysql服务器在本地,那么url可以简写:

jdbc:mysql:///数据库

2、JDBC实现对单表数据增、删、改

目标

通过JDBC实现对单表数据增、删、改、查

讲解

JDBC实现对单表数据增、删、改

我们要对数据库进行增、删、改、查,需要使用Statement对象来执行SQL语句。

API介绍

获取Statement对象

java.sql.Connection接口中有如下方法获取到Statement对象

Statement createStatement() 
创建一个 Statement 对象来将 SQL 语句发送到数据库

Statement的API介绍

  1. int executeUpdate(String sql)
    根据执行的DMLINSERTUPDATEDELETE)语句,返回受影响的行数
    
  2. ResultSet executeQuery(String sql)
    根据查询语句返回结果集,只能执行SELECT语句
    

    注意:在MySQL中,只要不是查询就是修改。
    executeUpdate:用于执行增删改
    executeQuery:用于执行查询

使用步骤
  1. 注册驱动
  2. 获取连接
  3. 获取Statement对象
  4. 使用Statement对象执行SQL语句
  5. 释放资源
案例代码
public class Demo03 {public static void main(String[] args) throws Exception {Class.forName("com.mysql.jdbc.Driver");Connection conn = DriverManager.getConnection("jdbc:mysql:///day04_db", "root", "1234");System.out.println(conn);/*1)获取发送sql语句对象使用Connection连接接口对象调用Connection接口的方法:Statement createStatement() 创建一个 Statement 对象来将 SQL 语句发送到数据库。PreparedStatement prepareStatement(String sql) 创建一个 PreparedStatement 对象来将参数化的 SQL 语句发送到数据库。2)Statement和PreparedStatement都可以用来向数据库发送sql语句,Statement是PreparedStatement的父接口。3)PreparedStatement 是安全的,Statement不安全的。并且Statement效率低,PreparedStatement效率高4)Connection还可以手动控制mysql事务:开启事务  void setAutoCommit(boolean autoCommit) 将此连接的自动提交模式设置为给定状态。autoCommit - 为 true 表示启用自动提交模式;为 false 表示禁用自动提交模式1. conn.setAutoCommit(false);一切正常提交事务  void commit()2. conn.commit()出现异常,回滚事务  void rollback()3. conn.rollback()*/// 从连接中拿到一个Statement对象Statement stmt = conn.createStatement();/*Statement向数据库发送sql语句,使用Statement中的不同的方法可以向数据库发送不同的sql语句:1)DQL查询语句:  ResultSet executeQuery(String sql) 执行给定的 SQL 语句,该语句返回单个 ResultSet 对象。参数:sql - 要发送给数据库的 SQL 语句,通常为静态 SQL SELECT 语句返回值:ResultSet用来存放查询的结果,表示结果集2)DML增删改和DDL语句(创建表和数据库)使用的方法:int executeUpdate(String sql)执行给定 SQL 语句,该语句可能为 INSERT、UPDATE 或 DELETE 语句(DML),或者不返回任何内容的 SQL 语句(如 SQL DDL 语句)。返回值:1) 对于 SQL 数据操作语言 (DML) 语句,返回行记录数,影响的行数2) 对于什么都不返回的 SQL 语句,返回 0 ,执行DDL返回的是0 了解*/// 1.插入记录String sql = "insert into user values(null, 'zhaoliu', 'abc')";int i = stmt.executeUpdate(sql);System.out.println("影响的行数:" + i);// 2.修改记录sql = "update user set username='tianqi' where username='zhaoliu'";i = stmt.executeUpdate(sql);System.out.println("影响的行数:" + i);// 3.删除记录sql = "delete from user where id=4";i = stmt.executeUpdate(sql);System.out.println("影响的行数:" + i);// 释放资源stmt.close();conn.close();}
}

3、JDBC实现对单表数据查询

目标

能够掌握JDBC实现对单表数据查询

讲解

ResultSet用于保存执行查询SQL语句的结果。
我们不能一次性取出所有的数据,需要一行一行的取出。

ResultSet的原理
  1. ResultSet内部有一个指针,刚开始记录开始位置
  2. 调用next方法, ResultSet内部指针会移动到下一行数据
  3. 我们可以通过ResultSet得到一行数据 getXxx得到某列数据
    在这里插入图片描述
ResultSet获取数据的API

其实ResultSet获取数据的API是有规律的get后面加数据类型。我们统称getXXX()
在这里插入图片描述

​ 例如:

在这里插入图片描述

对于上图中的一行数据,我要获取username为zhangsan这列的值,有如下2种写法:

  1. rs.getString(“username”); 通过列名获取该列的值。

  2. rs.getString(2); 通过username列所在的第二个位置获取该列的值。

使用JDBC查询数据库中的数据的步骤
  1. 注册驱动
  2. 获取连接
  3. 获取到Statement
  4. 使用Statement执行SQL
  5. ResultSet处理结果
  6. 关闭资源
案例代码
public class Demo04 {public static void main(String[] args) throws Exception {Class.forName("com.mysql.jdbc.Driver");Connection conn = DriverManager.getConnection("jdbc:mysql:///day04_db", "root", "1234");Statement stmt = conn.createStatement();String sql = "select * from user";ResultSet rs = stmt.executeQuery(sql);// 内部有一个指针,只能取指针指向的那条记录while(rs.next()){// 指针移动一行,有数据才返回trueint id = rs.getInt("id");String name = rs.getString(2);String pwd= rs.getString(3);System.out.println(id+"+++"+name+"++++"+pwd);}// 关闭资源rs.close();stmt.close();conn.close();}
}

小结

其实我们使用JDBC操作数据库的步骤都是固定的。不同的地方是在编写SQL语句

  1. 注册驱动
  2. 获取连接
  3. 获取到Statement
  4. 使用Statement执行SQL
  5. ResultSet处理结果
  6. 关闭资源

ResultSet如何获取数据?

  1. 调用next方法, ResultSet内部指针会移动到下一行数据
  2. 我们可以通过ResultSet得到一行数据 getXxx得到某列数据

在这里插入图片描述

4. 根据别名查询处理结果集扩展

package com.itheima.sh.a_jdbc_01;import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.Statement;public class JDBC03Test {public static void main(String[] args) throws Exception {/*需求:查询数据表user2所有数据输出到控制台*///2.获取连接String url = "jdbc:mysql://localhost:3306/day03_heima138";//连接mysql服务器地址String username = "root";//连接mysql服务器用户名String password = "1234";//连接mysql服务器密码,这里输入你的密码Connection conn = DriverManager.getConnection(url, username, password);//3.定义sqlString sql = "select id,username,password pwd from user2";//4.获取发送sql语句对象Statement st = conn.createStatement();//5.发送sql语句/*1.ResultSet 表示结果集,用来存放查询的结果,因为查询有可能是多行数据,所以使用集合存储*/ResultSet rs = st.executeQuery(sql);//6.处理结果while(rs.next()){//获取数据int id = rs.getInt("id");String userName = rs.getString("username");/*对应处理结果集ResultSet中的getXxx(xxx 变量名):1)根据第几列来获取字段值:例如password属于第三列,那么这里获取password值是:rs.getString(3);2)根据字段名或者别名来获取字段值:如果sql语句某个字段有别名,那么只能书写别名,不能书写字段sql语句:select id,username,password pwd from user2获取密码值:rs.getString("pwd");*/String pwd = rs.getString("pwd");//输出System.out.println(id+"---"+userName+"---"+pwd);}//7.释放资源rs.close();st.close();conn.close();}
}

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

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

相关文章

赶紧收藏!2024 年最常见的操作系统面试题(二)

上一篇地址:赶紧收藏!2024 年最常见的操作系统面试题(一)-CSDN博客 三、请解释操作系统中的分页和分段机制。 操作系统中的分页和分段是两种不同的内存管理机制,它们用于将程序的地址空间映射到物理内存。下面将详细…

使用深度相机D435i+YOLOv8实现物体三维坐标实时显示

一、获取相机内参 下列指令为获取相机内参指令,输入此指令前需要获得相机的深度帧和彩色帧数据。 如何使用vsCode打开intel D435i深度相机 # 获取相机内参 depth_intrinsics depth_frame.profile.as_video_stream_profile().intrinsics color_intrinsics color…

常用框架-Dubbo

常用框架-Dubbo 1、Dubbo是什么?2、说说一次Dubbo服务请求流程?3、说说Dubbo 工作原理?4、Dubbo支持哪些通信协议?5、注册中心挂了,consumer还能不能调用provider?6、Dubbo怎么实现动态感知服务下线的呢?7、说说Dubbo负载均衡策略?8、说说Dubbo容错策略?9、说说Dubbo动…

Tomcat多实例配置

目录 一. 复制程序文件 二. 启动tomcat多实例 三. Tomcat多实例负载均衡 多实例(多进程):同一个程序启动多次,分为两种情况: 第一种:一台机器跑多个站点; 第二种:一个机器跑一个站点多个实…

代码随想录训练营第十六天 513找树左下角的值 112路径总和I 113路径总和II 106从中序和后序遍历序列构造二叉树

第一题: 原题链接:513. 找树左下角的值 - 力扣(LeetCode) 思路:用回溯的思想: 这题就是求最大深度,当遍历到第一个最大深度的时候,记录下的节点值就是最左边的元素。 参数和返回…

BFS与DFS

BFS与DFS BFS和DFS 是最简单实现的搜索算法&#xff0c;其他的搜索算法其实都是在他们的基础上发展优化而来的。 力扣模板题 这里要优化一下才可以过这道题 1. BFS BFS 通过 队列来实现 每次都会先遍历当前节点的邻接节点 //这里是用邻接表来表示图 bool bfs(vector<ve…

react学习——13react高阶函数_函数柯里化

1、高阶函数柯里化实现 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><!-- 移动端适配--><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title&g…

提取图像主色调

依赖 Pillow 库。 提取图像主色调&#xff0c;直接上代码&#xff1a; from PIL import Imagedef extract_main_color(img_path: str, delta_h: float 0.3) -> str:"""获取图像主色调Args:img_path: 输入图像的路径delta_h: 像素色相和平均色相做减法的绝…

MIL图像处理那些事:定义感兴趣区域ROI的两种方法(示例项目C#源码)

文章目录 效果展示第一种方法:通过鼠标框选GetROIForm构造函数如何缩放--MdispZoom的使用Ctr+滚轮缩放放大两倍:如何平移--MdispPan的使用双击返回ROI第二种方法:直接编辑ROI框显示ROI示例项目C#源码(百度网盘)本示例提供两种方法定义感兴趣区域ROI 效果展示 第一种方法:通过鼠…

测试基础15:测试用例设计方法-场景设计(流程分析)

课程大纲 1、定义 系统多个功能串联形成业务流程&#xff0c;不仅需要验证正确的主流程&#xff0c;而且需要验证各个功能点各种异常情况。 2、应用场景 与因果图&判定表方法的相似之处&#xff1a;界面需手动填写的输入框少&#xff0c;基本只需选择有限的几个&#xff08…

AppInventor2程序设计里代码块较多,有点卡,有没有办法解决?

问&#xff1a;请问下程序设计里面写的程序比较多&#xff0c;有点卡&#xff0c;这个有没有办法呢&#xff1f; 答&#xff1a;AppInventor2目前不支持代码块的模块化&#xff0c;不过也有一些技巧可以减少代码块的数量&#xff0c;还能提高代码的质量&#xff1a; 1. 提取过程…

小抄 20240620

1 段永平和他的徒弟们经常提的三个词&#xff1a;平常心&#xff0c;本分&#xff0c;常识。 都是很普通的道理&#xff0c;但普通人基本不用。常识&#xff0c;平常人不认识。 2 觉得一件事很大的时候&#xff0c;可以让自己变得更大&#xff0c;来稀释事情的大小。 一个…

Ubuntu系统 常用工具

Ubuntu系统 常用工具 1 输入法 googlepinyin 参考&#xff1a; https://blog.csdn.net/qq_36393978/article/details/118483011 卸载fcitx残留 sudo apt-get remove fcitx sudo apt-get remove fcitx-module* sudo apt-get remove fcitx-frontend* sudo apt-get purge fcit…

Jenkins定时构建自动化(四):Python 的 argparse 模块

目录 一、主要功能和用途 二、核心类和方法 三、总结 四、argparse模块示例 Jenkins定时构建自动化(一)&#xff1a;Jenkins下载安装配置-CSDN博客 Jenkins定时构建自动化(二)&#xff1a;Jenkins的定时构建-CSDN博客 Jenkins定时构建自动化(三)&#xff1a;手动定时构建…

[FreeRTOS 基础知识] 信号量 概念

文章目录 信号量定义信号量特性 信号量定义 信号量是一个抽象的数据类型&#xff0c;通常包含一个整数值以及一个等待该值变为正数的任务列表&#xff08;也称为等待队列&#xff09;。信号量的整数值代表了系统中某种资源的可用数量。 在操作系统中信号量用于控制对共享资源访…

提升办公效率的利器—OnlyOffice文档8.1深度体验

目录 1. 前言 2. 安装 3. 基本使用 3.1 文档编辑 3.2 表格处理 3.3 演示文稿 4. 个人评价 5. 总结 1. 前言 在当今信息化时代&#xff0c;办公软件已经成为我们日常工作中不可或缺的工具。无论是撰写文档、处理数据&#xff0c;还是制作演示文稿&#xff0c;办公软件的…

MySQL MVCC详解

目录 前言 MVCC实现原理 UndoLog版本链 ReadView MVCC是否可以解决不可重复读与幻读 隔离级别 READ UNCOMMITTED - 读未提交与脏读 READ COMMITTED - 读已提交与不可重复读 REPEATABLE READ - 可重复读与幻读 SERIALIZABLE - 串行化 小结 前言 为了提高数据库并发能力…

GNSS接收机的工作原理

GNSS接收机的工作原理如下&#xff1a; 信号接收&#xff1a;GNSS接收机通过天线接收来自卫星导航系统的信号&#xff0c;这些信号包含卫星的位置、时间和健康状态等信息。 信号处理&#xff1a;接收的信号首先经过前置放大器放大&#xff0c;然后经过滤波器滤除噪声。接收机会…

邂逅Three.js探秘图形世界之美

可能了解过three.js等大型的3D 图形库同学都知道啊&#xff0c;学习3D技术都需要有图形学、线性代数、webgl等基础知识&#xff0c;以前读书学的线性代数足够扎实的话听这节课也会更容易理解&#xff0c;这是shader课程&#xff0c;希望能帮助你理解着色器&#xff0c;也面向第…

图象去噪1-使用中值滤波与均值滤波

1、中值滤波 使用中值滤波去除图像的异常像素点&#xff0c;使用cv2.cv2.medianBlur(img, 3)表示再图像在中值滤波窗口3*3的范围内&#xff0c;从下到大排序&#xff0c;将当前值替换为排序中值&#xff08;如下图所示&#xff09;将56替换为&#xff08;56&#xff0c;66,90,…