【JDBC】入门增删改查

news2025/1/2 22:42:25
  1. JDBC
    1. JDBC概述

JDBC(Java DataBase Connectivity,    java数据库连接)是一种用于执行SQL语句的Java API。JDBC是Java访问数据库的标准规范,可以为不同的关系型数据库提供统一访问,它一组用Java语言编写的接口和类组成

XML方式:

JDBC方式:

JDBC规范(掌握四个核心对象):

类:

DriverManager:用于注册驱动

接口:

Connection: 表示与数据库创建的连接

PreparedStatement : sql语句发射器

ResultSet: 结果集或一张虚拟表

今天我们使用的是mysql的驱动mysql-connector-java-5.1.47.jar

    1. JDBC入门案例

      1. 需求描述

需求:

使用java代码 链接到数据库  查询category表下的所有数据  将查询到的结果 显示到控制台

显示效果:

      1. 实现思路

项目中添加驱动包链接数据库. 发射语句得到结果,对结果进行遍历

      1. 准备工作

#创建数据库

create database day05pre;

#使用数据库

use day05pre;

###创建分类表

create table category(

cid int PRIMARY KEY AUTO_INCREMENT  ,

  cname varchar(100)

);

#初始化数据

insert into category (cname) values('家电');

insert into category (cname) values('服饰');

insert into category (cname) values('化妆品');

创建项目导入Jar包

创建lib目录,用于存放当前项目需要的所有jar包

选择jar包,右键执行build path / Add to Build Path

      1. 书写方法完成查询

方法内部按照如下步骤书写:

//1.注册驱动  获取连结

//2.发射语句 拿到结果进行处理

//3.关闭资源

以查询为例的代码实现

package com.czxy.demo01;

import java.sql.*;

public class Test01 {

    public static void main(String[] args) throws ClassNotFoundException, SQLException {

        //1.注册驱动  获取连结

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

        Connection conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/day05pre", "root", "root");

        //2.发射语句 拿到结果进行处理

        PreparedStatement pps = conn.prepareStatement("select * from category");

        ResultSet resultSet = pps.executeQuery();

            //查看结果

        while (resultSet.next()){

            int cid = resultSet.getInt("cid");

            String cname = resultSet.getString("cname");

            System.out.println(cid+" : "+cname);

        }

        //3.关闭资源

        resultSet.close();

        pps.close();

        conn.close();

    }

}

查询结果:

    1. API详解
      1. API详解:注册驱动

语法: Class.forName("com.mysql.jdbc.Driver");

固定写法: com.mysql.jdbc.Driver  是MySQL数据库的驱动类

通过反射获取com.mysql.jdbc.Driver对象时底层会直接注册驱动

其他写法:

DriverManager.registerDriver(new com.mysql.jdbc.Driver());不建议使用

原因是:

>导致驱动被注册2次。

>强烈依赖数据库的驱动jar

      1. API详解:获得链接

接口的实现在数据库驱动中。所有与数据库交互都是基于连接对象的。

Connection conn = DriverManager.getConnection(url, user, password);

语法:static Connection getConnection(String url, String user, String password)

试图建立到给定数据库 URL 的连接。

参数说明:url 需要连接数据库的位置(网址) user用户名  password 密码

例如:getConnection("jdbc:mysql://localhost:3306/day06", "root", "root");

URL:SUN公司与数据库厂商之间的一种协议。

jdbc:mysql://localhost:3306/day06

协议:子协议:// IP :端口号/具体的数据库

mysql: jdbc:mysql://localhost:3306/day04或者jdbc:mysql:///day14(默认本机连接)

oracle数据库: jdbc:oracle:thin:@localhost:1521:sid

      1. API详解:java.sql.PreparedStatement接口: 操作sql语句,并返回相应结果

String sql = "某SQL语句";

PreparedStatement pst = conn.prepareStatement(sql);

对象pst就是SQL语句的发射器,可以发射SQL语句,并获取执行结果

常用方法:

    1. int executeUpdate(); --执行insert update delete语句.
    2. ResultSet executeQuery(); --执行select语句.
    3. boolean execute(String sql); --仅当执行select并且有结果时才返回true,执行其他的语句返回false.
      1. API详解:处理结果集(注:执行insert、update、delete无需处理)

ResultSet实际上就是一张二维的表格,我们可以调用其boolean next()方法指向某行记录,当第一次调用next()方法时,便指向第一行记录的位置,这时就可以使用ResultSet提供的getXXX(int col)方法(与索引从0开始不同个,列从1开始)来获取指定列的数据:

rs.next();//判断下一行有没有数据,如果有返回true否则返回false

rs.getInt(1);//获取第一行第一列的数据

常用方法:

  1. Object getObject(int index) // Object getObject(String name) 获得任意对象
  2. String getString(int index)// String getString(String name) 获得字符串
  3. int getInt(int index)//int getInt(String name) 获得整型
  4. double getDouble(int index)// double getDouble(String name) 获得双精度浮点型

Eg:

      1. API详解:释放资源

与IO流一样,使用后的东西都需要关闭!关闭的顺序是先得到的后关闭,后得到的先关闭。

rs.close();

Pps.close();

con.close();

    1. JDBC工具类

“获得数据库连接”操作,将在以后的增删改查所有功能中都存在,可以封装工具类JDBCUtils。提供获取连接对象的方法,从而达到代码的重复利用。

该工具类提供两个方法:

获取连接

public static Connection getConn ()  

  关闭资源

public static void closeResource(ResultSet rs, PreparedStatement pst, Connection conn)

代码如下:

import java.sql.*;

public class JdbcUtils {

private static String driver = "com.mysql.jdbc.Driver";

private static String url = "jdbc:mysql://localhost:3306/day05pre";

private static String user = "root";

private static String password = "root";

static{

try {

//注册驱动

Class.forName(driver);

} catch (Exception e) {

throw new RuntimeException(e);

}

}

/**

 * 获得连接

 * @return

 * @throws SQLException

 */

public static Connection getConnection() throws  SQLException{

//获得连接

Connection conn = DriverManager.getConnection(url, user, password);

return conn;

}

/**

 * 释放资源

 * @param conn

 * @param st

 * @param rs

 */

public static void closeResource(Connection conn , PreparedStatement pst , ResultSet rs){

if(rs != null){

try {

rs.close();

} catch (SQLException e) {

}

}

if(pst != null){

try {

pst.close();

} catch (SQLException e) {

}

}

if(conn != null){

try {

conn.close();

} catch (SQLException e) {

}

}

}

}

    1. 使用工具类完成入门案例

/*

 * 使用工具类 完成 入门案例: 查询categroy所有数据

 * */

public void show() throws Exception{

//1.获取连接

Connection conn = JDBCUtils.getConn();

//2.书写SQL语句

String sql = "select *from category";

//3.获取SQL语句发射器

PreparedStatement pst = conn.prepareStatement(sql);

//4.发射SQL语句得到结果集

ResultSet rs = pst.executeQuery();

//5.处理结果集

while(rs.next()){

int cid = rs.getInt("cid");

String cname = rs.getString("cname");

System.out.println(cid+" : "+cname);

}

//6.关闭资源

JDBCUtils.closeResource(rs, pst, conn);

}

    1. JDBC增删改查操作
      1. API详解:预处理对象

preparedStatement:预编译对象,是Statement对象的子类。是SQL语句的发射器可以把SQL语句发送给数据库,并获取执行的结果。

特点:

性能高

会把sql语句先编译

能过滤掉用户输入的关键字。

PreparedStatement预处理对象,处理的每条sql语句中所有的活动数据,把活动数据使占位符?替换。格式类似如下格式

String sql = "select * from user where username = ? and password = ?";

有了这样的SQL语句之后 按照如下方式使用

PreparedStatement使用,需要通过以下3步骤完成:

  1. 通过链接拿到发射器对应:

#获得预处理对象,需要提供已经使用占位符处理后的SQL语句

PreparedStatement psmt = conn.prepareStatement(sql)

  1. 设置实际参数

void setXxx(int index, 数据类型xx) 将指定参数设置指定类型的值

参数1:index 要替换哪个占位符?,通过这个序号指定,从1开始。

参数2:xxx 活动数据的值用这个值替换占位符?

例如:

setString(2, "1234") 把SQL语句中第2个位置的占位符?替换成实际参数 "1234"

  1. 执行SQL语句:

int executeUpdate(); --执行insert update delete语句.

ResultSet executeQuery(); --执行select语句.

boolean execute(); --执行select返回true 执行其他的语句返回false.

数据准备:

创建一个student表,里面插入数据方便接下来的增删改查操作

#创建表

CREATE  TABLE student(

sid INT,

NAME VARCHAR(100),

age INT,

sex VARCHAR(100)

)

#插入数据

INSERT INTO student VALUES(1,'张三',18,'女'),(2,'李四',19,'男'),(3,'王五',20,'女'),(4,'赵六',21,'男')

      1. 查询详情

/**

 * 根据 性别 查询 学生信息

 * @throws Exception

 */

@Test

public void findStudent() throws Exception{

// 1.获取链接

Connection conn = JDBCUtils.getConn();

// 2. 书写SQL语句   获取发射器

String sql = "select * from student where sex = ?";

PreparedStatement pst = conn.prepareStatement(sql);

//设置第1个 ?为男

pst.setString(1, "男");

// 3. 执行 并处理结果集

ResultSet rs = pst.executeQuery();

while(rs.next()){

//分别获取各个字段的值

int sid = rs.getInt("sid");

int age = rs.getInt("age");

String name = rs.getString("name");

String sex = rs.getString("sex");

//显示结果

System.out.println("sid="+sid+" name="+name+" age="+age+" sex="+sex);

}

// 4. 关闭资源

JDBCUtils.closeResource(rs, pst, conn);

}

      1. 插入

/*

 *  插入一条数据:

 *   insert into student(sid,name,age,sex) values(5,'王大拿',18,'男')

 * */

public void insertData() throws Exception{

//1.获取连接

Connection conn = JDBCUtils.getConn();

//2.书写语句并 获取发射器

String sql = "insert into student(sid,name,age,sex) values(5,'王大拿',18,'男')";

PreparedStatement pst = conn.prepareStatement(sql);

//3.发射

int num = pst.executeUpdate();

//看一下结果

System.out.println("影响的行: "+num);

//4.关闭资源

JDBCUtils.closeResource(null, pst, conn);

}

      1. 更新

/*

 *  update

 * 把student表中的 张三性别改成男  

 * */

@Test

public void updateData() throws Exception{

//获取连接

 Connection conn = JDBCUtils.getConn();

//书写SQL语句

String sql = "update  student set sex= ? where name=?  ";

//获取发射器

PreparedStatement pst = conn.prepareStatement(sql);

// 把第1个?设置成男

pst.setString(1, "男");

// 把第2个 ? 设置成 张三

pst.setString(2, "张三");

//执行 查看结果

int num = pst.executeUpdate();

System.out.println("影响的行 : "+num);

//关闭资源

JDBCUtils.closeResource(null, pst, conn);

}

      1. 删除

/*

 *  删除sid是 2的用户  

 * */

public void deleteData() throws Exception{

//获取连接

Connection conn = JDBCUtils.getConn();

//书写sql语句

String sql = "delete from student where sid = ?";

//获取发射器

PreparedStatement pst = conn.prepareStatement(sql);

//设置数据 把 第1个?设置成2

pst.setInt(1, 2);

//发射

int num = pst.executeUpdate();

//查看影响的行

System.out.println("影响的行 : "+num);

//关闭资源

JDBCUtils.closeResource(null, pst, conn);

}

      1. 查询所有

/*

 * 查询所有

 *

 * */

public void findAll() throws SQLException{

// 1.获取链接

Connection conn = JDBCUtils.getConn();

// 2.书写SQL语句 获取发射器

String sql = "select * from student";

PreparedStatement pst = conn.prepareStatement(sql);

// 3.执行并处理结果集

ResultSet rs= pst.executeQuery();

while(rs.next()){

//分别获取各个字段的值

int sid = rs.getInt("sid");

int age = rs.getInt("age");

String name = rs.getString("name");

String sex = rs.getString("sex");

//显示结果

System.out.println("sid="+sid+" name="+name+" age="+age+" sex="+sex);

}

// 4.关闭资源

JDBCUtils.closeResource(rs, pst, conn);

}

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

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

相关文章

Java开发-后端请求成功,前端显示失败

文章目录 报错解决方案1. 后端未配置跨域支持2. 后端响应的 Content-Type 或 CORS 配置问题3. 前端 request 配置问题4. 浏览器缓存或代理问题5. 后端端口未被正确映射 报错 如下图,后端显示请求成功,前端显示失败 解决方案 1. 后端未配置跨域支持 …

Dify服务器部署教程

Dify的github地址: https://github.com/langgenius/dify 服务器要求:2c4g 1、克隆仓库 可以通过命令或者下载zip解压后上传服务器都行 git clone https://github.com/langgenius/dify.git 2、docker启动 cd dify/dockercp .env.example .envdocker compose up -d…

砝码称重(2021年蓝桥杯)

【问题描述】 你有一架天平和N个砝码,这N个砝码的重量依次是w1,w2,……,wn。(1~n为下标) 请你计算利用N个砝码一共可以称出多少种不同的重量? 【注意】砝码可以放在天平的两边 【输入格式】 第一行包含一个整数N。 第二行包含N个…

KaiOS 4.0 | DataCall and setupData implemention

相关文档 1、KaiOS 3.1 系统介绍 KaiOS 系统框架和应用结构(APP界面逻辑)文章浏览阅读842次,点赞17次,收藏5次。对于Java开发者而言,理解JS的逻辑调用是有点困难的。而KaiOS webapp开发又不同于现代的web开发,更像chrome浏览器内嵌模式。在这里梳理一下kaios平台web应用…

ArcGIS Pro地形图四至角图经纬度标注与格网标注

今天来看看ArcGIS Pro 如何在地形图上设置四至角点的经纬度。方里网标注。如下图的地形图左下角经纬度标注。 如下图方里网的标注 如下为本期要介绍的例图,如下: 图片可点击放大 接下来我们来介绍一下 推荐学习:GIS入门模型构建器Arcpy批量…

win系统B站播放8k视频启用HEVC编码

下载HEVC插件 点击 HEVC Video Extension 2.2.20.0 latest downloads,根据教程下载安装 安装 Random User-Agent 点击 Random User-Agent 安装 配置 Random User-Agent 在youtube中会导致视频无法播放,我选择直接屏蔽了 B站设置

mysql锁机制以及隔离级别下保证并发安全的方式

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 mysql锁机制以及隔离级别下保证并发安全的方式 多事务并发执行可能出现的问题mysql有那些锁全局锁表级锁行锁 在不同的隔离级别下mysql保证并发安全的方式RU隔离级别RC隔离级…

qwenvl 以及qwenvl 2 模型架构理解

qwenvl 模型理解: 参考资料: https://qwenlm.github.io/zh/blog/qwen2-vl/ https://github.com/QwenLM/Qwen2-VL?tabreadme-ov-file https://qwenlm.github.io/zh/blog/qwen2-vl/ 论文: qwenvl https://arxiv.org/abs/2308.12966 Qwen2-VL …

高效使用AI完成编程项目任务的指南:从需求分析到功能实现

随着人工智能工具的普及,即便是零编程基础或基础薄弱的用户,也可以借助AI完成许多技术任务。然而,要高效地使用AI完成编程任务,关键在于如何清晰表达需求,并逐步引导AI实现目标。 在本文中,我们将通过开发…

AI生成视频字幕--VideoCaptioner/卡卡字幕助手

github: https://github.com/WEIFENG2333/VideoCaptioner 123云盘:https://www.123865.com/s/inrnjv-1sk6H提取码:4455 B站教程:https://www.bilibili.com/video/BV1giBqYtEqG?vd_source8e73ffa42accf9446f3cb7fddc85b38c 优点:1.免费&am…

嵌入式单片机窗口看门狗控制与实现

窗口看门狗 注意:WWDG外设没有独立的时钟源,而是挂载在APB1总线下,APB1总线外设时钟为42MHZ。 了解WWDG外设的使用流程,可以参考stm32f4xx_wwdg.c的开头注释,具体流程如下图所示

从 ELK Stack 到简单 — Elastic Cloud Serverless 上的 Elastic 可观察性

作者:来自 Elastic Bahubali Shetti, Chris DiStasio 宣布 Elastic Cloud Serverless 上的 Elastic Observability 正式发布 — 一款完全托管的可观察性解决方案。 随着组织规模的扩大,一个能够处理分布式云环境的复杂性并提供实时洞察的可观察性解决方…

【教程】通过Docker运行AnythingLLM

转载请注明出处:小锋学长生活大爆炸[xfxuezhagn.cn] 如果本文帮助到了你,欢迎[点赞、收藏、关注]哦~ 官方教程:Local Docker Installation ~ AnythingLLM 1、先创建一个目录用于保存anythingllm的持久化文件: sudo mkdir /app su…

RabbitMQ基础篇之快速入门

文章目录 一、目标需求二、RabbitMQ 控制台操作步骤1.创建队列2.交换机概述3.向交换机发送消息4.结果分析5.消息丢失原因 三、绑定交换机与队列四、测试消息发送五、消息查看六、结论 一、目标需求 新建队列:创建 hello.queue1 和 hello.queue2 两个队列。消息发送…

Lottie动画源码解析

Lottie是一个很成熟的开源动画框架,它支持直接使用从AE导出的动画文件,在不同平台均可快速使用,大大减轻了程序员的工作量,也让复杂的动画成为可能。该动画文件使用Json格式来描述内容,可以大大缩减文件的体积。在Andr…

手机发烫怎么解决?

在当今这个智能手机不离手的时代,手机发烫成了不少人头疼的问题。手机发烫不仅影响使用手感,长期过热还可能损害手机硬件、缩短电池寿命,甚至引发安全隐患。不过别担心,下面这些方法能帮你有效给手机 “降温”。 一、使用习惯方面…

win10、win11-鼠标右键还原、暂停更新

系统优化 win 10jihuo win 11jihuo鼠标右键还原暂停更新 update 2024.12.28win 10 jihuo winx,打开powershell管理员,输入以下命令,选择1并等待 irm https://get.activated.win | iex参考:https://www.bilibili.com/video/BV1TN411M72J/?sp…

Android 学习小记1

目录 先介绍一下Android Studio 看看常见的模板 1. No Activity 2. Empty Activity 3. Gemini API Starter 4. Basic View Activity 5. Bottom Navigation Activity 6. Empty Views Activity 7. Navigation Drawer Views Activity 8. Responsive Views Activity 9. G…

uniapp使用ucharts组件

1.ucharts准备 有两种使用方式:一种是在uni的插件市场下载(组件化开发)。一种是手动引入ucharts包。官方都封装好组件了,我们不用岂不是浪费。 直接去dcloud插件市场(DCloud 插件市场)找,第一…

mybatis-plus自动填充时间的配置类实现

mybatis-plus自动填充时间的配置类实现 在实际操作过程中,我们并不希望创建时间、修改时间这些来手动进行,而是希望通过自动化来完成,而mybatis-plus则也提供了自动填充功能来实现这一操作,接下来,就来了解一下mybatis…