JDBC学习笔记

news2024/12/23 17:28:13

目录

一、JDBC

1:为什么要学习JDBC技术

2、JDBC技术概述与理解

3、JDBC使用步骤分析

3.1、注册驱动

3.2 、获取连接

3.3、创建发送sql语句对象

3.4、发送sql语句

3.5、结果集解析

3.6、资源关闭


一、JDBC

1:为什么要学习JDBC技术

1、Java和数据库的必要纽带。

2、数据库层框架底层原理,原生态的jdbc技术对数据库操作会显得有些笨拙,所以我们会选择第三方数据库框架进行数据库操作,例mybatis、hibernate、springdatajpa,这些都是应用层的框架,底层原理都是对jdbc操作的封装。

2、JDBC技术概述与理解

总结: Jdbc是java连接数据库技术的统称 jdbc是由两部分组成:

一、是Java提供的规范(接口) ​ 二、是各个数据库厂商的实现驱动jar包! Jdbc技术是一种典型的面向接口编程!

3、JDBC使用步骤分析

1、注册驱动

2、获取连接

3、创建发送sql语句对象

4、发送sql语句,并获取返回结果

5、结果集解析

6、资源关闭

3.1、注册驱动

方式一:

DriverManager.registerDriver(new Driver());

方式二:

new Driver();

方式三:

Class.forName("com.mysql.cj.jdbc.Driver");

方式一相比于方式二和三,不好的地方在于注册了两次驱动,方式二三都只有一次驱动。

但是常用的是第三种方式,第二种方式过于固定化,相当于把代码写死了,更换数据库类型的时候还需要改代码。

第三种可以把字符串提取到外部的配置文件,后期只需要进行修改外部的配置文件即可。

3.2 、获取连接

Connection connection = DriverManager.getConnection("jdbc:mysql://127.0.0.1:3306/jdbc", "XXX", "XXX");

其中包含三个参数:

第一个(url):格式为 jdbc:数据库类型://主机ip地址:数据库端口/数据库名

第二个(账号):连接的数据库账号

第三个(密码):该库的密码

其中第一个参数中若是ip地址和端口为127.0.0.1:3306默认值,则可以省略不写。格式入下:

Connection connection = DriverManager.getConnection("jdbc:mysql:///jdbc", "XXX", "XXX");

还有就是参数省略之后的格式(如下)。

(String url, String user, String password);

(String url, Properties info(user,password));

(String url?user=账号&password=密码);

3.3、创建发送sql语句对象

  • 静态 statement

  • 预编译 preparedstatement

Statement statement = connection.createStatement();// 创建statement

statement可以发送mysql语句并且返回结果。但是存在一些问题,所以只能处理没有动态值的语句。

  • statement用法。

    • 1.创建statement

    • 2.拼接sql语句

    • 3.发送sql语句,返回执行结果。

  • statement缺点

    • 1.sql语句需要字符串拼接比较麻烦。

    • 2.只能拼接字符串类型,其它的数据库类型无法处理。

    • 3.可能发生注入攻击(动态值充当语句结构)。

  • preparedstatement用法 :

    • 1、编写sql语句结果,不包含动态值部分的语句,动态值的部分用’?‘代替。

    • 2、创建preparedstatement,并且传入动态值。

    • 3、动态值 占位符 赋值 ?单独赋值即可

    • 4、发送sql语句

String sql = "select * from t_user where account = ? and password = ?;"; PreparedStatement preparedStatement = connection.prepareStatement(sql); preparedStatement.setObject(1, account); preparedStatement.setObject(2, password);

其中第一行是编写sql语句结果,然后第二行是创建一个预编译的statement并且设置sql语句结果,第三四行是讲对应的动态值传入,第一个参数是对应的下标,第二个是要传入的动态值。

3.4、发送sql语句

String sql = "select * from t_user where account = '" + account + "' and password = '" + password + "';";

int i = statement.executeUpdate(sql);

ResultSet resultSet = statement.executeQuery(sql);

其中第一行就相当于是讲sql语句用字符串拼起来,然后同过statement发送到数据库。

ResultSet resultSet = preparedStatement.executeQuery();

preparedstatement跟statement用法一样只不过不需要再传参数了。

通过返回值的不同有两种不同的写法,executeQuery可以用来接收查询语句返回的结果,ResultSet是结果封装对象。

3.5、结果集解析

只有查询语句的返回结果需要解析,其它语句就比较简单了,就是一个值。

  • 单行 if(resultSet.next()) { }

  • 多行 while(resultSet.next()) { }

while(resultSet.next()) { int id = resultSet.getInt(10); String account1 = resultSet.getString(2); String password1 = resultSet.getString(3); String nickname = resultSet.getString(4); System.out.println(id + "--" + account1 + "--" + password1 + "--" + nickname); }

其中resultSet.next()每次的返回值就是是否读到数据,若是没有读到数据则返回的是0,反之为1。

查询语句的返回结果也是一个有行有列的数据,resultSet.next(),相当于是每次读入该对象容器中的一行数据,然后resultSet.getInt()、resultSet.getString()就是获取读到的数据。括号里面的参数可以直接按下标,就是从1开始,或者可以直接可以填字段名。

但是这种方法就比较麻烦,而且格式固定了,不能适用于其它格式的数据,所以在这里引用了一个其它方法。

ResultSetMetaData metaData = resultSet.getMetaData();

通过这个metaData可以获取列的数量,以及列名,这样就可以用一个循环来读取一整行的数据了。

int columnCount = metaData.getColumnCount(); // 获取列的数量

String columnLabel = metaData.getColumnLabel( i ); // 可以获取第 i 列的名字,有别名取别名,没别名取列名。

String columnLabel = metaData.getColumnName( i ); // 只能获取名字,不能获取别名。

// 下面 就是一个完整的读取resultSet容器的方法。

List<Map> list = new ArrayList<>(); ResultSetMetaData metaData = resultSet.getMetaData();

int columnCount = metaData.getColumnCount();

while(resultSet.next()) { Map map = new HashMap();

for(int i = 1; i <= columnCount; i ++) { Object value = resultSet.getObject(i); String a = metaData.getColumnLabel(i); map.put(a, value); } list.add(map); } System.out.println("list" + list);

3.6、资源关闭

resultSet.close(); // 若不是查询语句就用不上该容器,就不用关闭该资源。 statement.close(); connection.close();

就是将前用的资源都关闭。

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

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

相关文章

【雕爷学编程】Arduino动手做(117)---P10V706LED屏模组3

37款传感器与执行器的提法&#xff0c;在网络上广泛流传&#xff0c;其实Arduino能够兼容的传感器模块肯定是不止这37种的。鉴于本人手头积累了一些传感器和执行器模块&#xff0c;依照实践出真知&#xff08;一定要动手做&#xff09;的理念&#xff0c;以学习和交流为目的&am…

亚马逊买家号如何绑定信用卡

要在亚马逊上绑定信用卡作为买家号的支付方式&#xff0c;请按照以下步骤进行操作&#xff1a; 1、登录亚马逊账户&#xff1a;使用您的亚马逊账户用户名和密码登录到亚马逊网站。 2、导航至"我的账户"&#xff1a;在页面右上角&#xff0c;将鼠标悬停在"你好…

安装使用docker-compose

Docker-Compose项目是Docker官方的开源项目&#xff0c;负责实现对Docker容器集群的快速编排 Docker-Compose将所管理的容器分为三层&#xff0c;分别是工程&#xff08;project&#xff09;&#xff0c;服务&#xff08;service&#xff09;以及容器&#xff08;container&…

【单周期CPU】LoongArch | LA32R | 二选一控制器MUX | 数据通路

前言&#xff1a;本章内容主要是演示在vivado下利用Verilog语言进行单周期简易CPU的设计。一步一步自己实现模型机的设计。本章先介绍单周期简易CPU中数据通路的设计。 &#x1f4bb;环境&#xff1a;一台内存4GB以上&#xff0c;装有64位Windows操作系统和Vivado 2017.4以上版…

华为OD机试真题 Java 实现【矩阵中非1的元素个数】【2023 B卷 200分】,附详细解题思路

目录 一、题目描述二、输入描述三、输出描述四、解题思路五、Java算法源码六、效果展示1、输入2、输出3、说明先将[0,0]位置的值变为1。第一次同化&#xff1a;第二次同化&#xff1a; 大家好&#xff0c;我是哪吒。 一、题目描述 存在一个m*n的二维数组&#xff0c;其成员取…

小程序项目时间选择器用法

项目需求是要实现这种形式, 但是相信大家都试了各种插件,都不太合适,uView框架也不能满足自己的需要; 推荐使用:uview-ui-plus 基本上小程序遇到的单选多选 日期 省市区 都可以完美的实现,可以通过插件市场安装使用 但是要实现ui给的原型图 还需要做一下调整 弹性布局给两个选…

Linux查找关键字出现的位置

在Linux中&#xff0c;您可以使用以下命令来查找文件中关键字出现的位置&#xff1a; grep -rnw /path/to/search -e keyword其中&#xff1a; - -r 递归地搜索指定路径下的所有子目录。 - -n 显示匹配行的行号。 - -w 完整匹配单词&#xff0c;而不是部分匹配。 - /path/to/s…

pandas 重复数据处理详解

概要 重复值处理主要涉及两个部分&#xff0c;一个是找出重复值&#xff0c;第二个是删除重复值&#xff0c;也就是根据自己设定的条件进行删除操作。本次来介绍关于重复数据处理的几个常用方法。 定位重复值 对于重复值&#xff0c;我们首先需要查看这些重复值是什么样的形式…

LFU算法的详细介绍与实现

LRU 算法的淘汰策略是 Least Recently Used&#xff0c;也就是每次淘汰那些最久没被使用的数据&#xff1b;而 LFU 算法的淘汰策略是 Least Frequently Used&#xff0c;也就是每次淘汰那些使用次数最少的数据。 LRU 算法的核心数据结构是使用哈希链表 LinkedHashMap&#xff…

spring全家桶(一):如何创建springboot项目

一.如何创建springboot项目 1.通过官网网站创建项目&#xff1a;https://start.spring.io/ 2.eclipse通过插件Spring Tool Suite(sts)创建项目 3.idea默认已经有spring插件 二.程序入口 SpringBootApplication public class HelloApplication {public static void main(Strin…

Linux--获取当前进程的父进程PID(即PPID)

方法一&#xff1a;编程法 #include <sys/types.h>pid_t ppidgetppid(); 方法二&#xff1a;指令法 ps axj | head -1 && ps axj | grep 当前进程PID 注&#xff1a;你会发现&#xff0c;每次查看当前进程PID时&#xff0c;PID都不相同&#xff0c;但是它的P…

设计模式——原型模式

原型模式比较简单&#xff0c;本质就是将一个设置好一部分公共属性的对象进行克隆&#xff0c;产生出大量的对象&#xff0c;再对每个对象进行相应的个性化处理需要注意的是&#xff1a;对象克隆时&#xff0c;如果其成员变量中存在引用类型&#xff08;数组、引用对象等&#…

《人工智能.一种现代方法》原版精读思维导图-第二章

目录 书籍 相关 2. Intelligent Agents 2.1 Agents and Environments 2.2 Good Behavior: The Concept of Rationality 2.3 The Nature of Environments 2.4 The Structure of Agents summary 书籍 人工智能.一种现代方法 Artificial Intelligence. The Modern Appro…

基于LLM大模型开发Web App生成器

随着越来越多的代码生成模型公开可用&#xff0c;现在可以以我们以前无法想象的方式进行文本到网络甚至文本到应用程序。 本教程介绍了一种通过流式传输和渲染内容来生成 AI Web 内容的直接方法。 推荐&#xff1a;用 NSDT设计器 快速搭建可编程3D场景。 1、在 Node 应用程序中…

13 个最佳免费 PDF 编辑器清单

您正在寻找一款真正免费的 PDF 编辑器&#xff0c;不仅可以编辑和添加文本&#xff0c;还可以更改图像、添加您自己的图形、签署您的名字、填写表格等等&#xff1f;您来对地方了&#xff1a;我研究了这些类型的应用程序&#xff0c;以得出您正在寻找的内容的列表。 其中一些是…

element 表格套输入框

实现效果&#xff1a; 编辑&#xff1a; 查看&#xff1a;点击平台补贴展示弹窗 <el-table:data"tableData"border:header-cell-style"{background:#D7D7D7,color:#000}"style"width: 100%"row-dblclick"dbclick":cell-class-name…

c++中的时间处理(3)与sleep相关的时间函数

1、Sleep()函数 头文件&#xff1a; Windows下为&#xff1a;windows.h Linux下为&#xff1a;unistd.h 注意&#xff1a; &#xff08;1&#xff09;Sleep是区分大小写的&#xff0c;有的编译器是大写&#xff0c;有的是小写。 &#xff08;2&#xff09;Sleep括号里的时间&…

ELK中grok插件、mutate插件、multiline插件、date插件的相关配置

目录 grok 正则捕获插件 自定义表达式调用 mutate 数据修改插件 示例&#xff1a; ●将字段old_field重命名为new_field ●添加字段 ●将字段删除 ●将filedName1字段数据类型转换成string类型&#xff0c;filedName2字段数据类型转换成float类型 ●将filedName字段中…

Nginx调优和探活配置

Nginx基本参数优化 1 . worker_processes 1; # 指定 Nginx 要开启的进程数&#xff0c;结尾的数字就是进程的个数&#xff0c;可以为 auto。 这个参数调整的是 Nginx 服务的 worker 进程数&#xff0c;Nginx 有 Master 进程和 worker 进程之分&#xff0c;Master 为管理进程、真…

Web常见请求参数接收的总结

首先本文所展示的参数接收的总结&#xff0c;都是基于Spring Boot框架而言的&#xff0c;不是一般传统方式使用request对象来完成参数的接收 简单参数的接收 对于简单参数的接收&#xff0c;在Spring Boot框架中&#xff0c;在Controller类中设置对应的处理方式时&#xff0c;…