【MySQL】从连接数据库开始:JDBC 编程入门指南

个人主页:♡喜欢做梦

欢迎  👍点赞  ➕关注  ❤️收藏  💬评论


目录

🌟一、什么是JDBC?

🌟二、JDBC编程的步骤

✨使用步骤

✨DriverManger

💫定义

💫DriverManger的主要功能

💫DriverManger的核心方法

💫使用

✨DataSource

💥定义

💥使用 

💥代码优化

✨DriverManger和DataSource的区别


🌟一、什么是JDBC?

JDBC(Java Data Base Connectivity,Java数据库连接)是Java程序和数据库之间的桥梁,也就是Java语言操作数据库的标准API,他提供了一套用于执行SQL语句的Java接口。JDBC的主要作用就是:与数据库连接、发送SQL语句和处理数据库执行结果。

🌟二、JDBC编程的步骤

✨使用步骤

1.加载数据库厂商的驱动包

2.建立连接,用户名,密码

3.创建Statement

4.发送要执行的SQL语句

5.接收返回结果并显示(结果集,受影响的行数)

6.释放资源和关闭连接

✨DriverManger

💫定义

DriverManger是JDBC中的一个核心类,位于java.sql包下,他负责管理数据库驱动程序,并为客户端程序提供获取数据库连接的方法。它就像一个“驱动管理器”,协调不同数据库驱动与应用程序之间的交互。

💫DriverManger的主要功能

  • 注册数据驱动:管理 已加载的数据;
  • 获取数据库连接:根据连接信息(URL、用户名、密码)返回合适的Connection对象;
  • 处理驱动程序之间的竞争:当多个驱动可以连接到同一URL时,选择最合适的驱动。

URL表示统一资源定位符,是互联网上用来指定一个位置、文件或者资源的标准方式。 

💫DriverManger的核心方法

getConnection()

核心方法功能
getConnection(String url)通过URL获取连接
getConnection(String url,String  user,String password)通过URL、用户名和密码获取连接
getConnection(String url,Properties info)通过URL和包含连接属性的Properties对象获取连接
registerDriver(Driver driver)注册驱动(一般不用手动调用)
deregisterDriver(Driver driver)注销驱动
gerDrivers()获取所有已注册的驱动

💫使用

import java.sql.*;
import java.text.MessageFormat;
import java.util.Scanner;public class Demo1 {public static void main(String[] args) {//声明数据库操作的相关对象//数据库连接对象Connection connection=null;//执行静态SQL对象,但是SQL注入可能会出现一些问题Statement statement= null;//对静态SQL的解决方法,预处理PreparedStatement preparedStatement=null;//查询结果集对象ResultSet resultSet=null;try{//1,加载数据厂商提供的驱动:加载数据库提供的jdbc驱动类,注册到DriverManger中Class.forName("com.mysql.cj.jdbc.Driver");//2.获取数据库连接--相当于在数据库中写use java2;//数据库连接URL格式:jdbc:mysql://服务器地址:端口/数据库?参数名=值[&参数名=值]connection= DriverManager.getConnection("jdbc:mysql://127.0.0.1:3306/java2?characterEncoding=utf8" +"&allowPublicKeyRetrieval=true&useSSL=false", "root", "123456");//3.创建Statement对象:Statement用于像数据库发送SQL语句statement = connection.createStatement();//4.定义SQL语句并执行System.out.println("请输入学生姓名:");Scanner scanner =new Scanner(System.in);//接收用户输入String name=scanner.next();String sql="select id,name,class_id from students where name='"+name+"'";//5.执行SQL,获取查询结果//executeQuery用于执行select语句,返回结果集resultSet=statement.executeQuery(sql);//6.对结果集进行遍历获取结果//有返回true,没有返回falsewhile(resultSet.next()){long id=resultSet.getLong(1);//获取第一列字段的值String Stuname=resultSet.getString(2);//获取第二列字段的值long class_id=resultSet.getLong(3);//获取第三列字段的值System.out.println(MessageFormat.format("学生id={0},姓名={1},班级={2}",id,name,class_id));}} catch (SQLException e) {e.printStackTrace();} catch (ClassNotFoundException e) {e.printStackTrace();}finally{// 释放资源(从后往前释放),关闭连接if(resultSet!=null){try{resultSet.close();}catch (SQLException e){e.printStackTrace();}}if(statement!=null){try {statement.close();}catch (SQLException e){e.printStackTrace();}}if(connection!=null){try {connection.close();}catch (SQLException e){e.printStackTrace();}}}}
}

✨DataSource

💥定义

是Java数据库连接(JDBC)的一个接口,用于获取数据库连接,可方便数据库连接资源,实现连接池等高级功能。

💥使用 

import com.mysql.cj.jdbc.MysqlDataSource;import javax.sql.DataSource;
import java.sql.*;
import java.text.MessageFormat;
import java.util.Scanner;public class Demo {public static void main(String[] args) {//定义MySQL数据源对象MysqlDataSource mysqlDataSource=new MysqlDataSource();//MySQL驱动直连//数据库连接mysqlDataSource.setURL("jdbc:mysql://127.0.0.1:3306/java2?characterEncoding=utf8");mysqlDataSource.setUser("root");mysqlDataSource.setPassword("123456");//定义jdbc数据源对象DataSource dataSource=mysqlDataSource;Connection connection=null;//预处理PreparedStatement statement=null;//查询结果集对象ResultSet resultSet=null;try{//1.获取数据库连接connection= dataSource.getConnection();//2.创建Statement对象:Statement用于像数据库发送SQL语句//定义SQL语句并执行String sql="select id,name,class_id from students where name=?";statement = connection.prepareStatement(sql);//3.接收用户输入System.out.println("请输入学生姓名:");Scanner scanner =new Scanner(System.in);String name=scanner.next();// 用真实值替换占位符statement.setString(1,name);//4..执行SQL,获取查询结果//executeQuery用于执行select语句,返回结果集resultSet=statement.executeQuery(sql);//5.对结果集进行遍历获取结果//有返回true,没有返回falsewhile(resultSet.next()){long id=resultSet.getLong(1);//获取第一列字段的值String Stuname=resultSet.getString(2);//获取第二列字段的值long class_id=resultSet.getLong(3);//获取第三列字段的值System.out.println(MessageFormat.format("学生id={0},姓名={1},班级={2}",id,name,class_id));}} catch (SQLException e) {e.printStackTrace();} finally{// 释放资源(从后往前释放),关闭连接if(resultSet!=null){try{resultSet.close();}catch (SQLException e){e.printStackTrace();}}if(statement!=null){try {statement.close();}catch (SQLException e){e.printStackTrace();}}if(connection!=null){try {connection.close();}catch (SQLException e){e.printStackTrace();}}}}
}

💥代码优化

封装

import com.mysql.cj.jdbc.MysqlDataSource;import javax.sql.DataSource;
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.Random;public class DB {//数据源private static DataSource dataSource=null;//数据库连接串private static final String url="jdbc:mysql://127.0.0.1:3306/java2?characterEncoding=utf8";//用户private static String user="root";//密码private static String password="123456";//当类加载到JVM时,执行数据源的初始化static {MysqlDataSource mysqlDataSource = new MysqlDataSource();mysqlDataSource.setURL(url);mysqlDataSource.setUser(user);mysqlDataSource.setPassword(password);dataSource = mysqlDataSource;}public  static void close(ResultSet resultSet, Statement statement, Connection connection){if(resultSet!=null){try{resultSet.close();}catch (SQLException e){e.printStackTrace();}}if(statement!=null){try {statement.close();}catch (SQLException e){e.printStackTrace();}}if(connection!=null){try {connection.close();}catch (SQLException e){e.printStackTrace();}}}//构造方法私有化,防止new这个对象private  DB(){};//获取数据连接public static Connection getConnection() throws SQLException{return dataSource.getConnection();}
}

使用jdbc插入数据 

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.SQLException;
import java.util.Scanner;public class Demo3{//插入数据public static void main(String[] args) {Connection connection=null;PreparedStatement statement=null;//插入数据,不用获得结果集,要影响行数即可try{//获取数据库connection=DB.getConnection();//定义SQLString sql="insert into students(id,name,class_id) values(?,?,?)";//定义SQL预处理对象statement = connection.prepareStatement(sql);//接收用户参数Scanner scanner = new Scanner(System.in);System.out.println("请输入id");Long id= Long.valueOf(scanner.next());System.out.println("请输入姓名");String name= scanner.next();System.out.println("请输入班级");Long class_id= Long.valueOf(scanner.next());//用真实数据代替占位符statement.setLong(1,id);statement.setString(2,name);statement.setLong(3,class_id);//获取结果,影响的行数//executeUpdate执行返回结果是一个整形,通常用于insert、delete、updateint row=statement.executeUpdate();//判断if(row==1){System.out.println("插入成功");}else{System.out.println("插入失败");}} catch (SQLException e) {e.printStackTrace();}finally {//关闭连接,释放资源DB.close(null,statement,connection);}}}

✨DriverManger和DataSource的区别

  • DriverManger每次调用都会初始化一个新的连接,导致资源浪费;
  • DataSource使用连接池的技术,一个连接可以重复使用,用DataDource替代DriverManger.getConnection()直连方式,更直接,灵活。

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

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

相关文章

重生之我在暑假学习微服务第一天《MybatisPlus-上篇》

本系列参考黑马程序员微服务课程,有兴趣的可以去查看相关视频,本系列内容采用渐进式方式讲解微服务核心概念与实践方法,每日更新确保知识点的连贯性。通过系统化学习路径帮助开发者掌握分布式系统构建的关键技术。读者可通过平台订阅功能获取…

odoo-060 git版本:发布/生产版本落后开发版本部署

文章目录问题起源目前解决问题起源 周五提交了一个版本,本来打算使用这个版本的,周末更新。 下一个功能比较复杂,周一提交,结果周末没有更新,导致现在还有没测试过的不能发布的。 说明: 原来只有一个mast…

YotoR模型:Transformer与YOLO新结合,打造“又快又准”的目标检测模型

【导读】在目标检测领域,YOLO系列以其高效的推理速度广受欢迎,而Transformer结构则在精度上展现出强大潜力。如何兼顾二者优势,打造一个“又快又准”的模型,是近年来研究热点之一。本文介绍的一项新研究——YotoR(You …

白杨SEO:流量的本质是打开率?搞用户搜索流量的玩法怎么做?

大家好,我是白杨SEO,专注研究SEO十年以上,全网SEO流量实战派,AI搜索优化研究者。上周六参加了生财航海家在杭州举行的私域运营大会,主题是围绕私域获客,私域IP,AI私域,精细化管理。白…

Java优雅使用Spring Boot+MQTT推送与订阅

在物联网(IoT)和智能设备横行的今天,你有没有遇到这样的问题:服务端需要实时把报警、状态更新、控制指令推送给客户端;安卓 App、嵌入式设备、网页等终端,需要轻量且稳定的连接方式;HTTP 太“重…

多目标粒子群优化(MOPSO)解决ZDT1问题

前言 提醒: 文章内容为方便作者自己后日复习与查阅而进行的书写与发布,其中引用内容都会使用链接表明出处(如有侵权问题,请及时联系)。 其中内容多为一次书写,缺少检查与订正,如有问题或其他拓展…

Coze Studio概览(三)--智能体管理

本文简要分析了Coze Studio中智能体管理功能,包括功能、架构以及核心流程。Coze Studio 智能体管理功能分析 1. 智能体管理架构概览 Coze Studio的智能体管理系统基于DDD架构,主要包含以下核心模块: 后端架构层次: API层 (coze): …

idea运行tomcat日志乱码问题

原因在于idea和tomcat文件编码格式不一样。可以把idea编码改成UTF-8 File | Settings | Editor | File Encodings 里面把GBK都改成UTF-8help里面 Edit Custom VM Options 添加一行-Dfile.encodingUTF-8重启idea

Javaweb - 13 - AJAX

发送请求的几种方式1. 浏览器的地址框中输入地址,回车2. html --> head --> scrip / linkimg 自动发送请求,无需手动触发3. a 标签,form 表单标签需要手动控制提交产生,且往往需要在新的页面上获得响应信息4. 运行 JS 代码…

qt常用控件-06

文章目录qt常用控件-06spinBox/doubleSpinBoxdateTimeEditdialSliderlistWIdgettableWidgettreeWidget结语很高兴和大家见面,给生活加点impetus!!开启今天的编程之路!! 今天我们进一步c11中常见的新增表达 作者&#…

小智源码分析——音频部分(二)

一、利用创建好的对象来调用音频服务 上周从上图的getaudiocode()方法进去感受了一下底层小智的构造如何实现。所以用一个codec来接收我们所构造的音频对象。下来是用构造好的音频对象来调用音频初始化服务Initialize,因为启动函数Application函数的类中有audio_ser…

菜鸟的C#学习(四)

文章目录一、格式说明符1.1、数字格式说明符(适用于数值类型:int, double, decimal 等)1. 标准数字格式2. 自定义数字格式1.2、日期时间格式说明符(适用于 DateTime, DateTimeOffset)1. 标准日期时间格式2. 自定义日期…

基于黑马教程——微服务架构解析(二)

本篇文章基于黑马程序员的微服务课程内容,结合个人学习过程中的理解与思考进行整理。本节将围绕以下几个问题展开:什么是网关和配置管理前面那篇文章,我们了解如何把一个单体的项目拆成分布式微服务项目,并且讲解一下各个服务之间…

Text2SQL智能问答系统开发(一)

开发一个面向企业的chatBI工作流 已完成 基础 Text2SQL 功能实现 实现用户输入自然语言问题后,系统能够自动生成 SQL 并执行返回结果。用户交互优化 支持用户通过补充信息对查询进行调整,提升易用性。模糊时间处理机制 对“最近”“近期”等模糊时间关…

Python HTML模块详解:从基础到实战

一、模块体系全景图 Python生态中处理HTML的工具可分为三大层级: 标准库基础层:html模块 html.parser第三方增强层:BeautifulSoup(搭配解析器)专业级工具层:lxml requests-html 二、标准库核心模块详解…

PyTorch常用Tensor形状变换函数详解

PyTorch常用Tensor形状变换函数详解 在PyTorch中,对张量(Tensor)进行形状变换是深度学习模型构建中不可或缺的一环。无论是为了匹配网络层的输入要求,还是为了进行数据预处理和维度调整,都需要灵活运用各种形状变换函数…

自主智能Agent如何重塑工作流自动化:技术、经济与未来展望

自主智能Agent的崛起与工作流自动化的范式革命2025年7月,当OpenAI向付费用户推出具备网页浏览和代码执行能力的ChatGPT Agent时,工作流自动化领域迎来了一场静默但彻底的革命。这款不再满足于简单问答的智能体,在一个安全的虚拟计算机环境中运…

技术架构、行业应用、工具链整合、挑战应对及未来趋势五大模块,引用多个权威来源数据与开源项目实现细节。

以下是一份关于AI技术落地的实战经验总结报告,结合代码示例、可视化图表与行业案例,内容分为技术架构、行业应用、工具链整合、挑战应对及未来趋势五大模块,引用多个权威来源数据与开源项目实现细节。AI技术落地实战指南:从架构设…

第 9 篇:神经网络初探——当AI拥有了“大脑”,世界从此不同

《人工智能AI之机器学习基石》系列⑨ 专栏核心理念: 用通俗语言讲清楚机器学习的核心原理,强调“洞察 + 技术理解 + 应用连接”,构建一个完整的、富有启发性的知识体系。

音频焦点 Android Audio Focus 进阶

旧焦点处理 示例调用链: requestAudioFocus() → propagateFocusLossFromGain_syncAf() → handleFocusLossFromGain()。 系统事件(如来电)→ 强制焦点变化 → handleFocusLossFromGain()。 函数 propagateFocusLossFromGain_syncAf 焦点持有者发生的焦点丢失通知 主要功能…