当前位置: 首页 > news >正文

【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.dtcms.com/a/303938.html

相关文章:

  • Java优雅使用Spring Boot+MQTT推送与订阅
  • vue请求golang后端CORS跨域问题深度踩坑
  • 【STM32】FreeRTOS 任务消息队列 和 中断消息队列的区别(六)
  • 14 - 大语言模型 — 抽取式问答系统 “成长记”:靠 BERT 学本事,从文本里精准 “揪” 答案的全过程(呆瓜版-1号)
  • “非参数化”大语言模型与RAG的关系?
  • 云原生MySQL Operator开发实战(五):扩展与生态系统集成
  • python使用ffmpeg录制rtmp/m3u8推流视频并按ctrl+c实现优雅退出
  • DateTime::ToString 日期时间文本格式化深度解析(C++)
  • Mysql InnoDB存储引擎
  • 2.快速开始
  • Windows下基于 SenseVoice模型的本地语音转文字工具
  • 【Linux我做主】探秘进程状态
  • 聚铭安全管家平台2.0实战解码 | 安服篇(三):配置保障 自动核查
  • 从单机架构到分布式:Redis为何成为架构升级的关键一环?
  • OpenLayers 综合案例-底图换肤(变色)
  • DevOps 详解
  • Linux -- 文件【中】
  • CVE-2022-46169漏洞复现
  • DNS污染与劫持
  • 《林景媚与命运协议》
  • 服务器数据恢复—RAID上层部署的oracle数据库数据恢复案例
  • logtrick 按位或最大的最小子数组长度
  • JavaWeb(苍穹外卖)--学习笔记15(分页查询PageHelper)
  • Unity_UI_NGUI_DrawCall
  • Mac安装Navicat步骤Navicat Premium for Mac v17.1.9【亲测】
  • 【腾讯云】EdgeOne网站安全防护的配置方法 防范盗刷流量 附恶意IP和UA黑名单
  • 学习网址备份(二)
  • Linux 启动流程、密码破解、引导修复完全手册
  • 【智能协同云图库】智能协同云图库第八弹:基于阿里云百炼大模型—实现 AI 扩图功能
  • haproxy应用详解