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

JDBC编程基础

JDBC编程基础

    • JDBC介绍
    • 创建JDBC项目的步骤
      • 1.引入依赖
      • 2.注册驱动
      • 3.获取数据库连接
      • 4.获取sql执行对象
    • JDBC 常用 API 详解
      • sql执行对象
        • PreparedStatement作用
      • 事务管理
      • 结果集对象
    • JDBC项目demo
      • 测试

JDBC介绍

每个数据库都会提供一组API来支持程序员实现自己客户端,自己根据需求来完成一些具体的增删查改的功能。但数据库也有很多种,例如 Oracle、MySQL、SQL Server 等。显然,这些不同的数据库是出自不同的厂商之手,而对于数据库 API 的约定,并没有一个业界统一的标准。 Java 这种跨平台的语言就弄了一个大统一的方案,就叫JDBC。也就是说,Java约定了一组API,称为 JDBC,这组 API 里面就包含了一些类和一些方法,通过这些类和方法来实现数据库的基本操作。再由各个厂商提供各自的数据驱动包,来和 JDBC 的 API 对接。程序员只需要掌握这一套 JDBC API 就可以操作各种各样的数据库了。

创建JDBC项目的步骤

1.引入依赖

依赖仓库

选择和自己数据库版本相同的连接依赖。

        <dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId><version>8.0.30</version></dependency>

2.注册驱动

不是必须的,在较新的 JDBC 版本中,使用Class.forName("com.mysql.cj.jdbc.Driver");注册驱动已经不是必需的步骤。在较旧的 JDBC 版本(例如 JDBC 3.0 及之前的版本)中,手动加载驱动是必须的,因为在那些版本中,驱动的加载不是由DriverManager自动完成的。

在 JDBC 4.0 及更高版本中,Java引入了服务提供者机制(Service Provider Mechanism),其中DriverManagerregisterDriver方法能够自动识别和加载可用的 JDBC 驱动。因此,对于新的 MySQL Connector/J 驱动,不再需要显式地调用Class.forName("com.mysql.cj.jdbc.Driver");

Class.forName("com.mysql.cj.jdbc.Driver");//mysql8.0
Class.forName("com.mysql.jdbc.Driver");//mysql8.0以前

3.获取数据库连接

String url = "jdbc:mysql://localhost:3306/test";
String user = "root";
String password = "120125hzy.";
Connection conn = DriverManager.getConnection(url, user, password);

4.获取sql执行对象

//获取执行sql对象 Statement
Statement stmt = conn.createStatement();//处理结果集
ResultSet rs = null;rs=stmt.executeQuery(sql);//executeQuery 执行select语句
rs=stmt.executeUpdate(sql);//executeUpdate 执行 INSERT、UPDATE 或 DELETE 语句以及 SQL DDL(数据定义语言)语句,例如 CREATE TABLE 和 DROP TABLE。INSERT、UPDATE 或 DELETE 语句的效果是修改表中零行或多行中的一列或多列。executeUpdate 的返回值是一个整数(int),指示受影响的行数(即更新计数)。对于 CREATE TABLE 或 DROP TABLE 等不操作行的语句,executeUpdate 的返回值总为零。
rs=stmt.execute(sql);//方法execute:可用于执行任何SQL语句,返回一个boolean值,表明执行该SQL语句是否返回了ResultSet。如果执行后第一个结果是ResultSet,则返回true,否则返回false。但它执行SQL语句时比较麻烦,通常我们没有必要使用execute方法来执行SQL语句,而是使用executeQuery或executeUpdate更适合,但如果在不清楚SQL语句的类型时则只能使用execute方法来执行该SQL语句了。

JDBC 常用 API 详解

sql执行对象

  • Statement createStatement():普通执行sql对象。
  • PreparedStatement prepareStatement(sql):预编译sql的执行sql对象防止sql注入,可以多次执行,只需变更参数值。
  • CallableStatement prepareCall(sql):执行存储过程的对象。

执行sql语句:

  • int executeUpdate(sql):执行DML,DDL语句,返回DML语句影响的行数,DDL语句执行后,成功也可能返回0。

  • ResultSet executeQuery(sql):执行DQL语句返回值,ResultSet 结果集对象。

PreparedStatement作用

预编译sql语句并执行,预防sql注入

// 获取 PreparedStatement 对象
// sql语句中的参数值,使用?占位符替代
String sql = "select * from user where uesrname = ? and password = ?";
// 通过Connection对象获取,并传入对应的sql语句
PreparedStatement pstmt = conn.prepareStatement(sql); 
/* 设置参数值
PreparedStatement对象:setXxx(参数1,参数2):给?赋值Xxx:数据类型:如setInt(参数1,参数2);参数:参数1:?的位置编号,从1开始参数2:?的值*/
pstmt.setString(1, "zs");
pstmt.setInt(2,123);// 执行sql
pstmt.executeQuery(); // 不需要传递sql

事务管理

  • setAutoCommit(boolean autoCommit):开启事务,true为自动提交事务,false为手动。
  • commit():提交事务。
  • rollback():回滚事务。

结果集对象

ResultSet:封装了DQL查询语句的结果。

获取查询结果:

  • boolean next():将光标向后移动一行,判断当前行是否为有效行
  • xxx getXxx(参数):获取数据
    • xxx:数据类型;如 Int getInt(参数) String getString(参数)。
    • 参数: int:列的编号,从1开始;String :列名。

JDBC项目demo

JDBC连接类

public class JDBC {static Connection connection = null;/*static { 高版本不是必须的,为了兼容性可以写try {Class.forName("com.mysql.cj.jdbc.Driver");} catch (ClassNotFoundException e) {throw new RuntimeException(e);}}*/private JDBC() {}public static Connection getConnection() {try {String url = "jdbc:mysql://localhost:3306/test";String user = "root";String password = "120125hzy.";connection = DriverManager.getConnection(url, user, password);} catch (SQLException e) {System.out.println("数据库连接失败");e.printStackTrace();}System.out.println("数据库连接成功");return connection;}public static void close() {try {if (connection != null && !connection.isClosed()) {connection.close();System.out.println("数据库关闭成功");}} catch (SQLException e) {System.out.println("数据库关闭失败");e.printStackTrace();}}
}

实体类 User

public class User {private int id;private String name;private Double balance;public int getId() {return id;}public void setId(int id) {this.id = id;}public String getName() {return name;}public void setName(String name) {this.name = name;}public Double getBalance() {return balance;}public void setBalance(Double balance) {this.balance = balance;}@Overridepublic String toString() {return "User{" +"id=" + id +", name='" + name + '\'' +", balance=" + balance +'}';}
}

Dao 层

public class UserDao {public static List<User> select() {Connection conn = JDBC.getConnection();try {PreparedStatement ps = conn.prepareStatement("select * from user2");ResultSet resultSet = ps.executeQuery();List<User> ans = new ArrayList<>();while (resultSet.next()) {User user = new User();user.setId(resultSet.getInt("id"));user.setName(resultSet.getString("name"));user.setBalance(resultSet.getDouble("balance"));ans.add(user);}return ans;} catch (SQLException e) {throw new RuntimeException(e);} finally {JDBC.close();}}public static User selectByID(Integer id) {Connection conn = JDBC.getConnection();try {PreparedStatement ps = conn.prepareStatement("select * from user2 where id = ?");ps.setInt(1, id);ResultSet resultSet = ps.executeQuery();User user = new User();while (resultSet.next()) {user.setId(resultSet.getInt("id"));user.setName(resultSet.getString("name"));user.setBalance(resultSet.getDouble("balance"));}return user;} catch (SQLException e) {throw new RuntimeException(e);} finally {JDBC.close();}}public static String updateByID(User user) {Connection conn = JDBC.getConnection();try {PreparedStatement ps =conn.prepareStatement("update user2 set name = ?, balance = ? where id = ?");ps.setString(1, user.getName());ps.setDouble(2, user.getBalance());ps.setInt(3, user.getId());int i = ps.executeUpdate();return i > 0 ? "成功" : "失败";} catch (SQLException e) {throw new RuntimeException(e);} finally {JDBC.close();}}
}

测试

查询所有

    @Testpublic void test01(){// 查询所有List<User> users = UserDao.select();for (User user : users){System.out.println(user);}}

在这里插入图片描述

根据id查询

    @Testpublic void test02() {// 根据id查询User user = UserDao.selectByID(1);System.out.println(user);}

在这里插入图片描述

根据id修改

    @Testpublic void test03() {// 根据id修改User user = new User();user.setId(1);user.setName("李逍遥");user.setBalance(2000.00);System.out.println(UserDao.updateByID(user));// 根据id查询user = UserDao.selectByID(1);System.out.println(user);}

在这里插入图片描述

相关文章:

JDBC编程基础

JDBC编程基础 JDBC介绍创建JDBC项目的步骤1.引入依赖2.注册驱动3.获取数据库连接4.获取sql执行对象 JDBC 常用 API 详解sql执行对象PreparedStatement作用 事务管理结果集对象 JDBC项目demo测试 JDBC介绍 每个数据库都会提供一组API来支持程序员实现自己客户端&#xff0c;自己…...

Linux shell命令

Linux shell命令 1、Shell简介 ​ Shell 是一个用 C 语言编写的程序&#xff0c;它是用户使用 Linux 的桥梁。Shell 既是一种命令语言&#xff0c;又是一种程序设计语言。 ​ Shell 是指一种应用程序&#xff0c;这个应用程序提供了一个界面&#xff0c;用户通过这个界面访问…...

Vue 3 面试经验分享

&#x1f337;&#x1f341; 博主猫头虎&#xff08;&#x1f405;&#x1f43e;&#xff09;带您 Go to New World✨&#x1f341; &#x1f984; 博客首页——&#x1f405;&#x1f43e;猫头虎的博客&#x1f390; &#x1f433; 《面试题大全专栏》 &#x1f995; 文章图文…...

Vue简易的车牌输入键盘,可以根据需要修改

效果图如下&#xff1a; 代码如下&#xff1a; <template><div><div class"carNoBoxInput"><div style"padding: 6px;border: 2px solid #fff;border-radius: 6px;margin: 6px 3px 6px 6px;"><input class"inputBox"…...

十分钟搭建VScode C/C++运行环境

一、下载配置vscode 1.下载安装VScode 地址&#xff1a;https://code.visualstudio.com/download 下载后&#xff0c;运行安装程序 (VSCodeUserSetup-{version}.exe)。这只需要一分钟。安装程序会将 Visual Studio Code 添加到环境变量中%&#xff0c;可以使用CMD键入“code”…...

控制台gbk乱码

引用IntelliJ IDEA中 统一设置编码为utf-8或GBK-CSDN博客 特别注意file coding 的文件path和java的编码格式 配置...

Springboot日志-logback

logback-spring.xml的配置项 共有一个父标签、两种属性、三个节点: 一个父标签&#xff1a;configuration 两种属性&#xff1a;contextName和property 三个节点&#xff1a;appender、root、logger 日志级别 日志级别从低到高分为TRACE < DEBUG < INFO < WARN &…...

六、Lua 运算符

文章目录 一、Lua 运算符&#xff08;一&#xff09;算术运算符&#xff08;二&#xff09;关系运算符&#xff08;三&#xff09;逻辑运算符&#xff08;四&#xff09;其他运算符 二、运算符优先级 一、Lua 运算符 运算符是一个特殊的符号&#xff0c;用于告诉解释器执行特定…...

Android frameworks 开发总结十一

1.修改GMS的setup wizard 1.1 找到需要修改的文件 打开vendor/partner_gms/apps/GmsSampleIntegration/res/values/config.xml文件。以Arashi R为例: <resources><string name="wizard_script_uri" translatable="false">android.resource…...

学嵌入式,已经会用stm32做各种小东西了,下一步是什么

学嵌入式&#xff0c;已经会用stm32做各种小东西了&#xff0c;下一步是什么&#xff0c;研究stm32的内部吗&#xff1f; 针对题主这种类型的&#xff0c;首先我想提出几个技术问题。 1&#xff0c;除了那几个常用的外设&#xff0c;stm32上集成的众多外设是否都有实际的使用经…...

Java面试题10

1.MyBatis 中 #{}和 ${}的区别是什么&#xff1f; #{} 是预编译的占位符&#xff0c;MyBatis会将其转化为一个占位符参数&#xff0c;安全性较高&#xff0c;可以防止 SQL注入&#xff1b; ${} 是字符串替换&#xff0c;直接将内容替换到SQL语句中&#xff0c;不会进行参数处理…...

DBeaver连接MySQL提示“Public Key Retrieval is not allowed“问题解决方式

更新时间&#xff1a;2023年10月31日 11:37:53 作者&#xff1a;产品人小柒 dbeaver数据库连接工具,可以支持几乎所有的主流数据库.mysql,oracle.sqlserver,db2 等等,这篇文章主要给大家介绍了关于DBeaver连接MySQL提示"Public Key Retrieval is not allowed"问…...

振弦式轴力计和振弦采集仪组成的安全监测解决方案

振弦式轴力计和振弦采集仪组成的安全监测解决方案 振弦式轴力计和振弦采集仪是一种常用的结构安全监测工具&#xff0c;可以用于评估建筑物、桥梁、隧道或其他结构的结构健康状态和安全性能。这种监测方案较为先进、精确&#xff0c;并且能够监测长期的结构反应&#xff0c;因此…...

卡尔曼滤波

通过 Eigen 矩阵运算实现线性卡尔曼滤波。模拟的是一辆带火箭发动机的汽车&#xff0c;一开始沿着X轴匀速运动&#xff0c;到X轴中间开启火箭发动机匀加速向Y轴起飞。同理可以仿真&#xff08;x,y,z,yaw,pitch,raw&#xff09; 6自由度的真实飞行情况 #include <iostream&g…...

不受平台限制,Sketch 网页版震撼登场

Sketch 是一种基于 Mac 的矢量图形编辑器&#xff0c;可用于数字设计。其主要功能包括无损矢量编辑、完美像素精度和数百个插件同步功能&#xff0c;可导出预设和代码。它是目前流行的页面交互协作设计工具。但是 Sketch 最大的缺点是对 Windows/PC 用户不友好。严格来说&#…...

如何使用.pth训练模型

一.使用.pth训练模型的步骤如下&#xff1a; 1.导入必要的库和模型 import torch import torchvision.models as models# 加载预训练模型 model models.resnet50(pretrainedTrue) 2.定义数据集和数据加载器 # 定义数据集和数据加载器 dataset MyDataset() dataloader to…...

C++11线程以及线程同步

C11中提供的线程类std::thread,基于此类创建一个新的线程相对简单&#xff0c;只需要提供线程函数和线程对象即可 一.命名空间 this_thread C11 添加一个关于线程的命名空间std::this_pthread ,此命名空间中提供四个公共的成员函数&#xff1b; 1.1 get_id() 调用命名空间s…...

深度学习之基于YoloV3杂草识别系统

欢迎大家点赞、收藏、关注、评论啦 &#xff0c;由于篇幅有限&#xff0c;只展示了部分核心代码。 文章目录 一项目简介 二、功能三、系统四. 总结 一项目简介 深度学习在图像识别领域已经取得了显著的成果&#xff0c;其中基于YOLO&#xff08;You Only Look Once&#xff09…...

Linux 命令vim(编辑器)

(一)vim编辑器的介绍 vim是文件编辑器&#xff0c;是vi的升级版本&#xff0c;兼容vi的所有指令&#xff0c;同时做了优化和延伸。vim有多种模式&#xff0c;其中常用的模式有命令模式、插入模式、末行模式&#xff1a;。 (二)vim编辑器基本操作 1 进入vim编辑文件 1 vim …...

轻松配置PPPoE连接:路由器设置和步骤详解

在家庭网络环境中&#xff0c;我们经常使用PPPoE&#xff08;点对点协议过夜&#xff09;连接来接入宽带互联网。然而&#xff0c;对于一些没有网络专业知识的人来说&#xff0c;配置PPPoE连接可能会有些困难。在本文中&#xff0c;我将详细介绍如何轻松配置PPPoE连接&#xff…...

Python爬虫实战:研究MechanicalSoup库相关技术

一、MechanicalSoup 库概述 1.1 库简介 MechanicalSoup 是一个 Python 库,专为自动化交互网站而设计。它结合了 requests 的 HTTP 请求能力和 BeautifulSoup 的 HTML 解析能力,提供了直观的 API,让我们可以像人类用户一样浏览网页、填写表单和提交请求。 1.2 主要功能特点…...

Python|GIF 解析与构建(5):手搓截屏和帧率控制

目录 Python&#xff5c;GIF 解析与构建&#xff08;5&#xff09;&#xff1a;手搓截屏和帧率控制 一、引言 二、技术实现&#xff1a;手搓截屏模块 2.1 核心原理 2.2 代码解析&#xff1a;ScreenshotData类 2.2.1 截图函数&#xff1a;capture_screen 三、技术实现&…...

为什么需要建设工程项目管理?工程项目管理有哪些亮点功能?

在建筑行业&#xff0c;项目管理的重要性不言而喻。随着工程规模的扩大、技术复杂度的提升&#xff0c;传统的管理模式已经难以满足现代工程的需求。过去&#xff0c;许多企业依赖手工记录、口头沟通和分散的信息管理&#xff0c;导致效率低下、成本失控、风险频发。例如&#…...

零基础设计模式——行为型模式 - 责任链模式

第四部分&#xff1a;行为型模式 - 责任链模式 (Chain of Responsibility Pattern) 欢迎来到行为型模式的学习&#xff01;行为型模式关注对象之间的职责分配、算法封装和对象间的交互。我们将学习的第一个行为型模式是责任链模式。 核心思想&#xff1a;使多个对象都有机会处…...

高效线程安全的单例模式:Python 中的懒加载与自定义初始化参数

高效线程安全的单例模式:Python 中的懒加载与自定义初始化参数 在软件开发中,单例模式(Singleton Pattern)是一种常见的设计模式,确保一个类仅有一个实例,并提供一个全局访问点。在多线程环境下,实现单例模式时需要注意线程安全问题,以防止多个线程同时创建实例,导致…...

嵌入式学习笔记DAY33(网络编程——TCP)

一、网络架构 C/S &#xff08;client/server 客户端/服务器&#xff09;&#xff1a;由客户端和服务器端两个部分组成。客户端通常是用户使用的应用程序&#xff0c;负责提供用户界面和交互逻辑 &#xff0c;接收用户输入&#xff0c;向服务器发送请求&#xff0c;并展示服务…...

uniapp 小程序 学习(一)

利用Hbuilder 创建项目 运行到内置浏览器看效果 下载微信小程序 安装到Hbuilder 下载地址 &#xff1a;开发者工具默认安装 设置服务端口号 在Hbuilder中设置微信小程序 配置 找到运行设置&#xff0c;将微信开发者工具放入到Hbuilder中&#xff0c; 打开后出现 如下 bug 解…...

前端中slice和splic的区别

1. slice slice 用于从数组中提取一部分元素&#xff0c;返回一个新的数组。 特点&#xff1a; 不修改原数组&#xff1a;slice 不会改变原数组&#xff0c;而是返回一个新的数组。提取数组的部分&#xff1a;slice 会根据指定的开始索引和结束索引提取数组的一部分。不包含…...

GraphQL 实战篇:Apollo Client 配置与缓存

GraphQL 实战篇&#xff1a;Apollo Client 配置与缓存 上一篇&#xff1a;GraphQL 入门篇&#xff1a;基础查询语法 依旧和上一篇的笔记一样&#xff0c;主实操&#xff0c;没啥过多的细节讲解&#xff0c;代码具体在&#xff1a; https://github.com/GoldenaArcher/graphql…...

在鸿蒙HarmonyOS 5中使用DevEco Studio实现指南针功能

指南针功能是许多位置服务应用的基础功能之一。下面我将详细介绍如何在HarmonyOS 5中使用DevEco Studio实现指南针功能。 1. 开发环境准备 确保已安装DevEco Studio 3.1或更高版本确保项目使用的是HarmonyOS 5.0 SDK在项目的module.json5中配置必要的权限 2. 权限配置 在mo…...