JDBC(常用类与接口、实现数据库的增删查改)

news2024/12/24 4:04:08

 

目录

1.Connection接口常用方法

2.DriverMange类

 3.Statement接口

4.实现表的数据更新(增、改、删)

 5.实现数据查找(ResultSet接口)

 6.PreparedStatement 数据更新


1.Connection接口常用方法

用来与数据库连接的对象,只有获得了特定的数据库对象才能对数据库进行操作

方法描述
createStatement()创建一个 Statement 对象,用于执行 SQL 语句。
createStatement(int resultSetType,int resultSetConcurrency)根据给定的结果集类型和并发性创建一个 Statement 对象,用于执行 SQL 语句。
prepareStatement()创建一个 PreparedStatement 对象,用于执行带有参数的 SQL 语句。
isReadOnly()返回一个布尔值,指示数据库连接是否为只读模式。
setReadOnly()设置数据库连接的只读模式,以指示是否允许修改数据库。
commit()提交当前事务中所有挂起的更改。
rollback()回滚当前事务中的所有挂起的更改。
close()关闭数据库连接。

2.DriverMange类

这个类主要包含和数据库的交互方法

方法描述
getConnection(String url, String user, String password)获取与指定数据库的连接。传入数据库的URL、用户名和密码作为参数。
setLogonTimeout()设置在尝试连接到数据库时等待的最长时间,超过该时间将引发异常。
println(String message)打印消息到控制台或日志文件中。用于调试和记录信息。

案例代码:数据库的连接(基于MySQL)

数据库的连接与关闭

package com.company;

import java.sql.Connection;
import java.sql.DriverManager;

public class Main {
    public static void main(String[] args){
         final String DATABASE_DRIVER = "com.mysql.cj.jdbc.Driver";
         final String DATABASE_URL="jdbc:mysql://localhost:3306/mysqltest";
         final String DATABASE_USER ="mysql";
         final String DATABASE_PASSWORD ="xxxxxx";

        Connection conn = null;
         try {
//             通过反射加载mysql驱动
             Class.forName(DATABASE_DRIVER);
//             建立连接
              conn = DriverManager.getConnection(DATABASE_URL,DATABASE_USER,DATABASE_PASSWORD);
//             输出连接对象信息
             System.out.println(conn);
//             关闭连接
             conn.close();
         }catch (Exception e){
             e.printStackTrace();
         }
    }
}

 


 3.Statement接口

该接口是java执行数据库的重要操作,在建立完成数据库连接的基础上,向数据库发送需要执行的SQL的语句

方法描述
execute(String sql)执行给定的 SQL 语句,返回一个布尔值表示是否执行成功。
executeQuery(String sql)执行给定的查询 SQL 语句,返回一个结果集 ResultSet 对象。
clearBatch()清除该 Statement 对象当前设置的批处理命令。
addBatch(String sql)将 SQL 语句添加到当前的批处理中。
close()关闭 Statement 对象。任何打开的结果集也将关闭。

1.在案例操作前先确保建立好一个列表

这里通过Datadrip工具也可以用其他的工具比如DBeaver、Navica可以t快速根据需求自动生成sql脚本,也可以通过sql语句自行创建。

创建一个Person表,定义了姓名,年龄,身份证,名族。并且设置了身份证为唯一的主码并且是唯一的。

具体sql语句如下:

create table Person
(
	name varchar(4) not null comment '姓名',
	age int null comment '年龄',
	ID int null comment '身份证',
	nation varchar(4) null comment '民族'
);

create unique index Person_ID_uindex
	on Person (ID);

alter table Person
	add constraint Person_pk
		primary key (ID);

4.实现表的数据更新(增、改、删)

 案例实现:实现插入sql信息

插入信息

姓名:王二  年龄:18 身份id:001 民族:汉族

SQL代码案例:

insert into person(name, age, ID, nation) VALUE ('王二',18 ,001 ,'汉族');

那么搭配JDBC实现数据库中表的插入代码如下:

package JavaWeb02;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.Statement;

public class javaDemo {
    public static void main(String[] args)throws Exception {
        final String DATABASE_DRIVER = "com.mysql.cj.jdbc.Driver";
        final String DATABASE_URL="jdbc:mysql://localhost:3306/mysqltest";
        final String DATABASE_USER ="mysql";
        final String DATABASE_PASSWORD ="xxxxxx";

        String sql = "insert into person(name, age, ID, nation) VALUE ('王二',18 ,001 ,'汉族')";
//        加载驱动
        Class.forName(DATABASE_DRIVER);
//        建立连接
        Connection conn = null;
        conn = DriverManager.getConnection(DATABASE_URL,DATABASE_USER,DATABASE_PASSWORD);
//        创建数据库操作对象
        Statement statement = conn.createStatement();
        int count = statement.executeUpdate(sql);
        System.out.println("更新行数"+count);
//      关闭数据库连接
        conn.close();
    }
}

 

在数据库中查询可以看到,确实是插入成功了

 已经会了插入就可以尝试其他操作,比如数据删除,数据修改等等只需要把sql内容改一下就行了

案例:数据修改

package JavaWeb03;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.Statement;

public class javaDemo {
    public static void main(String[] args) throws Exception{
        final String DATABASE_DRIVER = "com.mysql.cj.jdbc.Driver";
        final String DATABASE_URL="jdbc:mysql://localhost:3306/mysqltest";
        final String DATABASE_USER ="mysql";
        final String DATABASE_PASSWORD ="xxxxxx";

        String sql = "update person set name='黄小龙',age=99 where name='王二'";
//        加载驱动
        Class.forName(DATABASE_DRIVER);
//        建立连接
        Connection coon = null;
        coon = DriverManager.getConnection(DATABASE_URL,DATABASE_USER,DATABASE_PASSWORD);
//        创建数据库操作对象
        Statement statement = coon.createStatement();
        System.out.println("更新的行数"+statement.executeUpdate(sql));
        coon.close();
    }
}

案例:数据删除

package JavaWeb04;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.Statement;

public class javaDemo {
    public static void main(String[] args) throws Exception{
        final String DATABASE_DRIVER = "com.mysql.cj.jdbc.Driver";
        final String DATABASE_URL="jdbc:mysql://localhost:3306/mysqltest";
        final String DATABASE_USER ="mysql";
        final String DATABASE_PASSWORD ="xxxxxxx";
//        想要执行的sql语句
        String sql ="delete from person where name='王二'";

//        加载驱动
        Class.forName(DATABASE_DRIVER);
//        连接数据库
        Connection conn = null;
        conn = DriverManager.getConnection(DATABASE_URL,DATABASE_USER,DATABASE_PASSWORD);
//        创建数据库操作对象
        Statement statement = conn.createStatement();
        statement.executeUpdate(sql);
//        关闭连接
        conn.close();
    }
}

 5.实现数据查找(ResultSet接口)

数据查询返回的值需要用ResultSet接口进行封装

 以下是接口ResultSet接口的常用方法:

方法名描述
next()将游标移动到结果集中的下一行,并返回是否还有更多行可用的布尔值。在循环中逐行处理结果集时使用。
getXxx(int columnIndex)根据列的索引获取当前行指定列的数据。columnIndex是从1开始计数的列索引。getXxx代表具体的数据类型,如getInt、getString等。返回指定列的数据,可以进行类型转换。
getXxx(String columnLabel)根据列的名称获取当前行指定列的数据。columnLabel是列的字符串形式名称。类似于getXxx(int columnIndex)方法,返回指定列的数据。
close()关闭结果集,释放与结果集相关的资源。在不再需要访问结果集时,应该调用此方法来关闭结果集,以便及时释放资源。

数据查询案例:

数据库内容:

 案例代码:

package JavaWeb05;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.Statement;

public class javaDemo {
    public static void main(String[] args)throws Exception {
        final String DATABASE_DRIVER = "com.mysql.cj.jdbc.Driver";
        final String DATABASE_URL="jdbc:mysql://localhost:3306/mysqltest";
        final String DATABASE_USER ="mysql";
        final String DATABASE_PASSWORD ="xxxxxxx";
        String sql = "select name, age, ID, nation from person";

//        加载驱动
        Class.forName(DATABASE_DRIVER);
//        建立连接
        Connection conn = null;
        conn = DriverManager.getConnection(DATABASE_URL,DATABASE_USER,DATABASE_PASSWORD);
//        创建操作对象,并且对象使用的是执行查找语句的方法
        Statement statement = conn.createStatement();
        ResultSet rs = statement.executeQuery(sql);
//        需要按照定义的类型进行接收
        while (rs.next()){
            String name = rs.getString("name");
            int age = rs.getInt("age");
            int id = rs.getInt("id");
            String nation = rs.getString("nation");
            System.out.println("name="+name+" age="+age+" id="+id+" nation="+nation);
        }

//        退出连接
        conn.close();
        rs.close();
    }
}


 6.PreparedStatement 数据更新

问题引入:如果要正常插入数据并且使用statement接口则代码会如下:

package JavaWeb06;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.Statement;

public class javaDemo {
    public static void main(String[] args)throws  Exception {
        final String DATABASE_DRIVER = "com.mysql.cj.jdbc.Driver";
        final String DATABASE_URL="jdbc:mysql://localhost:3306/mysqltest";
        final String DATABASE_USER ="mysql";
        final String DATABASE_PASSWORD ="xxxxxx";

        String name ="汪心";
        int id = 100;
        String nation = "汉族";
        int age = 32;

        String sql = "insert into person(name, age, ID, nation)VALUE("+name+","+age+","+id+","+nation+")";
        
//        加载驱动
        Class.forName(DATABASE_DRIVER);
//        连接
        Connection conn = null;
        conn = DriverManager.getConnection(DATABASE_URL,DATABASE_USER,DATABASE_PASSWORD);
//        创建数据操作对象
        Statement statement = conn.createStatement();
        statement.executeUpdate(sql);
//        关闭对象
        conn.close();
    }
}

可以看到,如果用statement接口,那么会需要一个完整的sql语句,而sql语句需要通过拼接起来,非常麻烦,所以引入了PreparedStatement

Preparedstatement的常用方法如下:

方法描述
executeUpdate()执行 INSERT、UPDATE 和 DELETE 等更新操作,并返回更新的行数。
executeQuery()执行 SELECT 查询操作,并返回结果集。
setXxx(index, value)通过索引设置参数值,其中 Xxx 表示数据类型,如 setIntsetString 等。
setXxx(parameterName, value)通过参数名设置参数值,其中 Xxx 表示数据类型,如 setIntsetString 等。
setNull(index, dataType)设置参数为空值。
getGeneratedKeys()获取生成的键。

Preparedstatement与Statement相比在编写sql语句的时候可以用"?"进行占位符的设计,在通过conn.prepareStatement(sql语句)创建对象时候,将sql作为参数传入进去,对于每一位的?占位符都可以通过对象.set类型(第几个占位符,类型值)

以下案例代码实现通过Preparedstatement向数据库插入一条数据

插入案例代码:

package JavaWeb07;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;

public class javaDemo {
    public static void main(String[] args)throws Exception {
        final String DATABASE_DRIVER = "com.mysql.cj.jdbc.Driver";
        final String DATABASE_URL="jdbc:mysql://localhost:3306/mysqltest";
        final String DATABASE_USER ="mysql";
        final String DATABASE_PASSWORD ="xxxxxx";

        String name ="汪心";
        int id = 100;
        String nation = "汉族";
        int age = 32;
        String sql ="insert into person(name, age, ID, nation)VALUES"+"(?,?,?,?)";

//        加载驱动
        Class.forName(DATABASE_DRIVER);
//        建立连接
        Connection conn = null;
        conn = DriverManager.getConnection(DATABASE_URL,DATABASE_USER,DATABASE_PASSWORD);
//        创建数据操作对象
        PreparedStatement preparedStatement = conn.prepareStatement(sql);
        preparedStatement.setString(1,name);
        preparedStatement.setInt(2,age);
        preparedStatement.setInt(3,id);
        preparedStatement.setString(4,nation);

        int count = preparedStatement.executeUpdate();
        System.out.println("本次更新的行数"+count);
//        关闭连接
        conn.close();

    }
}

 

案例 数据查询:

package JavaWeb08;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;

public class javaDemo {
    public static void main(String[] args)throws  Exception {
        final String DATABASE_DRIVER = "com.mysql.cj.jdbc.Driver";
        final String DATABASE_URL="jdbc:mysql://localhost:3306/mysqltest";
        final String DATABASE_USER ="mysql";
        final String DATABASE_PASSWORD ="xxxxxxx";

        String sql ="select name, age, ID, nation from person";
        //        加载驱动
        Class.forName(DATABASE_DRIVER);
//        建立连接
        Connection conn = null;
        conn = DriverManager.getConnection(DATABASE_URL,DATABASE_USER,DATABASE_PASSWORD);
//        创建数据操作对象
        PreparedStatement preparedStatement = conn.prepareStatement(sql);
        ResultSet rs = preparedStatement.executeQuery();
        while (rs.next()){
//            ResultSet通过占位符的位置获取信息
            String name = rs.getString(1);
            int age  = rs.getInt(2);
            int id = rs.getInt(3);
            String nation = rs.getString(4);
            System.out.println("name="+name+" age="+age+" id="+id+" nation="+nation);
        }
//        关闭连接
        conn.close();
        rs.close();
    }
}

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

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

相关文章

66 # form 数据格式化

实现一个 http 服务器 客户端会发送请求 GET POST 要处理不同的请求体的类型 表单格式(formData a1&b2),可以直接通信不会出现跨域问题JSON ("{"kaimo":"313"}")文件格式 &#x…

刚刚更新win11,记事本消失怎么处理?你需要注意些什么?

记录window11的bug hello,我是小索奇 昨天索奇从window10更新到了window11,由于版本不兼容卸载了虚拟机,这是第一个令脑壳大的,算了,还是更新吧,了解了解win11的生态,后期重新装虚拟机 第一个可…

uniapp scroll-view 隐藏滚动条

/*清除滚动条 - 适配安卓*/::-webkit-scrollbar {width: 0;height: 0;color: transparent;}/*清除滚动条 - 适配IOS*/::-webkit-scrollbar {display: none;}

前端项目时因chunk-vendors过大导致首屏加载太慢,Vue Build时chunk-vendors的优化方案...

1、compression-webpack-plugin插件打包.gz文件 安装插件 也可以指定版本 我这里下载的是1.1.2版本的,试过更高的版本会有ES6语法的报错,因为我node使用的是v12,如果node版本更高可以尝试更高版本 npm install --save-dev compression-webpa…

day14 引用数组类型

向上造型 计算机 编译过程 和运行过程 Pet pet new Cat(); 图中 pet.eat()为父类构造方法 、 pet.catchMouse()为子类方法 向上造型构成对象不能调用子类独有方法 出现方法重写会调用子类方法 向下造型 Cat cat1 (Cat)new Pet 这种形式错误…

FortiGate防火墙日志审计运维

环境介绍 CPU:8核,内存:16GB,硬盘:100GB 操作系统版本:CentOS-7-x86_64-DVD-2003 平台版本:鸿鹄2.7.0 安装组件 安装环境支持确认 鸿鹄计算引擎使用了 AVX2 高级指令集做向量计算加速&#xf…

Python SQLAlchemy ( ORM )

From Python中强大的通用ORM框架:SQLAlchemy:https://zhuanlan.zhihu.com/p/444930067Python ORM之SQLAlchemy全面指南:https://zhuanlan.zhihu.com/p/387078089 SQLAlchemy 文档:https://www.sqlalchemy.org/ SQLAlchemy入门和…

STM32F103——GPIO八种工作模式

目录 1、GPIO 基本结构分析 2、GPIO 八种工作模式 2.1 输入浮空 2.2 输入上拉 2.3 输入下拉 2.4 模拟功能 2.5 开漏输出 2.6 开漏式复用功能 2.7 推挽输出 2.8 推挽式复用功能 3、GPIO 八种工作模式特点及应用 1、GPIO 基本结构分析 STM32F103的 GPIO 工作有八种…

Vue.js2+Cesium1.103.0 七、Primitive 绘制航线元素

Vue.js2Cesium1.103.0 七、Primitive 绘制航线元素 用 Primitive 绘制航线元素,包括航点图标,航线线段,线段距离标注,航点序号,海拔标注,总航程等信息。 可同时绘制多条航线;可根据 id 清除指…

【LeetCode】数据结构题解(11)[用队列实现栈]

用队列实现栈 😉 1.题目来源👀2.题目描述🤔3.解题思路🥳4.代码展示 所属专栏:玩转数据结构题型❤️ 🚀 >博主首页:初阳785❤️ 🚀 >代码托管:chuyang785❤️ &…

PHP最简单自定义自己的框架定义常量自动生成目录(三)

1、框架入口增加模块定义&#xff0c;实现多模块功能 index.php 定义模块 <?php //定义当前请求模块 define("MODULE",index); require "./core/KJ.php"; 创建后台模块admin.php <?php define("MODULE",admin); require "./cor…

在家构建您的迷你聊天Chat gpt

推荐&#xff1a;使用 NSDT场景编辑器 助你快速搭建可编辑的3D应用场景 什么是指令遵循模型&#xff1f; 语言模型是机器学习模型&#xff0c;可以根据句子的前一个单词预测单词概率。如果我们向模型请求下一个单词&#xff0c;并将其递减地反馈给模型以请求更多单词&#xff…

《Linux运维实战:Docker基础总结》

一、简介 1、docker的基本结构是什么&#xff0c;包含哪些组件&#xff1f; docker的基本机构是c/s模式&#xff0c;即客户端/服务端模式。 由docker客户端和docker守护进程组成。docker客户端通过命令行或其它工具使用docker sdk与docker守护进程通信&#xff0c;发送容器管理…

SaaS系统相比传统软件,为何数据更安全?

随着云计算、5G等技术的不断进步&#xff0c;SaaS行业步入了快速发展的阶段&#xff0c;应用场景也日趋多元化。预计2023年底&#xff0c;中国SaaS行业市场规模将达到555.1亿元。 中研网对于SaaS发展态势预测这样评价&#xff1a; 当前&#xff0c;我国在多个维度上具备发展 S…

Mysql主从搭建 基于DOCKER

创建目录 #主节点目录 mkdir -p /home/data/master/mysql/#从节点目录 mkdir -p /home/data/slave/mysql/创建配置文件 # 主节点配置 touch /home/data/master/mysql/my.cnf# 从节点配置 touch /home/data/slave/mysql/my.cnf编辑配置文件 主节点配置文件 vim /home/data/m…

【ChatGPT】自我救赎

ChatGPT辅助学习C之【在C中如果大数据类型转小数据类型会发生什么呢?】&#xff0c;今天问ChatGPT一个问题&#xff0c;让它解析下面这个C程序&#xff1a; #include <iostream> #include <cstdio> using namespace std; int main() {int a;long long b532165478…

haproxy基本编译环境部署

前提&#xff1a;haproxy支持基于lua实现功能扩展&#xff08;需要安装比较新的lua语言&#xff0c;方便进行haproxy编译&#xff09;。 wget http://www.lua.org/ftp/lua-5.3.5.tar.gz lua -v # 检查环境 yum list lua # 查看可以安装环境 同时还需要gcc&#xff0c;gcc-c&…

rocketMq消息队列详细使用与实践整合spring

文章目录 一、RocketMQ原生API使用1、测试环境搭建2、RocketMQ的编程模型3、RocketMQ的消息样例3.1 基本样例3.2 顺序消息3.3 广播消息3.4 延迟消息3.5 批量消息3.6 过滤消息3.7 事务消息3.8 ACL权限控制 二、SpringBoot整合RocketMQ1、快速实战2、其他更多消息类型&#xff1a…

CSS实现图像填充文字

效果如下 具体代码&#xff1a; <!DOCTYPE html> <html><head><meta charset"utf-8"><title>CSS图像填充文字</title><style>.text {background-image: url(./imgs/1.webp);/* 一定要让背景透明&#xff0c;这样后面的背…

Linux使用mount挂载

authordaisy.skye的博客_CSDN博客-嵌入式,Qt,Linux领域博主 格式化分区 sudo mkfs -t ext4 /dev/mmcblk0p1 格式化分区 实际使用中推荐这个&#xff0c;它是 mkfs 命令的个变种&#xff0c;可以自动识别文件系统类型为 ext4&#xff0c;并使用 ext4 文件系统的默认参数来创建…