JDBC(java数据库连接)—MySQL

news2024/11/18 19:59:06

文章目录

  • 1.定义
  • 2.优势
  • 3.环境准备
  • 4.使用jdbc(java程序操作数据库)
  • 5.使用jdbc的操作步骤

1.定义

jdbc是一种用于执行SQL语句的java api,它是java中的数据库连接规范,为java开发人员操作数据库提供了一个标准的api,可以为多种关系数据库提供统一访问,也就是使用一套标准的jdbc api操作的代码,可以同时支持多种关系型数据库,兼容性好

2.优势

可移植性强,数据库jdbc驱动程序是数据库厂商提供的驱动包,包括jar后缀格式的文件,里面包含class文件,我们自己写java程序,只要引入这个依赖包就可以使用其中的类或者接口

3.环境准备

(1)创建项目
在这里插入图片描述
(2)打开当前项目设置
在这里插入图片描述
(3)添加依赖包
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
(4)看到这些说明安装成功
在这里插入图片描述

4.使用jdbc(java程序操作数据库)

(1)数据库是一个网络上的数据库服务器端进程,需要使用URL来连接
(2)URL格式

协议名://服务端地址:服务器端口号/带层次的文件路径?键1=值1&键2=值2
①协议名:网络传输数据的格式
②服务端地址:服务器所在主机对应的地址(IP,域名),IP或者域名是用于标识某个网络中唯一一台主机,本机的IP是127.0.0.1,本机的域名是localhost
③服务器端口号:主机中端口绑定一个进程
④带层次的文件路径:服务资源
⑤键1=值1&键2=值2:查询字符串(queryString)

(3)jdbc中,需要使用数据库服务器URL来进行连接(MySQL使用本机,端口默认是3306;带层次的路径写数据库名)

5.使用jdbc的操作步骤

(1)第一步:建立数据库连接:类似打开一个cmd客户端连接到MySQL

方式一:DriverManager
方式二:DataSource(数据源/数据库连接池)
①一个程序连接某个数据库使用一个连接池就行
②连接池初始化时,就创建一定数量的数据库连接对象(connection)
③connection.close()只是重置连接对象属性,放回连接池

对比DriverManager和DataSource:
①DriverManager每次都是新建一个物理连接,效率低,释放是关闭物理连接
②DataSource是初始化就创建一定数量的连接,释放只是重置并放回连接池,可以复用,效率高

(2)第二步:创建操作命令对象statement:该对象用于执行SQL代码

三种操作命令对象:
方式一:statement:不带占位符简单操作命令对象
方式二:PreparedStatement:带占位符的预编译操作命令对象(优势:提前预编译,效率高,防止SQL注入,更加的安全,SQL注入指的是拼接字符串,值可能包含SQL语句,不安全)(防SQL注入原理:把替换的字符串中的单引号加上\进行转义)
方式三:callableStatement:用于执行存储过程

(3)执行SQL
(4)如果是插入、删除、修改操作,调用executeUpdate,返回int表示成功处理条数;如果是查询操作,处理结果集ResultSet,调用executeQuery,返回结果集
(5)反向释放资源,调用close方法
查询操作,使用DriverManager连接数据库:

import java.sql.*;
//查询操作,使用DriverManager连接数据库
public class text_driverManager {
    public static void main(String[] args) throws ClassNotFoundException, SQLException {
        //1.建立数据库连接
        Class.forName("com.mysql.jdbc.Driver");
        //DriverManager是jdbc的api,Connection也是(记住使用java.sql的,否则会报错)
        //url:
        // (1)服务器地址改成要连接的数据库IP/域名(localhost)
        // (2)带层次的资源路径改成数据库名(test)
        // (3)用户名,密码(user=root&password=root)
        Connection connection = DriverManager.getConnection("jdbc:mysql://localhost:3306/test?user=root&password=wh06112626&useUnicode=true&characterEncoding=UTF-8&useSSL=false");
        //2.创建操作命令对象(简单地操作命令对象)
        Statement statement = connection.createStatement();
        //3.执行sql语句:可以不加分号
        ResultSet resultSet = statement.executeQuery("select * from accout");
        //4.处理结果集
        while (resultSet.next()){//遍历每一行数据
            //获取相应字段的值
            int id = resultSet.getInt("id");
            String name = resultSet.getString("name");
            int money = resultSet.getInt("money");
            //打印结果集
            System.out.printf("id: %s,name: %s,money: %s\n",id,name,money);
        }
        //5.反向释放资源
        resultSet.close();
        statement.close();
        connection.close();
    }
}

查询操作,使用DataSource连接数据库:

import com.mysql.jdbc.jdbc2.optional.MysqlDataSource;
import java.sql.*;
public class text_query {
    public static void main(String[] args) throws SQLException {
        //使用数据库连接池来获取数据库连接对象,一个java程序创建一个连接池对象
        MysqlDataSource dataSource = new MysqlDataSource();
        //使用方法来设置URL中的参数
        dataSource.setURL("jdbc:mysql://localhost:3306/test");
        dataSource.setUser("root");//用户名
        dataSource.setPassword("wh06112626");//密码
        dataSource.setUseSSL(false);//安全连接,不使用的话会报错
        dataSource.setCharacterEncoding("UTF-8");//设置编码格式
        //1.建立数据库连接
        Connection connection = dataSource.getConnection();
        //2.创建操作命令对象(预编译的操作命令对象)
        //使用预编译的操作命令对象PreparedStatement
        //sql语句中可能包含一些客户端网页传入的数据
        int inputId = 2;//模拟客户端用户传入的id
        //?是占位符,类似于格式化打印中的%s,%d,是可以替换的
        String sql = "select * from accout where id = ?";
        PreparedStatement preparedStatement = connection.prepareStatement(sql);
        //替换占位符:setXXX(index,value),XXX是值的类型,index是占位符的索引位置(是从1开始),value是要替换的值
        preparedStatement.setInt(1,inputId);
        //3.执行sql语句:可以不加分号
        ResultSet resultSet = preparedStatement.executeQuery();
        //4.处理结果集
        while (resultSet.next()){//遍历每一行数据
            //获取相应字段的值
            int id = resultSet.getInt("id");
            String name = resultSet.getString("name");
            int money = resultSet.getInt("money");
            //打印结果集
            System.out.printf("id: %s,name: %s,money: %s\n",id,name,money);
        }
        //5.反向释放资源
        resultSet.close();
        preparedStatement.close();
        connection.close();
    }
}

插入代码:

import com.mysql.jdbc.jdbc2.optional.MysqlDataSource;
import java.sql.*;
//插入
public class text_insert {
    public static void main(String[] args) throws SQLException {
        //使用数据库连接池来获取数据库连接对象,一个java程序创建一个连接池对象
        MysqlDataSource dataSource = new MysqlDataSource();
        //使用方法来设置URL中的参数
        dataSource.setURL("jdbc:mysql://localhost:3306/test");
        dataSource.setUser("root");//用户名
        dataSource.setPassword("wh06112626");//密码
        dataSource.setUseSSL(false);//安全连接,不使用的话会报错
        dataSource.setCharacterEncoding("UTF-8");//设置编码格式
        //1.建立数据库连接
        Connection connection = dataSource.getConnection();
        //2.创建操作命令对象(预编译的操作命令对象)
        //使用预编译的操作命令对象PreparedStatement
        //sql语句中可能包含一些客户端网页传入的数据
        int inputId = 6;//模拟客户端用户传入的id
        //?是占位符,类似于格式化打印中的%s,%d,是可以替换的
        String sql = "insert into accout(id) values(?)";
        PreparedStatement preparedStatement = connection.prepareStatement(sql);
        //替换占位符:setXXX(index,value),XXX是值的类型,index是占位符的索引位置(是从1开始),value是要替换的值
        preparedStatement.setInt(1,inputId);
        //3.执行sql语句:可以不加分号
        //插入,修改,删除,都是调用executeUpdate,返回执行成功多少条语句
        int n = preparedStatement.executeUpdate();
        System.out.println(n);
        //5.反向释放资源
        preparedStatement.close();
        connection.close();
    }
}

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

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

相关文章

【Linux】系统文件接口

目录 一、C文件接口 1、fopen 2、fprintf 3、snprintf 二、系统文件IO 1、open 2、write 3、read 4、C文件接口与系统文件IO的关系 一、C文件接口 1、fopen FILE *fopen(const char *path, const char *mode); fopen 函数返回值类型为 FILE 。参数列表中&#xff0c…

优加DaaS背后,看见新的营销潮

DaaS、融合开放,这是京东云优加对外传递出来的两个最清晰的声音。前者对应的是能力和边界,后者对应的是态度和打法。两者结合,恰构成了京东云优加,或者说京东在营销侧的未来想象力。 作者|皮爷 出品|产业家 “今年我们有接近60%以…

第五章 工厂模式

文章目录 一、简单工厂模式1、传统方式实现披萨订购( 可以忽略)披萨父类 Pizza子类胡椒披萨 PepperPizza子类印度披萨 GreekPizza订购披萨 OrderPizza订购披萨的 客户端 PizzaStore运行结果传统的方式的优缺点,新增子类需要修改的地方牵扯太多传统方式的究极耦合 2、…

YOLOv8 更换骨干网络之 MobileNetV3

论文地址:https://arxiv.org/abs/1905.02244 代码地址:https://github.com/xiaolai-sqlai/mobilenetv3 我们展示了基于互补搜索技术和新颖架构设计相结合的下一代 MobileNets。MobileNetV3通过结合硬件感知网络架构搜索(NAS)和 NetAdapt算法对移动设计如何协同工作,利用互…

BswM模块之Ecu State Handling

文章目录 前言一、ESH是什么?二、基于BswM管理的ECU状态切换流程1.ECU启动2.ECU关闭 总结 前言 BswM – 基础软件模式管理模块, 它的职责是基于简单规则的BSW模块仲裁来自应用层sw - c或其他模块的模式请求,并根据仲裁结果进行相应的操作。 …

QT QPainter 绘制基本图形元件简介

1.基本图形元件 QPainter 提供了很多绘制基本图形的功能,包括点、直线、椭圆、矩形、曲线等,由这些基本的图形可以构成复杂的图形。QPainter 中提供的绘制基本图元的函数如下表所示。每个函数基本上都有多种参数形式,这里只列出函数名&#x…

Elastic Common Schema 和 OpenTelemetry — 无需供应商锁定即可获得更好的可观察性和安全性的途径

作者:Elastic 可观察性和安全团队 在 KubeCon Europe 上,宣布 Elastic Common Schema (ECS) 已被 OpenTelemetry (OTel) 接受作为对该项目的贡献。 目标是将 ECS 和 OpenTelemetry 的语义约定 (SemConv) 融合到一个由 OpenTelemetry 维护的开放模式中。 …

LearnOpenGL-模型加载

1.配置Assimp库。 下载Assimp,解压后得到 assimp-master 文件。在文件中新建一个 build 文件。使用 Cmake 生成工程文件保存在 build 中,从这里下载CMake,下载最新的即可。 打开CMake,选择需要源文件目录和目标目录。修改成适配…

机器学习平台、自研DPU、资源并池,火山引擎发布多云、AI基础设施与增长法宝

1、每十家大模型企业,七家在火山引擎云上。 2、火山引擎大模型训练云平台,支持万卡训练,集群性能提升3倍 3、火山引擎新一代自研DPU,实现计算、存储、网络的全组件卸载,释放更多资源给业务负载。 4、火山引擎与字节国内…

数据库管理软件dbeaver-ce 下载安装并离线配置

文章目录 前言数据库管理软件dbeaver-ce 下载安装并离线配置1. 概述2. 下载3. 安装4. 离线配置驱动jar包5. 链接mysql 前言 如果您觉得有用的话,记得给博主点个赞,评论,收藏一键三连啊,写作不易啊^ _ ^。   而且听说点赞的人每天…

谷歌aab包手机怎么安装教程

一、概述 bundletool是一种底层工具,可供 Android Studio、Android Gradle 插件和 Google Play 用于构建 Android App Bundle 文件并将 app bundle 转换为部署到设备的各种 APK。您也可以将 bundletool作为一种命令行工具,用于自行构建 app bundle 和重新…

【笔试强训编程题】Day2.(排序子序列 100448)和(倒置字符串 69389)

文章目录 前言 一、排序子序列 100448 题目描述 代码实现 二、倒置字符串 69389 题目描述 代码实现 总结 前言 今天让我们来练习两道经典的编程题!!!! 一、排序子序列 100448 题目描述:牛牛定义排序子序列为…

平台资金提现解决方案之实现支付宝单笔转账到银行卡功能

大家好,我是小悟 使用场景 不管是做APP、电脑网站、手机网站还是小程序,为了推广基本上都离不开用户分佣的场景。 换句话说就是在其平台内为每个用户设置“电子钱包”功能,而电子钱包在平台那里只是一串数字,这就需要平台为用户…

详解 ES6中 Promise 构造函数的使用

文章目录 前言什么是 Promise?Promise 的几种状态拆分细解 PromisePromise all()方法then()方法 返回一个新的 Promise 时的状态由什么决定?总结 前言 Promise 是ES6 新增的一个异步调用解决方案,它的出现是为了解决异…

Elasticsearch的调优思路

环境:centos7、elasticsearch-5.6.4 1、性能调优 1.1、Linux参数调优 1.1.1、关闭交换分区 目的是防止内存置换降低性能,将 /etc/fstab 文件中包含 swap 的行注释掉。 #执行命令:注释相关 swap的行 sed -i /swap/s/^/#/ /etc/fstab#将 /etc/f…

彻底弄清FreeRTOS中的事件组(Event Groups)

​之前已经学过两个任务之间可以利用信号量、队列来通信,任务可以利用这两个机制等待某一个事件发生,但是假如需要等待多个事件发生呢?这就需要用到事件组了。 事件组可以让任务进入阻塞态,等待一个或多个事件的组合发生。当事件…

根据 cadence 设计图学习硬件知识 day02 了解飞腾 X100芯片

1. 飞腾芯片 X100的介绍 飞腾套片X100是一款微处理器的配套芯片,主要功能包括图形图像处理和接口扩展两类。在图形图像处理方面,集成了图形处理加速GPU、视频解码VPU、显示控制接口DisplayPort以及显存控制器;在接口扩展方面,支持…

【矩形面积】

题目来源:https://leetcode.cn/problems/rectangle-area/ 目录 矩形面积 矩形面积 题目介绍 给你 二维 平面上两个 由直线构成且边与坐标轴平行/垂直 的矩形,请你计算并返回两个矩形覆盖的总面积。 每个矩形由其 左下 顶点和 右上 顶点坐标表示&#xf…

数字化转型危与机,20年老厂的升级之路

“投资大、周期长、见效慢”,是每一家企业在考虑数字化战略时,都会纠结的问题。 打江山容易,守江山难 企业在快速扩张的过程中,往往可以不需要过多的考虑细节的问题,跑马圈地的打法会更加有效。 但是市场占有量开始饱…

JS Array数组常用方法

会改变原数组的方法 1、array.push(需要在末尾添加的数据)【给数组末尾添加一个元素】 2、array.unshift(需要在首位添加的数据)【给数组首位添加一个元素】 3、array.pop()【从数组末尾删除元素,不需要传参】 4、array.shift()【从数组首位开始删除元素,不需要传参】 5、arra…