JDBC编程详细总结

一、JDBC编程

JDBC编程有标准步骤(八股文)

  • 注册驱动

    • 将sql语句的运行环境加载到JVM

  • 连接数据库

  • 获得执行SQL的对象

  • 执行SQL语句,获得结果

  • 关流

1、 注册驱动

Class.forName("com.mysql.jdbc.Driver");//5.7版本 加载驱动
Class.forName("com.mysql.cj.jdbc.Driver");//5.8版本 加载驱动

2、 连接数据库

  • 通过 DriverManager.getConnection(url,user,password) 获取数据库连接对象

    • URL:jdbc:mysql://localhost:3306/database

      • ?useUnicode=true&characterEncoding=utf8 // 解决数据编码格式乱码

      • &useSSL=false // 解决执行时控制台红色警告

      • &serverTimezone=UTC // mysql8版本需要加时区

    • username:root

    • password:123456

Connection conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/数据库名字?useUnicode=true&characterEncoding=utf8&useSSL=false&serverTimezone=UTC   ", "数据库用户名","数据库密码");
  • URL(Uniform Resource Locator) 统一资源定位符:由协议、IP、端口、SID(程序实例名称)组成

3、 获取发送 SQL 的对象

通过 Connection 对象获得 Statement 对象,用于对数据库进行通用访问。

Statement statement = conn.createStatement();

4、 执行SQL 语句

执行 SQL 语句并接收执行结果。

String sql ="INSERT INTO t_jobs(JOB_ID,JOB_TITLE,MIN_SALARY,MAX_SALARY) VALUES('JAVA_Le','JAVA_Lecturer',4000,10000);";
​
int result = statement.executeUpdate(sql);//执行SQL语句并接收结果
  • 注意:在编写 DML 语句时,一定要注意字符串参数的符号是单引号 '值'

  • DML 语句:增删改时使用executeUpdate(),返回受影响行数(int 类型)。

  • DQL 语句:查询时使用executeQuery(),返回结果数据(ResultSet 结果集)。

5、 处理结果

接受处理操作结果。

if(result > 0 ){System.out.println("Success");
}
  • 受影响行数:逻辑判断、方法返回。

  • 查询结果集:迭代、依次获取。

6、 释放资源

遵循先开后关原则,释放所使用到的资源对象。

statement.close();
conn.close();

7、 案例

准备数据库表,进行CRUD.

create table tb_user(id int(11) primary key auto_increment comment '用户编号',username varchar(10) comment '用户名',password varchar(10) comment '密码',phone varchar(11) comment '手机号',create_time date comment '注册时间',money double(10,2) comment '账户余额',sex int(1) comment '性别 1男2女'
);

需求: 使用JDBC完成对tb_user表插入数据

public class Demo2 {
​public static void main(String[] args) throws ClassNotFoundException, SQLException {// 1 加载驱动Class.forName("com.mysql.jdbc.Driver");
​// 2 获得连接// 通过驱动管理器获得连接String url = "jdbc:mysql://localhost:3306/java2401?useUnicode=true&characterEncoding=utf8&useSSL=false";// 协议://ip:端口/数据库?参数=值&参数=值// http://www.baidu.com:80/s?ie=UTF-8&wd=javaString username = "root";String password = "123456";Connection connection = DriverManager.getConnection(url, username, password);
​// 3 获得执行语句对象// 通过连接对象创建语句对象Statement statement = connection.createStatement( );
​// 4 执行sql获得结果// 通过语句对象执行sql,获得结果// 增删改都是更新,它们执行的结果都是受影响的行数int i = statement.executeUpdate("insert into tb_user values (3,'ww','123','120','2001-01-01',2000.0,2)");if (i > 0) {System.out.println("插入成功!" );}
​// 5 关闭连接statement.close();connection.close();}
​
}

二、完成增删改

1、 插入

参考入门案例

2、 更新

任何的JDBC都是那5个步骤.

public class Demo2_update {
​public static void main(String[] args) throws Exception {
​// 1 加载驱动Class.forName("com.mysql.jdbc.Driver");
​// 2 通过驱动管理对象获得连接对象String url = "jdbc:mysql://localhost:3306/java2311?useSSL=false";String username = "root";String password = "123456";Connection conn = DriverManager.getConnection(url, username, password);
​// 3 通过连接对象创建执行语句对象Statement statement = conn.createStatement( );
​// 4 通过执行语句对象执行sql,获得结果String sql = "update tb_user set username = '小孟', phone = '666666' where id = 3";int num = statement.executeUpdate(sql);
​if (num > 0) {System.out.println("更新成功!" );}// 5 将对象的流关闭statement.close();conn.close();}
}

3、 删除

public class Demo3_delete {
​public static void main(String[] args) {Statement statement = null;Connection conn = null;try {// 1 加载驱动Class.forName("com.mysql.jdbc.Driver");
​// 2 获得连接String url = "jdbc:mysql://localhost:3306/java2311?useSSL=false";String username = "root";String password = "123456";conn = DriverManager.getConnection(url, username, password);
​// 3 获得语句对象statement = conn.createStatement( );
​// 4 执行sqlint num = statement.executeUpdate("delete from tb_user where id = 3");
​if (num > 0) {System.out.println("删除成功" );}}catch (Exception e) {// 如果有异常,要打印出来,因为要根据异常解决问题e.printStackTrace();} finally {try {// 5 关闭连接statement.close( );conn.close( );}catch (SQLException e) {e.printStackTrace();}}}
}

三、查询结果集ResultSet【重要】

查询返回的是一种虚拟表,Java的JDBC中是使用结果集(ResultSet)来封装这个虚拟表,结果集就是一个集合,内部就存储了列名和每行数据,那么学习查询的重点是

  • 从结果集取值

public class Demo4_select {public static void main(String[] args) throws Exception{
​Class.forName("com.mysql.jdbc.Driver");Connection conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/java2311?useSSL=false", "root", "123456");Statement statement = conn.createStatement( );/*** 执行查询方法 executeQuery()* 返回值是 ResultSet 结果集,其中就包含查询返回的所有数据(一张虚拟表)* ResultSet结果集中包含列和行数据,其中有个光标指向表头* next() 方法会向下移动一行,返回boolean,为true即有下一行数据,false该行没数据* 当指向该行后,有方法可以获取该行列值* getXxx()   ps:xxx是各种数据类型* getXxx(String columnLabel) 通过列名取值,如果有别名要使用别名*/String sql = "select birthday,money,username,password,id,sex,age from tb_user";ResultSet rs = statement.executeQuery(sql);while (rs.next()){int id = rs.getInt("id");String username = rs.getString("username");String password = rs.getString("password");String sex = rs.getString("sex");int age = rs.getInt("age");Date birthday = rs.getDate("birthday");double money = rs.getDouble("money");System.out.println(id+"-"+username+"-"+password+"-"+sex+"-"+age+"-"+birthday+"-"+money);}rs.close();statement.close();conn.close();}
}

image-20221121164359945

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

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

Android TV RecyclerView列表获得焦点左右换行

在TV上&#xff0c;用RecyclerView显示一个列表&#xff0c;飞鼠遥控左右遥控获得Item焦点&#xff0c;到最后一个进行右键换行&#xff0c;是不能做到的&#xff0c;因此需要监听key事件处理换行。 效果图如下 代码实现 Item.xml布局 <?xml version"1.0" enc…

红帽 Quay- 配置镜像代理缓存

《OpenShift / RHEL / DevSecOps 汇总目录》 说明&#xff1a;本文已经在 Quay 3.12 环境中验证 说明&#xff1a;可先根据《红帽 Quay - 安装篇》完成 Quay 安装。 镜像代理缓存功能 Quay 的镜像代理缓存功能可以将用户拉取的远程镜像保存到本地 Quay 的 proxy cache 中&am…

C++速通LeetCode中等第2题-最长连续序列

方法一&#xff0c;排序后遍历&#xff0c;后减前1&#xff0c;计数&#xff0c; 相等跳过&#xff0c;后减前&#xff01;1就保存。 class Solution { public:int longestConsecutive(vector<int>& nums) {vector<int> ans;int count 1;sort(nums.begin(),n…

Facebook的用户隐私保护:从争议到革新

Facebook早期的数据收集方式引发了隐私担忧。平台的快速增长和用户数据的大规模收集使得隐私问题逐渐显现。尤其是在2018年&#xff0c;剑桥分析事件暴露了数千万用户数据被不当使用的问题。这一事件揭示了Facebook在数据保护方面的严重漏洞&#xff0c;引发了公众对隐私保护的…

C++中的const \static \this

目录 前言 一、const关键字 1、const修饰类的成员变量 2、const修饰类的成员函数 3、const修饰类的对象 二、static关键字 1、static修饰类中的成员变量 1. 共享性 2. 初始化 3. 访问权限 4. 内存分配 5. 不依赖于对象 2、static修饰类中的成员函数 三、this关键字…

「C++系列」异常处理

【人工智能教程】&#xff0c;前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。 点击跳转到网站&#xff1a;【人工智能教程】 文章目录 一、异常处理1. 基本概念2. 示例代码3. 注意事项 二、常见的异常类…

三维天地创新方案助力实验室信息自动化技术深入发展

实验室环境条件控制非常重要,它直接影响着最终的实验或检测结果。例如不同的实验室对于温湿度有不同的要求,这就给实验室温湿度监测与采集带来了一定的困难。 三维天地自主研发的实验室信息管理系统(SW-LIMS)提出了一种检化验记录温湿度自动采集的创新方案,这一方案致力于实现…

一键文本提示实现图像对象高质量剪切与透明背景生成

按照提示词裁剪 按照边框裁剪 要实现您描述的功能,即通过一个文本提示就能自动从图片中切割出指定的对象并生成一个带有透明背景的新图像,这需要一个结合了先进的计算机视觉技术和自然语言处理能力的系统。这样的系统可以理解输入的文本指令,并将其转化为对图像内容的精确分…

解决nginx代理SSE接口的响应没有流式返回

目录 现象原来的nginx配置解决 现象 前后端分离的项目&#xff0c;前端访问被nginx反向代理的后端SSE接口&#xff0c;预期是流式返回&#xff0c;但经常是很久不响应&#xff0c;一响应全部结果一下子都返回了。查看后端项目的日志&#xff0c;响应其实是流式产生的。推测是n…

大数据新视界 --大数据大厂之探索ES:大数据时代的高效搜索引擎实战攻略

&#x1f496;&#x1f496;&#x1f496;亲爱的朋友们&#xff0c;热烈欢迎你们来到 青云交的博客&#xff01;能与你们在此邂逅&#xff0c;我满心欢喜&#xff0c;深感无比荣幸。在这个瞬息万变的时代&#xff0c;我们每个人都在苦苦追寻一处能让心灵安然栖息的港湾。而 我的…

Markdown书写技巧深度解析

引言 在数字化时代&#xff0c;文本编辑与格式化的效率与美观性显得尤为重要。Markdown&#xff0c;作为一种轻量级的标记语言&#xff0c;以其简洁的语法和高效的文档转换能力&#xff0c;在多个领域得到广泛应用。本文将全面探讨Markdown的由来、定义、原理、内部流程、应用场…

构建自己的文生图工具:Python + Stable Diffusion + CUDA

构建自己的文生图工具&#xff1a;Python Stable Diffusion CUDA 前言概述环境搭建安装PyTorch安装Stable Diffusion编写Python代码结论结语 前言 在这个数字化和人工智能飞速发展的时代&#xff0c;图像生成技术正逐渐成为现实。想象一下&#xff0c;只需输入几个关键词&…

el-form动态标题和输入值,并且最后一个输入框不校验

需求&#xff1a;给了固定的label&#xff0c;叫xx单位&#xff0c;要输入单位的信息&#xff0c;但是属性名称都一样的&#xff0c;UI画图也是表单的形式&#xff0c;所以改为动态添加的形式&#xff0c;实现方式也很简单&#xff0c;循环就完事了&#xff0c;连着表单校验也动…

探索Facebook的黑暗面:数字化社交的双面剑

Facebook作为全球最大的社交平台&#xff0c;改变了我们的沟通和互动方式。虽然它带来了便利&#xff0c;但也存在不少隐忧。本文将探讨Facebook的负面影响&#xff0c;包括隐私问题、信息操控、心理健康危机及社交表面化等。 一、隐私问题&#xff1a;数据收集的隐忧 Facebo…

2024蓝桥杯省B好题分析

题解来自洛谷&#xff0c;作为学习 目录 宝石组合 数字接龙 爬山 拔河 宝石组合 # [蓝桥杯 2024 省 B] 宝石组合## 题目描述在一个神秘的森林里&#xff0c;住着一个小精灵名叫小蓝。有一天&#xff0c;他偶然发现了一个隐藏在树洞里的宝藏&#xff0c;里面装满了闪烁着美…

乐vs悲观锁,重vs轻量级锁,公vs非公平锁,不vs可重入锁,等等锁策略

这里讲的“乐观锁”“悲观锁”“轻量级锁”等等&#xff0c;都不是一个锁&#xff0c;而是一类锁。 比如&#xff1a;我们班有“带眼镜”的同学&#xff0c;这里“带眼镜”并不是指一个人&#xff0c;而是指一类人。 并且这里的锁&#xff0c;并不局限于Java&#xff0c;而是只…

优化数据的抓取规则:减少无效请求

在爬取房价信息的过程中&#xff0c;如何有效过滤无效链接、减少冗余请求&#xff0c;是提升数据抓取效率的关键。本文将介绍如何优化爬虫抓取贝壳等二手房平台中的房价、小区信息&#xff0c;并通过代理IP、多线程、User-Agent和Cookies的设置&#xff0c;确保数据抓取的稳定性…

(娱乐)魔改浏览器-任务栏图标右上角加提示徽章

一、目标&#xff1a; windows中&#xff0c;打开chromium&#xff0c;任务栏中会出现一个chromium的图标。我们的目标是给这个图标的右上角&#xff0c;加上"有1条新消息"的小提示图标&#xff0c;也叫徽章(badge)注意&#xff1a;本章节纯属娱乐&#xff0c;有需要…

手脱简单upx

大一下的事情&#xff0c;补个档 手动脱壳の新年快乐 查壳&#xff0c;有壳&#xff0c;UPX X32dbg打开文件&#xff0c;查看初始断点 点击PUSHAD跟进&#xff0c;CTRL*设置EIP&#xff0c;开始F8步过&#xff0c;寻找ESP寄存器第一次单个变红的地址 此时的内存窗口 开始步过…

esp32核心跑分程序

https://github.com/ochrin/coremark/tree/esp32 最近一直捣腾esp32s3 (Sense) 做微型摄像。过程中发现一款不错的跑分软件&#xff0c;特此记一笔。 其中针对esp32s3各类参数设定&#xff08;用idf.py menuconfig)&#xff0c;做个记录。 CPU Frequency去240MHz&#xff08…