JDBC操作数据库实现增、删、查、改

news2025/1/20 1:05:43

0.JDBC概念

实际开发中,手动的输入SQL语句是少之又少,大多数情况下是通过编译代码进行来控制自动执行.

具体操作如下:

在这里插入图片描述

上述展示有一个【自己写的Mysql客户端】,这种操作是非常容易的,因为各种数据库本身就提供一系列的API,可以让用户很方便的实现这个客户端。**显然MySQl提供的有API(Application Programming Interface )Java也提供了一些API 这些API 提供了一些类和方法,通过这些类和方法可以进行一系列操作,比如操作硬盘的文件,进行增删查改,操作数据库等 **。不同的数据库提供的API是不相同的,于是由于不同的数据库有不同的API,一旦使用不同的数据库就需要重新学习API。这时候就有Java大佬出了一个JDBC这一套API来适配不同的数据库,不同数据库就需要提供能适应JDBC相关的“驱动包”。这也就表示JDBC规范了所有数据库的编程操作。

JDBC: 约定了有哪些API,具体怎么用。

驱动包: API的具体实现。

1. 数据库连接 Connection

  • 通过DriverManager(驱动管理类)的静态方式获取
//加载jdbc驱动程序
Class.forName("com.mysql.jdbc.Driver");
//创建数据库连接
Connection connection1 = DriverManager.getConnection("jdbc:mysql://127.0.0.1:3306/Class?characterEncoding=utf8&useSSL=false")

  • 通过DataSource(数据源)对象获取.实际开发中会使用DataSource对象
 DataSource dataSource = new MysqlDataSource();
        ((MysqlDataSource)dataSource).setUrl("jdbc:mysql://127.0.0.1:3306/Class?characterEncoding=utf8&useSSL=false");
((MysqlDataSource)dataSource).setUser("root");
((MysqlDataSource)dataSource).setPassword("123456");
  • 以上两种方式的区别是:
    1. DriverManager类来获取的Connection连接,是无法重复利用的,每次使用完以后释放资源时,通过connection.close()都是关闭物理连接。
    2. DataSource提供连接池的支持。连接池在初始化时将创建一定数量的数据库连接,这些连接是可以复用的,每次使用完数据库连接,释放资源调用connection.close()都是将Conncetion连接对象回收。

2.Statement 对象

statement对象主要将SQL语句发送到数据库中,JDBC API中主要提供了三种Statement对象.

  1. statement : 用于执行不带参数的简单sql语句

  2. PrepareStatement:

    a)用于执行带参或者不带参数的sql语句.

    b)SQL语句会预编译在数据库系统.

    c)执行速度快于Statement对象.

  3. CallableStatement:用于执行数据库存储过程的调用.

强调PrepareStatement:

1.可以参数化SQL查询.

2.性能比Statement高.

3.预编译SQL.

4.阻止常见的SQL注入攻击.(黑客…)

5.占位符:?(下标从1开始)

6.占位符不能使用多值.

7.主要掌握两种执行SQL方法:

a).executeQuery()方法执行后返回单个结果集,通常用于select语句.

b).executeUpdate()方法返回值是一个整数,表示受影响的行数,通常用于update,insert,delete,语句.

3.ResultSet对象

ResultSet对象它被称为结果集,它代表符合SQL语句条件的所有行,并且它通过一套getXXX()方法提供了对这些行中数据的访问.

ResultSet里的数据一行一行的排列,每行有多个字段,并且有一个记录指针,指针所指的数据行叫做当前数据行,我们只能来操作当前的数据行,如果想要取得某一行记录,需要使用ResultSet的next()方法,获取当前数据行,要想得到具体列,就需要使用getXXX()方法;如果需要得到ResSet里的所有记录,就要使用while循环.

4.使用JDBC操作MySQL

【idea导入MySQL驱动包教程】

咱先来看看JDBC是如何操作的:(抽象画家)

通过JDBC使用不同的数据库,JDBC会调用相对应的数据库的“驱动包”,来和数据库的服务器进行交互。

在这里插入图片描述

4.1 插入-删除-修改

  1. 创建数据库源

在使用之前,需要提前准备好数据库和数据表

打开Mysql客户端,创建一个Class数据库,创建一个student表,字段:id,姓名.


import com.mysql.jdbc.jdbc2.optional.MysqlDataSource;
import javax.sql.DataSource;
//1.创建数据源..javax.sql底下的DataSource

DataSource dataSource = new MysqlDataSource();//向上转型,这样避免后期换服务器需要到处修改代码

//2.说明数据库服务器在哪里,向下转型
((MysqlDataSource)dataSource).setUrl("jdbc:mysql://127.0.0.1:3306/Class?characterEncoding=utf8&useSSL=false");
//3.设置用户名和密码  我默认的是“root”  密码是“123456”
((MysqlDataSource)dataSource).setUser("root");
((MysqlDataSource)dataSource).setPassword("123456");
  • DataSource内置了数据量连接池,可以重复利用.
  • MysqlDataSource();这是驱动包,里面提供了具体的类。
  • setUrl()里写的内容,直接复制粘贴就行,除了class要换成你自己需要连接的数据库名。url是给JDBC中的mysql使用的。
  • 你的数据库用户名是什么就写什么,自己设置的密码是什么就写什么。

在这里插入图片描述

  1. 建立数据库连接
//建立连接
import java.sql.Connection;
Connection connection = dataSource.getConnection();
  • Connection :选择java.sql.Connection包。

  • getConnection():需要处理受查异常。

    a)受查异常:必须要显示处理;

    b)非受查异常:可以忽略

  1. 构造SQL语句-插入数据
//1.构造语句
//写法1
String sql = "insert into student values(1,‘张三’)";
//2.在JDBC中需要搭配一个特定的对象,来描述sql的情况
PreparedStatement preparedStatement = connection.prepareStatement(sql);

  • 使用占位符替换:实现动态sql语句构造

//写法2:
 Scanner scanner = new Scanner(System.in);
int id = scanner.nextInt();//输入学号  -> 1
String name = scanner.nextLine();//输入姓名 ->"李四"
 String sql = "insert into student values(?,?)";//注释1
 PreparedStatement preparedStatement = connection.prepareStatement(sql);
 preparedStatement.setInt(1,id);//注释2
 preparedStatement.setString(2,name);//注释3
  • 注意:name输入"李四",如果报错,大概率是字符集不是utf8
  • 注释1处:(?,?),问号表示通配符(占位符),可以自己输入[输入的字段,类型要配对]
  • 注释2处:设置从左开始数,第一个问号,下标为1,使用setInt()把id设置为1.
  • 注释2处:设置第二个问号,下标为2,使用setString()把名字设置为"李四";
  • sql语句是先构造,再执行的,不管是否使用了通配符(占位符).
  1. 执行SQL语句
 int ret = preparedStatement.executeUpdate();
  • executeUpdate();返回结果是:操作在数据库表里影响了几行.
  • 针对增,删,改,使用executeUpdate();针对使用executeQuery().这些操作跟插入操作的代码几乎相同,修改sql语句,再修改preparedStatement调用的方法就可以了
  • executeQuery()返回的是一个查询的结果集,用ResultSet
  1. 断开连接,释放资源
preparedStatement.close();
connection.close();
  • 注意: 释放资源是从后往前释放.

  • 最后创建的preparedStatement,就最先释放.

  • 最先创建的connection,最后释放.

  • 完整版insert代码

    public static void main(String[] args) throws SQLException {
        //1.创建数据源
        DataSource dataSource = new MysqlDataSource();
        ((MysqlDataSource)dataSource).setUrl("jdbc:mysql://127.0.0.1:3306/Class?characterEncoding=utf8&useSSL=false");
        ((MysqlDataSource)dataSource).setUser("root");
        ((MysqlDataSource)dataSource).setPassword("123456");
        //2.手动输入id name
        Scanner scanner = new Scanner(System.in);
        int id = scanner.nextInt();
        String name = scanner.nextLine();
        //3.连接
        Connection connection = dataSource.getConnection();
        //4.构造
        String sql = " insert into student values (?,?)";
        //5.执行
        PreparedStatement preparedStatement = connection.prepareStatement(sql);
        preparedStatement.setInt(1,id);//id
        preparedStatement.setString(2,name);//name
       
        System.out.println("sql:"+preparedStatement);//返回一个修改执行后的sql语句
        //执行
        int ret = preparedStatement.executeUpdate();
        //关闭资源
        preparedStatement.close();
        connection.close();;

    }

4.2 查找

public class Demo1 {
    public static void main(String[] args) throws SQLException {
        //1.先创建数据源
        DataSource dataSource = new MysqlDataSource();
        ((MysqlDataSource)dataSource).setUrl("jdbc:mysql://127.0.0.1:3306/Class?characterEncoding=utf8&useSSL=false");
        ((MysqlDataSource)dataSource).setUser("root");
        ((MysqlDataSource)dataSource).setPassword("123456");

        //2.连接数据库
        Connection connection = dataSource.getConnection();

        //3.构造sql
        String sql = "select * from student";
		//可以其他加入限制条件
		//String sql = "select * from student where id = 1";
		
        //4.执行sql
        PreparedStatement preparedStatement = connection.prepareStatement(sql);

        //5.注意 这里返回的是一个结果结合
        //注意这次调用的是executeQuery()
        ResultSet resultSet = preparedStatement.executeQuery();

        //6.循环遍历每一行记录
        //next(): 只要存在下一行就取出当前一行
        while(resultSet.next()){
            int id = resultSet.getInt("id");
            String name = resultSet.getString("name");
            
            System.out.println("id = "+ " name");
        }
 		resultSet.close();
        preparedStatement.close();
        connection.close();

    }
}

  • 查询调用的是executeQuery(),返回的是一个结果集,用 ResultSet对象接收.
  • resultSet.next(): 取出当前一行数据;如果指向了结尾,则返回false;
  • 使用getXX方法获得具体列;
  • 方法里的参数就是数据表里的列名,注意如果你在查询时,取了别名,这里也要用别名
  • 可以写多条sql语句,但是每条语句执行,都要重新创建一个PreparedStatement对象,进行执行.
  • 在这写的sql语句,和数据库里的语句是相同的,比如加入限制条件where order by…

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

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

相关文章

wordpress 安装主题显示要配置FTP的解决办法

目录 问题复现 1、在安装插件的时候会弹出一个窗口 2、输入相关信息后显示失败 问题解决方法 1、查看wordpress文件权限 2、修改wordpress文件权限 3、插件安装完后,将权限改回 场景:基于Linux 的 wordpress 安装主题显示要配置FTP 安装插件或者主…

RegExp 对象

文章目录RegExp 对象创建RegExp对象正则表达式语法RegExp 对象方法支持正则表达式的 String 对象的方法RegExp.prototype[search]()replace() 方法match()常用正则表达式RegExp 对象 RegExp对象表示正则表达式,是由普通字符和特殊字符(也叫元字符或限定符)组成的文…

基于节点分层的配网潮流前推回代方法matlab程序(IEEE33节点潮流计算)

基于节点分层的配网潮流前推回代方法matlab程序(IEEE33节点潮流计算) 摘要:结合配电网特有的辐射状特点,提出了一种新的基于节点分层的配网潮流前推回代方法。该方法利用配网支路及其节点参数所形成的节点-节点关联矩阵推导出节点…

MiniAlphaGo黑白棋 蒙特卡洛搜索

做个笔记。 一、蒙特卡洛在黑白棋的应用 输入:棋盘𝑏𝑜𝑎𝑟𝑑、当前执子方𝑐𝑜𝑙𝑜𝑟、搜索时间𝑡𝑖𝑚&#x…

小米平板5ProWIFI(elish)刷ArrowOS

文章目录警告下载奇兔刷机系统本体及Recovery清除数据刷入AospRec开始刷入警告完成设置输入法变砖头了qwq又是警告芝士截图Root方法结尾警告 此文章只针对 小米平板5Pro Wifi版本(elish) 由于条件限制,本文大部分无配图 请务必仔细认真阅读此…

Airflow用于ETL的四种基本运行模式, 2022-11-20

(2022.11.20 Sun) 基本运行模式(pattern)是data pipeline使用Airflow的DAG的不同结构,基本模式有如下四种 : 序列Sequence平行拆分Parallel split同步Synchronisation单选Exclusive choice 序列模式 序列模式即若干task按先后顺序依次执行,…

中远通在创业板IPO过会:前三季度收入11亿元,罗厚斌为董事长

近日,深圳证券交易所创业板披露的新显示,深圳市核达中远通电源技术股份有限公司(下称“中远通”)获得上市委会议通过。据贝多财经了解,中远通于2021年6月30日在创业板递交申请。 本次冲刺创业板上市,中远通…

以go rabbitmq为例子--用最少的时间最好的掌握消息队列

为什么要使用消息队列? 流量削峰 举个例子,如果订单系统最多能处理一万次订单,这个处理能力应付正常时段的下单时绰绰有余,正常时段我们下单一秒后就能返回结果。但是在高峰期,如果有两万次下单操作系统是处理不了的…

向QTableView单元格插入窗体小部件的功能实现

1.前言 我们知道:QTableWidget类有如下函数: void QTableWidget::setCellWidget(int row, int column, QWidget *widget) 可以实现在指定的单元格插入窗体部件QWidget对象,如下代码: setCellWidget(row, column, new QLineEdi…

2023年天津财经大学珠江学院专升本管理学原理专业考试大纲

天津财经大学珠江学院2023年高职升本科专业课考试《管理学原理》考试大纲一、本大纲系天津财经大学珠江学院2023年高职升本科《管理学原理》课程考试大纲。所列考试范围出自徐碧琳主编的教材《管理学原理(第二版)》,机械工业出版社&#xff0…

刨根问底 Kafka,面试过程真好使

大家好,这里是 菜农曰,欢迎来到我的频道。 充满寒气的互联网如何在面试中脱颖而出,平时积累很重要,八股文更不能少!下面带来的这篇 Kafka 问答希望能够在你的 offer 上增添一把🔥。 Kafka最初是由Linkedin公…

【掌握K8S集群部署】手把手真正实现Kubernetes集群的配置与部署(附问题解决方法)

1、环境准备 IPHOSTNAME10.10.20.15k8s110.10.20.16k8s210.10.20.17k8s3 注意hostname不要用下划线、小数点与字母。 2、环境配置(所有节点) # stop firewalld systemctl stop firewalld systemctl disable firewalld# disable selinux sed -i s/enfo…

读 RocketMQ 源码,学习并发编程三大神器

笔者是 RocketMQ 的忠实粉丝,在阅读源码的过程中,学习到了很多编程技巧。 这篇文章,笔者结合 RocketMQ 源码,分享并发编程三大神器的相关知识点。 1 CountDownLatch 实现网络同步请求 CountDownLatch 是一个同步工具类&#xff…

高性能MySQL-创建高性能索引

什么是索引 MySQL并没有统一的索引标准,不同存储引擎的索引的工作方式并不一样,也不是所有的存储引擎都支持所有类型的索引。即使多个存储引擎支持同一种类型的索引,其底层的实现也可能不同。 索引是存储引擎用于快速找到记录的一种数据结构&…

LeetCode 图解 | 206.反转链表(附有知识点回顾)

206.反转链表题目描述思路分析递归方式代码实现迭代方式(非递归)代码实现知识点回顾题目描述 给你单链表的头节点 head ,请你反转链表,并返回反转后的链表。 /*** Definition for singly-linked list.* public class ListNode {*…

AtCoder Beginner Contest 279 G. At Most 2 Colors(计数/组合数学/dp递推)

题目 n(2<n<1e6)个格子&#xff0c;从左到右一字排开&#xff0c; 现在需要给格子涂色&#xff0c;有c(1<c<1e9)种颜色&#xff0c; 要求连续的k(2<k<n)个格子的颜色数最多只有2种&#xff0c; 求方案数&#xff0c;答案对998244353取模 思路来源 TOYO…

3. HTML的语法规范

3. HTML的语法规范 3.1.2 注释的作用和写法 ➢ 注释的作用&#xff1a; ​ •为代码添加的具有解释性、描述性的信息&#xff0c;主要用来帮助开发人员理解代码 ​ •浏览器执行代码时会忽略所有的注释 ➢ 注释的快捷键&#xff1a; ​ • 在VS Code中&#xff1a;ctrl / 3.1.…

中国的LPR改革及其意义

中国的LPR改革及其意义 – 潘登同学的宏观经济学笔记 文章目录中国的LPR改革及其意义 -- 潘登同学的宏观经济学笔记LPR的两次改革为什么需要LPR改革LPR改革的意义LPR的两次改革 LPR&#xff1a;商业银行对其最优质的客户执行的贷款利率 LPR在我国经历了两次改革&#xff0c;一…

PyTorch中torch.gather()函数

一. torch.gather()函数 官方文档&#xff1a;torch.gather函数&#xff0c;定义&#xff1a;从原tensor中获取指定dim和指定index的数据。 看到这个核心定义&#xff0c;我们很容易想到gather()的基本想法其实就类似从完整数据中按索引取值般简单&#xff0c;比如下面从列表中…

Kafka - 07 Zookeeper中存储的 Kafka 信息

我们在前面的文章中搭建了 Kafka 集群&#xff0c;分别是伪集群和真实的集群&#xff1a; Kafka - 03 Kafka安装 | 单机环境搭建 | 伪集群环境搭建 (一台虚拟机) Kafka - 06 Kafka 集群环境搭建&#xff08;三台虚拟机&#xff09; 两种方式中&#xff0c;Zookeeper 存储的 …