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

【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+"'"; //5.执行SQL,获取查询结果 //executeQuery用于执行select语句,返回结果集 resultSet=statement.executeQuery(sql); //6.对结果集进行遍历获取结果 //有返回true,没有返回false while(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,没有返回false while(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(); //定义SQL String 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、update int 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()直连方式,更直接,灵活。

Read more

【优选算法】滑动窗口算法:专题一

【优选算法】滑动窗口算法:专题一

目录 引言:  【209. 长度最小的子数组】 题目描述: 实现核心及思路: 思路可视化: 代码实现: 【无重复字符的最长子串】 题目描述: 实现核心及思路: 思路可视化: 代码实现: 【最大连续1的个数III】 题目描述: 实现核心及思路: 代码实现: 【1658.将x减到0的最小操作数】 题目描述: 实现核心即思路: 代码实现: 引言: 滑动窗口?用两个指针维护一个动态的 “窗口” 区间,通过移动指针来扩大或缩小窗口,在一次遍历中完成计算,时间复杂度通常为 O (n)。 典型应用:寻找最长无重复字符的子串找到和为目标值的最短子数组字符串的排列匹配 一般步骤(模板): (1)定义left 和 right 指针同时指向数组首元素; (2)当符合要求时,right++,模拟进窗口; (3)不满足要求时,left++,模拟出窗口; (4)

By Ne0inhk
《算法题讲解指南:优选算法-位运算》--33.判断字符是否唯一,34.丢失的数字

《算法题讲解指南:优选算法-位运算》--33.判断字符是否唯一,34.丢失的数字

🔥小叶-duck:个人主页 ❄️个人专栏:《Data-Structure-Learning》 《C++入门到进阶&自我学习过程记录》《算法题讲解指南》--从优选到贪心 ✨未择之路,不须回头 已择之路,纵是荆棘遍野,亦作花海遨游 目录 位运算基础前置知识: 位1的个数 比特位计数 汉明距离 只出现一次的数字 只出现一次的数字||| 34. 判断字符是否唯一 题目链接: 题目描述: 题目示例: 解法(位图的思想): 算法思路: C++算法代码: 算法总结及流程解析: 35. 丢失的数字 题目链接: 题目描述: 题目示例: 解法(位运算): 算法思路: C++算法代码: 算法总结及流程解析: 结束语 位运算基础前置知识:       回顾了上面位运算基础前置的知识这里有五道非常简单的题可以试试手,都是考察位运算的题目: 位1的个数 191.

By Ne0inhk
《并查集:算法中的高效集合操作利器》:一文带你掌握并查集数据结构

《并查集:算法中的高效集合操作利器》:一文带你掌握并查集数据结构

系列文章目录 文章目录 * 系列文章目录 * 一、认识并查集 * 1.并查集的定义 * 2.基本概念 * 2.1.集合的表示 * 2.2.合并操作 * 2.3.查询操作 * 3.基本操作 * 3.1初始化 * 3.2.查找 * 3.3.合并 * 4.优化技巧 * 4.1.路径压缩 * 4.2.按秩合并 * 5.代码完整实例 * 6.应用场景 * 6.1.图的连通性 * 6.2.社交网络分析 * 6.3.动态连通性问题 * 7.

By Ne0inhk
使用 Python + Bright Data MCP 实时抓取 Google 搜索结果:完整实战教程(含自动化与集成)

使用 Python + Bright Data MCP 实时抓取 Google 搜索结果:完整实战教程(含自动化与集成)

免责声明:此篇文章所有内容皆是本人实验,并非广告推广,并非抄袭。如果有人运用此技术犯罪,本人及平台不承担任何刑事责任。如有侵权,请联系。 引言:为什么 AI 应用需要实时网页数据? 在 AI 应用和智能代理(Agent)的开发中,实时性数据往往是决定效果的关键。以 LLM 智能体为例,它们的推理能力高度依赖实时上下文——比如用户问“2025 年最新 AI 趋势是什么”,静态的训练数据无法提供最新答案,必须接入实时网页数据才能给出准确回应。 但传统的网页数据获取方式存在明显痛点:自建爬虫不仅要处理复杂的反爬机制(如 IP 封禁、验证码),还要维护代理池和动态网页渲染逻辑,长期维护成本极高,且很难做到实时响应。 而 Bright Data 的 Web MCP Server(Model Context Protocol Server)正好可以解决这些问题:

By Ne0inhk