JDBC编程

文章目录

  • 一、概述
  • 二、使用

一、概述

1.概念

JDBC(Java Database Connectivity java数据库连接)指的是通过Java代码,来操作数据库,是一种用于执行SQL语句的Java API,是Java中的数据库连接规范。这个API由 java.sql.,javax.sql. 包中的一些类和接口组成,它为Java开发人员操作数据库提供了一个标准的API,可以为多种关系数据库提供统一访问

2.工作原理

(1)一个成熟的数据库一般都会提供一些API(Application Programming Interface 应用程序编程接口,广义概念),供程序员使用,可以给人提供一些功能,这些功能往往是通过一些函数/类这样的方式来提供的
      【1】 Arraylist、Scanner、Random等都可以认为是Java标准库提供的API。

      【2】 Interface也是接口,特指Java语法中的一种特殊语法格式(狭义概念),Java 中的interface也是一种提供API的方式

(2)成熟的数据库有很多,如MySQL、Oracle、SQLServer、SQLite等,这些数据库提供的AIP差异很大。JDBC就是Java这边提出的一套操作数据库的API,存在的意义就是为了统一每个数据库的API,让所有的数据库都遵循Java的这套API,能按照一样的方式来操作使用。

(3)JDBC是提供了一套统一的API,但是数据库也有自己的API,这里是每个数据库厂商提供了数据库的驱动包(一些代码),类似于翻译,将API进行转化

在这里插入图片描述
(4)JDBC是个jar包,.jar类似于.rar这样的压缩包,.jar是java定义的一种压缩格式,里面包含了很多的.class文件

二、使用

1.步骤

  1. 将jar包导入到项目中
  2. 创建数据源
  3. 创建数据库连接Connection
  4. 创建操作命令Statement
  5. 使用操作命令来执行SQL
  6. 处理结果集ResultSet
  7. 释放资源

2.分析

import com.mysql.jdbc.jdbc2.optional.MysqlDataSource;import javax.sql.DataSource;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.SQLException;
import java.util.Scanner;public class JDBCDemo1 {public static void main(String[] args) throws SQLException {// 假定数据库中有一个 student 表 (id, name), 往里面插入一个数据.// 让用户通过控制台来输入学号和姓名.Scanner scanner = new Scanner(System.in);System.out.println("请输入学号: ");int id = scanner.nextInt();System.out.println("请输入姓名: ");String name = scanner.next();// 1. 创建 "数据源"DataSource dataSource = new MysqlDataSource();((MysqlDataSource) dataSource).setUrl("jdbc:mysql://127.0.0.1:3306/Test?characterEncoding=utf8&useSSL=false");((MysqlDataSource) dataSource).setUser("root");((MysqlDataSource) dataSource).setPassword("123456");// 2. 和数据库服务器建立连接Connection connection = dataSource.getConnection();// 3. 构造 SQL 语句String sql = "insert into student values(?, ?)";PreparedStatement statement = connection.prepareStatement(sql);statement.setInt(1, id);statement.setString(2, name);// 4. 执行 SQL 语句int n = statement.executeUpdate();System.out.println("n = " + n);// 5. 释放必要的资源. 关闭连接.statement.close();connection.close();}
}

1. 创建 “数据源”

DataSource dataSource = new MysqlDataSource();
  • DataSource :JDBC的interface,MysqlDataSource :MYSQL驱动包中提供的类,实现了DataSource interface,是向上转型
((MysqlDataSource) dataSource).setUrl("jdbc:mysql://127.0.0.1:3306/java108?characterEncoding=utf8&useSSL=false");
  • 是向下转型(因为这个setUrl方法是子类独有的)
    > MysqlDataSource dataSource = new MysqlDataSource();
    > DataSource.setUrl();
       也可以这样写,不需要任何转型
  • 上述转型的写法,本意是希望,让MysqlDataSource这个类,不要扩散到代码的其他部分(目的是降低mysql驱动包和自写项目之间的耦合关系,避免后续更换数据库时,有太大的成本)
  • URL:唯一资源定位符,通常使用URL来描述网络上的一个资源的位置,mysql本体是服务器,相当于是网络上的资源
  • jdbc:mysql://127.0.0.1:3306/Test?characterEncoding=utf8&useSSL=false
    • jdbc:mysql:表示这个url是什么类型/用途的,这里意思是,【给JDBC的mysql使用的】
    • 127.0.0.1
      • 表示ip地址(网络上的一个设备的地址,通过一串数字来表示,这一串数字通常是4个部分,每个部分取值范围是0-255,4个部分使用.分割,使用点分十进制转换)
      • 127.0.0.1 是个特殊的ip地址,即环回ip(loopback)特指自己的主机
    • 3306:端口号,用来区分主机上的应用程序(进程)
    • Test:数据库名
    • characterEncoding=utf8:统一字符集是utf8
    • useSSL=false:数据库服务器和客户端之间的通信要不要加密(不写是默认加密),不写有可能会连不上数据库
((MysqlDataSource) dataSource).setUser("root");  //设置用户名
((MysqlDataSource) dataSource).setPassword("123456"); //设置密码
  • root:大家都是root
  • 123456:安装数据库时,自己设置的密码

2. 和数据库服务器建立网络上的连接

使用【Connection java.sql】,不要用【Connection com.mysql.jdbc】(MySQL驱动包的Connection)

Connection connection = dataSource.getConnection();
  • java.sql.SQLException:jdbc中提供的受查异常,务必要手动处理,(要么try catch、要么throws)
  • 一个java程序可以连多个数据库服务器
  • 和每个数据库服务器进行通信都得有一个独立的连接

3. 构造 SQL 语句

Statement对象主要是将SQL语句发送到数据库中。JDBC API中主要提供了三种Statement对象,即Statement、PreparedStatement、CallableStatement

String sql = "insert into student values(?, ?)";
PreparedStatement statement = connection.prepareStatement(sql);
statement.setInt(1, id);
statement.setString(2, name);
  • SQL语句,是String类型的,JDBC提供了Statement(语句)对象,可以将String转换成Statement再发给服务器执行,但是,我们一般会使用PreparedStatement(预处理的语句)对象来代替Statement。
    • Statement 是把sql原封不动地直接发给数据库服务器,数据库服务器自己负责解析SQL,PreparedStatement 则会在客户端这边初步解析一下SQL,如验证语法是否正确等等,此时服务器就不用做这些检查了,可以降低服务器的负担
  • String sql = “insert into student values(” + id + ", " + name + “)”;
    • 这种写法也可以达到动态输入的效果,但是不建议这么写,因为这个写法看起来比较混乱,而且这种拼接字符串的方式,并不安全(可能会受到SQL注入攻击,黑客会通过一些特定的输入,达成对数据库攻击的效果)
  • ?是一个占位符,占据一个位置,后续PreparedStatement 会把变量的数值,代入到?中

4. 执行 SQL 语句

int n = statement.executeUpdate();
System.out.println("n = " + n);
  • executQuery():本质是“读”操作, 方法执行后返回单个结果集的,通常用于select语句
    executeUpdate():本质都是“写”操作,方法返回值是一个整数,指示受影响的行数,通常用于update、insert、delete
    语句

5. 释放必要的资源. 关闭连接.

创建的语句对象和连接对象,都会持有一些计算机的硬件/软件上的资源,这些资源不用了就应该要及时释放。
java中虽然有“垃圾回收”机制,可以自动释放内存,但是计算机的资源又不仅仅是内存,这些其他的资源就需要手动释放(一般都是会提供close方法,专门负责释放资源的方法)

statement.close();
connection.close();
  • 注意关闭顺序,先创建的对象,后关闭

三、查询操作

import com.mysql.jdbc.jdbc2.optional.MysqlDataSource;import javax.sql.DataSource;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.Scanner;// 查询
public class JDBCDemo3 {public static void main(String[] args) throws SQLException {Scanner scanner = new Scanner(System.in);System.out.println("请输入要查询的学号: ");int studentId = scanner.nextInt();DataSource dataSource = new MysqlDataSource();((MysqlDataSource) dataSource).setUrl("jdbc:mysql://127.0.0.1:3306/java108?characterEncoding=utf8&useSSL=false");((MysqlDataSource) dataSource).setUser("root");((MysqlDataSource) dataSource).setPassword("2222");Connection connection = dataSource.getConnection();// 这里同样可以包含一些占位符.String sql = "select * from student where id = ?";PreparedStatement statement = connection.prepareStatement(sql);statement.setInt(1, studentId);// 执行查询操作, 要使用 executeQuery. 返回值是一个 ResultSet 类型的对象. 表示了一个 "表格"ResultSet resultSet = statement.executeQuery();// 遍历结果集合,最先指向的是第一行记录的前一个位置,每次调用next就会往下走一行,读取成功了,返回true,否则返回falsewhile (resultSet.next()) {// 获取到这一行的 学号 列int id = resultSet.getInt("id");// 获取到这一行的 姓名 列String name = resultSet.getString("name");System.out.println("id: " + id + ", name: " + name);}// 释放资源.resultSet.close();statement.close();connection.close();}
}

1.ResultSet对象

  • ResultSet对象它被称为结果集,它代表符合SQL语句条件的所有行,并且它通过一套getXXX方法提供了对这些行中数据的访问。
  • ResultSet里的数据一行一行排列,每行有多个字段,并且有一个记录指针,指针所指的数据行叫做当前数据行,我们只能来操作当前的数据行。我们如果想要取得某一条记录,就要使用ResultSet的next()方法 ,如果我们想要得到ResultSet里的所有记录,就应该使用while循环。

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

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

相关文章

SpringBoot介绍与搭建

SpringBoot Spring Boot 是由 Pivotal 团队提供的在 spring 框架基础之上开发的框架, 其设计目的是用来简化应用的初始搭建以及开发过程。对spring搭建过程中的繁琐模板配置以及版本依赖问题进行解决(优化)不使用xml进行配置,提供其他的方式进行配置,使…

pytorch异常——RuntimeError:Given groups=1, weight of size..., expected of...

文章目录 省流异常报错异常截图异常代码原因解释修正代码执行结果 省流 nn.Conv2d 需要的输入张量格式为 (batch_size, channels, height, width),但您的示例输入张量 x 是 (batch_size, height, width, channels)。因此,需要对输入张量进行转置。 注意…

第 112 场 LeetCode 双周赛题解

A 判断通过操作能否让字符串相等 I s 1 s1 s1和 s 2 s2 s2第 1 1 1、 2 2 2位若同位置不等,则 s 1 s1 s1交换对应的 i i i和 j j j位置,之后判断 s 1 s1 s1和 s 2 s2 s2是否相当 class Solution { public:bool canBeEqual(string s1, string s2) {for (i…

全脑建模:过去、现在和未来

什么是全脑建模? 全脑建模(WBM)是计算神经科学的子领域,涉及近似全脑神经活动的计算和理论模型。该方法的目标是研究神经活动的宏观时空模式如何由解剖连接结构、内在神经动力学和外部扰动(感觉、认知、药理、电磁等)的相互作用产生。这种宏观现象及其模…

CSS3D+动画

CSS3D 1.css3D 给父元素设置 perspective:景深:近大远小的效果900-1200px这个范围内 transform-style:是否设置3D环境 flat 2D环境 默认值 perserve-3D环境 3D功能函数 1.位移: translateZ()translate3D(x,y,z) <!DOCTYPE html> <html lang"en"><h…

CDH6.3.2集成Kerberos

CDH6.3.2集成Kerberos 一.参考doc CDH enable kerberos: Kerberos Security Artifacts Overview | 6.3.x | Cloudera Documentation CDH disable kerberos:https://www.sameerahmad.net/blog/disable-kerberos-on-CDH; https://community.cloudera.com/t5/Support-Questions…

图像处理简介

目录 基本术语 1 .图像(image) 1.1 像素(Pixel) 1.2 颜色深度&#xff08;Color Depth&#xff09; 1.3 分辨率&#xff08;Resolution&#xff09; 1.4 像素宽高比&#xff08;Pixel Aspect Ratio&#xff09; 1.5 帧率(FPS) 1.6 码率&#xff08;BR&#xff09; 1. …

数据库(MySQL)的存储过程

一、存储过程介绍 存储过程是事先经过编译并存储在数据库中的一段SQL 语句的集合&#xff0c;调用存储过程可以简化应用开发人员的很多工作&#xff0c;减少数据在数据库和应用服务器之间的传输&#xff0c;对于提高数据处理的效率是有好处的。 存储过程思想上很简单&#xff0…

音频——I2S 右对齐模式(四)

I2S 基本概念飞利浦(I2S)标准模式左(MSB)对齐标准模式右(LSB)对齐标准模式DSP 模式TDM 模式 文章目录 I2S right时序图逻辑分析仪抓包 I2S right I2S 右对齐标准 也叫日本格式&#xff0c;sony 格式。相比于标准左对齐格式&#xff0c;标准右对齐的不足在于接收设备必须事先知…

53 个 CSS 特效 3(完)

53 个 CSS 特效 3&#xff08;完&#xff09; 前两篇地址&#xff1a; 53 个 CSS 特效 153 个 CSS 特效 2 这里是第 33 到 53 个&#xff0c;很多内容都挺重复的&#xff0c;所以这里解释没之前的细&#xff0c;如果漏了一些之前的笔记会补一下&#xff0c;写过的就会跳过。…

11 - 深入了解NIO的优化实现原理

Tomcat 中经常被提到的一个调优就是修改线程的 I/O 模型。Tomcat 8.5 版本之前&#xff0c;默认情况下使用的是 BIO 线程模型&#xff0c;如果在高负载、高并发的场景下&#xff0c;可以通过设置 NIO 线程模型&#xff0c;来提高系统的网络通信性能。 我们可以通过一个性能对比…

STM32+RTThread配置以太网无法ping通,无法获取动态ip的问题

记录一个非常蠢的问题&#xff0c;今天在移植rtthread的以太网驱动的时候出现无法获取动态ip的问题&#xff0c;问题如下&#xff1a; 设置为动态ip时不管是连接路由器还是电脑主机都无法ping通&#xff0c;也无法获取dns地址。 设置为静态ip时无法ping通主机。 使用wireshark…