MYSQL中JDBC的使用

news2024/12/29 13:36:02

一、JDBC基础概念

JDBC 是Java 中的一组API,用于执行SQL 操作(例如CRUD 操作:增、删、改、关系),同时可以和各种类型的数据库类型进行连接(MySQL、Oracle、SQL Server 等)。 JDBC是Java标准库的一部分,提供了与数据库进行交互的抽象接口。

JDBC主要包含以下几个核心组件:

  • Driver(驱动程序):这是用于连接Java应用程序和数据库的接口。多数数据库(如MySQL、Oracle、PostgreSQL等)都有自己特定的JDBC驱动程序。
  • Connection(连接):Connection对象代表一个Java程序与数据库的连接。
  • Statement(语句):用于执行SQL查询。
  • ResultSet(结果集):存储从数据库查询的结果。
  • SQLException(异常):处理数据库操作中可能出现的异常。

二、使用MySQL JDBC的步骤

要通过JDBC连接MySQL,主要步骤如下:

  • 添加MySQL JDBC驱动

    • 创建Maven模块

      首先需要下载MySQL JDBC驱动(mysql-connector-java.jar),然后将其添加到Java项目中。
    • 如果使用Maven管理依赖,可以在pom.xml中添加依赖:
    • <dependency>
          <groupId>mysql</groupId>
          <artifactId>mysql-connector-java</artifactId>
          <version>8.0.26</version>
      </dependency>

    • 当我们有这两个包名出现后,就说明我们的MySQL JDBC驱动已经下好了

2. JDBC连接MySQL的基本步骤

1.加载MySQL JDBC驱动程序

JDBC驱动程序通常是一个外部JAR包。在项目中,可以通过下载MySQL的Connector/J包并添加到项目的类路径中。加载驱动程序的代码通常如下:

Class.forName("com.mysql.cj.jdbc.Driver");

2.创建数据库连接

使用DriverManager.getConnection()方法获取数据库连接。该方法需要数据库的URL、用户名和密码。URL通常为jdbc:mysql://,后面连接数据库服务器的地址和数据库名。

String url = "jdbc:mysql://localhost:3306/mydatabase"; // 数据库URL
String user = "root"; // 数据库用户名
String password = "password"; // 数据库密码
Connection conn = DriverManager.getConnection(url, user, password);

String url = "jdbc:mysql://localhost:3306/dbname?useSSL=false&serverTimezone=UTC";
Connection conn = DriverManager.getConnection(url, "username", "password");

红色:为要操作数据库的名字

蓝色:自己操作的话,为root

绿色:自己开启数据库的密码

3. 创建Statement对象

在建立连接后,创建Statement对象来执行SQL语句。

Statement stmt = conn.createStatement();

4. 执行SQL查询

使用Statement对象的executeQuery()方法执行查询语句,并使用executeUpdate()执行更新语句。

5. 处理结果

返回查询的结果会存储在ResultSet对象中,通过遍历ResultSet获取数据。

结果展示:

小编这里不知道MessageFormat.format的用法所以在网上找了点资料,如果会的可以不用看:


MessageFormat.format字段介绍:

MessageFormat.format的主要用途

  1. 动态生成带变量的字符串:带有占位(即{0}, {1}, {2}, ...)的字符串模板和参数进行匹配,并输出格式化后的字符串。

  2. 国际化和本地化:在多语言环境中,MessageFormat能够自动处理本地化格式(如日期、数字、货币),适应不同语言和区域的标准。

  3. 安全插值:使用MessageFormat时,避免了简单的字符串粘贴可能带来的代码差异性差、安全性低的问题(如SQL注入),提供了更安全和清晰的插值方式。


基本用法

MessageFormat.format方法接受两个参数:

  • 第一个参数:格式化字符串(模板),指定了如何插入数据,并通过{0}, {1}, {2}, 等形式代表占位符。
  • 第二个参数:一组数据,以队列形式提供,每个数据会对应模板中的占位符。
示例:

import java.text.MessageFormat;

public class MessageFormatExample {
    public static void main(String[] args) {
        String template = "Hello, {0}. Today is {1}. You have {2} new messages.";
        
        // 插入的数据
        String name = "Alice";
        String date = "2024-11-13";
        int messages = 5;
        
        // 使用 MessageFormat.format 生成动态字符串
        String message = MessageFormat.format(template, name, date, messages);
        
        System.out.println(message);
        // 输出: Hello, Alice. Today is 2024-11-13. You have 5 new messages.
    }
}

上面的要点:

  • {0}, {1},{2}是模板中的占位符,依次会被namedatemessages替换。
  • MessageFormat.format自动将messages的整数值替换为字符串并插入到模板中。

日期、数字等格式化

MessageFormat还支持特殊格式,如日期和数字。可以在占位符中指定格式化方式,例如datenumber

import java.text.MessageFormat;
import java.util.Date;

String template = "At {0,time,short} on {0,date,long}, we received {1,number,integer} messages.";
Date now = new Date();
int messageCount = 5;

String result = MessageFormat.format(template, now, messageCount);

System.out.println(result);
// 输出类似:At 3:30 PM on January 1, 2022, we received 5 messages.

这里{0,time,short}指定时间格式为短格式,{0,date,long}指定日期格式为长格式,而{1,number,integer}将整数消息抽样为无小数位的整数。

示例3:结合国际化(资源文件)

在国际化中,可以将多语言模板存储在资源文件中,再使用MessageFormat.format进行格式化。例如:

想象在资源文件messages_en.properties中包含以下内容:

welcome.message = Hello {0}, you have {1} new messages!

使用时可以这样处理:

import java.util.ResourceBundle;

ResourceBundle messages = ResourceBundle.getBundle("messages", Locale.ENGLISH);
String template = messages.getString("welcome.message");
String result = MessageFormat.format(template, "Alice", 5);

System.out.println(result);
// 输出:Hello Alice, you have 5 new messages!

注意事项

    转义大惯例:如果模板中需要使用花逗号{},需要进行转义,即写成'{''}',例如:

String template = "This is a brace: '{{' and '}}'";
String result = MessageFormat.format(template);
// 输出:This is a brace: { and }

  • 参数顺序MessageFormat.format会严格按顺序匹配{0}, {1}, {2}, 等占位符。

  • 参数数量:如果参数数量与占位符不符,会发送异常或产生不完整输出。


6. 关闭资源

在完成所有数据库操作后,必须关闭连接、语句和结果集,才能释放资源。

3. 使用PreparedStatement

PreparedStatement是的Statement子接口,用于执行预编译的SQL语句,可以防止SQL注入,提高查询效率。使用示例如下:

String query = "SELECT * FROM users WHERE id = ?";
PreparedStatement pstmt = conn.prepareStatement(query);
pstmt.setInt(1, 1); // 设置查询条件

ResultSet rs = pstmt.executeQuery();
while (rs.next()) {
    int id = rs.getInt("id");
    String name = rs.getString("name");
    System.out.println("ID: " + id + ", Name: " + name);
}

rs.close();
pstmt.close();

4. JDBC常用操作

插入数据

String insert = "INSERT INTO users (name, email) VALUES (?, ?)";
PreparedStatement pstmt = conn.prepareStatement(insert);
pstmt.setString(1, "Alice");
pstmt.setString(2, "alice@example.com");
int rows = pstmt.executeUpdate();
System.out.println("Inserted rows: " + rows);
pstmt.close();

更新数据:

String update = "UPDATE users SET email=? WHERE name=?";
PreparedStatement pstmt = conn.prepareStatement(update);
pstmt.setString(1, "newalice@example.com");
pstmt.setString(2, "Alice");
int rows = pstmt.executeUpdate();
System.out.println("Updated rows: " + rows);
pstmt.close();

删除数据

String delete = "DELETE FROM users WHERE name=?";
PreparedStatement pstmt = conn.prepareStatement(delete);
pstmt.setString(1, "Alice");
int rows = pstmt.executeUpdate();
System.out.println("Deleted rows: " + rows);
pstmt.close();

5. 异常处理

在JDBC编程中,推荐使用try-catch-finally来处理数据库连接。可以使用SQLException捕获和处理数据库操作中的异常。

try {
    // 创建数据库连接和执行操作
} catch (SQLException e) {
    e.printStackTrace();
} finally {
    // 关闭连接
}

6. JDBC事务管理

默认情况下,每个SQL操作都是自动提交的。为了保证多步操作的原子性,可以使用事务管理。可以通过设置自动提交为false,然后在操作结束时手动提交或回滚。

conn.setAutoCommit(false);
try {
    // 执行多个更新操作
    conn.commit(); // 手动提交
} catch (SQLException e) {
    conn.rollback(); // 出现异常时回滚
    e.printStackTrace();
} finally {
    conn.setAutoCommit(true); // 恢复自动提交
}

7. JDBC性能优化

  • 使用连接池:使用数据库连接池(如HikariCP、C3P0等)来管理连接,减少创建和库存连接的开支。
  • 批量操作:对于批量插入和更新,可以使用批量操作来提高效率。
  • 预编译语句存储PreparedStatement可以重复使用相同的SQL语句,减少编译开销。
  • 索引优化:合理使用数据库索引,确保查询速度更快。

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

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

相关文章

UnixBench和Geekbench进行服务器跑分

1 概述 服务器的基准测试&#xff0c;常见的测试工具有UnixBench、Geekbench、sysbench等。本文主要介绍UnixBench和Geekbench。 1.1 UnixBench UnixBench是一款开源的测试UNIX系统基本性能的工具&#xff08;https://github.com/kdlucas/byte-unixbench&#xff09;&#x…

基于Java Springboot人力资源管理系统

一、作品包含 源码数据库设计文档万字全套环境和工具资源部署教程 二、项目技术 前端技术&#xff1a;Html、Css、Js、Vue 数据库&#xff1a;MySQL 后端技术&#xff1a;Java、Spring Boot、MyBatis 三、运行环境 开发工具&#xff1a;IDEA 数据库&#xff1a;MySQL8.0…

使用OpenCV(C++)通过鼠标点击操作获取图像的像素坐标和像素值

使用OpenCV&#xff08;C&#xff09;通过鼠标点击操作获取图像的像素坐标和像素值 在这篇博客中&#xff0c;我们将介绍如何使用OpenCV库在C中实现鼠标点击操作&#xff0c;以获取图像的像素坐标和像素值。代码分为两个部分&#xff1a;一个是鼠标事件处理的回调函数&#xff…

Windows VSCode .NET CORE WebAPI Debug配置

1.安装C#插件 全名C# for Visual Studio Code&#xff0c;选择微软的 2. 安装C# Dev Kit插件 全名C# Dev Kit for Visual Studio Code&#xff0c;同样是选择微软的 3.安装Debugger for Unity 4.配置launch.json 文件 {"version": "0.2.0","config…

AI斩获6枚金牌!华为Kaggle大师级智能体诞生,自主解决数据科学难题

继 OpenAI o1 成为首个达到 Kaggle 特级大师的人工智能&#xff08;AI&#xff09;模型后&#xff0c;另一个 Kaggle 大师级 AI 也诞生了。 根据 Kaggle 的晋级系统&#xff0c;由华为诺亚方舟实验室和伦敦大学学院团队联合推出的端到端自主数据科学智能体&#xff08;agent&a…

[Mysql基础] 表的操作

一、创建表 1.1 语法 CREATE TABLE table_name ( field1 datatype, field2 datatype, field3 datatype ) character set 字符集 collate 校验规则 engine 存储引擎; 说明&#xff1a; field 表示列名 datatype 表示列的类型 character set 字符集&#xff0c;如果没有指定字符集…

04 简单神经网络推导及实现(C++/C)

简单神经网络推导及实现&#xff08;C/C&#xff09; 代码见A simple neural network - stock price prediction as an example(C/C) 1. 主要模块 Neuron.h&#xff1a;用于声明神经元类和构造函数。Layer.h&#xff1a;用于声明网络层类和构造函数。NNet.h&#xff1a;用于…

Mybatis配置文件的增删改查功能

Mybatis配置文件的增删改查功能 查询—条件查询 //resources里面的org.example.mapper中的BrandMapper.xml文件 <?xml version"1.0" encoding"UTF-8" ?> <!DOCTYPE mapperPUBLIC "-//mybatis.org//DTD Mapper 3.0//EN""http://…

【2024软考架构案例题】你知道什么是 RESTful 风格吗?

&#x1f449;博主介绍&#xff1a; 博主从事应用安全和大数据领域&#xff0c;有8年研发经验&#xff0c;5年面试官经验&#xff0c;Java技术专家&#xff0c;WEB架构师&#xff0c;阿里云专家博主&#xff0c;华为云云享专家&#xff0c;51CTO 专家博主 ⛪️ 个人社区&#x…

51单片机应用开发---LCD1602显示应用

实现目标 1、了解LCD1602液晶屏&#xff1b; 2、掌握驱动程序的编写&#xff1b; 3. 具体目标&#xff1a;在屏幕上显示字符。 一、LCD1206概述 1.1 定义 LCD1602(Liquid Crystal Display)液晶显示屏是一种字符型液晶显示模块,可以显示ASCII码的标准字符和其它的一些内置…

如何修改npm包

前言 开发中遇到一个问题&#xff0c;配置 Element Plus 自定义主题时&#xff0c;添加了 ElementPlusResolver({ importStyle: "sass" }) 后&#xff0c;控制台出现报错&#xff0c;这是因为 Dart Sass 2.0 不再支持使用 !global 来声明新变量&#xff0c;虽然当前…

【原创】java+ssm+mysql校园疫情防控管理系统设计与实现

个人主页&#xff1a;程序猿小小杨 个人简介&#xff1a;从事开发多年&#xff0c;Java、Php、Python、前端开发均有涉猎 博客内容&#xff1a;Java项目实战、项目演示、技术分享 文末有作者名片&#xff0c;希望和大家一起共同进步&#xff0c;你只管努力&#xff0c;剩下的交…

Python模拟键盘输入,解放双手

文章目录 Python模拟键盘输入&#xff0c;解放双手一、引言二、pyautogui库的详细介绍1、安装与配置2、键盘输入函数3、特殊按键和组合键 三、实用示例1、自动填写表单2、自动发送邮件3、自动化数据录入 四、总结 Python模拟键盘输入&#xff0c;解放双手 一、引言 在自动化办…

人工智能时代下对人的价值反思?

一、员工价值物化 在现代企业的运作中&#xff0c;资本管理层之间的权力博弈与资源争夺有时呈现出了激烈的内斗态势。这种冲突不仅仅局限于单一部门内部&#xff0c;而是波及到跨部门乃至不同业务小组间的战略部署与资源配置上。各部门经理们既要竭力确保自身团队的利益最大化…

【Qt实现虚拟键盘】

Qt实现虚拟键盘 &#x1f31f;项目分析&#x1f31f;实现方式&#x1f31f;开发流程 &#x1f31f;项目分析 需求&#xff1a;为Linux环境下提供可便捷使用的虚拟键盘OS环境&#xff1a;Windows 7/11、CentOS 7开发语言&#xff1a;Qt/C IDE&#xff1a;QtCreator 、Qt5.14.2功…

APT 参与者将恶意软件嵌入 macOS Flutter 应用程序中

发现了一些恶意软件样本&#xff0c;这些样本据信与朝鲜民主主义人民共和国 (DPRK)&#xff08;又称北朝鲜&#xff09;有关&#xff0c;这些样本使用 Flutter 构建&#xff0c;Flutter 的设计可以对恶意代码进行混淆。JTL 深入研究了恶意代码的工作原理&#xff0c;以帮助保护…

双十一抢券风波:大学生300元提6000元电动车遭拒,谁该负责?

双十一购物狂欢节&#xff0c;本应是消费者享受优惠、商家提升销量的双赢时刻&#xff0c;但在河南郑州&#xff0c;发生了一起哭笑不得的抢券风波。一名大学生在双十一期间&#xff0c;通过某平台抢到了原价6099元电动车的直降优惠&#xff0c;只需支付300元就能将车骑回家。然…

三周精通FastAPI:37 包含 WSGI - Flask,Django,Pyramid 以及其它

官方文档&#xff1a;https://fastapi.tiangolo.com/zh/advanced/wsgi/ 包含 WSGI - Flask&#xff0c;Django&#xff0c;其它 您可以挂载多个 WSGI 应用&#xff0c;正如您在 Sub Applications - Mounts, Behind a Proxy 中所看到的那样。 为此, 您可以使用 WSGIMiddlewar…

【汇编语言】包含多个段的程序(二)—— 将数据、代码、栈放入不同的段

文章目录 前言1. 存在的两个问题2. 解决办法3. 示例代码3.1 程序说明3.1.1 定义多个段的方法3.1.2 对段地址的引用3.1.3 各种段完全是我们的安排 4. 总结结语 前言 &#x1f4cc; 汇编语言是很多相关课程&#xff08;如数据结构、操作系统、微机原理&#xff09;的重要基础。但…

初识Linux · 共享内存

目录 理解共享内存 Shared memmory code 理解共享内存 前文介绍的管道方式的通信&#xff0c;本文介绍的是进程通信的另外一种方式&#xff0c;即共享内存。但是这种通信方式的特点是只能本地通信&#xff0c;并且不像管道那样有保护机制&#xff0c;这里是没有的。 我们通…