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

用Java操作MySQL数据库

新建Maven项目

创建Maven项目

添加依赖

在pom.xml的标签里加上下面的内容
如果是MySQL 5.8那么的版本号是5.x.x, 例如5.1.49
如果是MySQL 8.0那么的版本号是8.x.x, 例如 8.0.28

<dependencies><!-- https://mvnrepository.com/artifact/mysql/mysql-connector-java --><dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId><version>5.1.49</version></dependency></dependencies>

新建实体类

构建实体类, 类属性和表对应上, 方便来接收查询数据

举例

对于一个学生信息表

 CREATE TABLE student(id BIGINT,`name` VARCHAR(100),sn BIGINT,email VARCHAR(100),classId BIGINT)

新建学生类

public class Student {private int id;private String name;private long sn;private String email;private int classId;//记得自己加上toString()方法,和每个属性的getter和Setter方法
}

连接数据库查询内容

import com.mysql.jdbc.jdbc2.optional.MysqlDataSource;
import javax.sql.DataSource;
import java.sql.*;
import java.util.Scanner;public class Demo01_Connection {//先定义数据源对象, 待会用这个数据源操作数据库//先定义一个名字, 待会再具体实现private static DataSource dataSource = null;//定义自己数据库的各种属性, 方便全局修改// 数据库的用户名private static final String USER = "root";// 数据库的密码private static final String PASSWORD = "123456";// 数据库连接字符串(针对MySQL5)	本机数据库ip就是"localhost", 端口默认3306private static final String URL = "jdbc:mysql://数据库服务ip:端口号/数据库名?characterEncoding=utf-8&useSSL=false";// 如果是MySQL 8则是下面(mysql 8要加时区设置)//private static final String URL = "jdbc:mysql://数据库服务ip:端口号/数据库名?characterEncoding=utf8&useSSL=false&serverTimezone=Asia/Shanghai";public static void main(String[] args) {// 1. 初化始数据源,待会赋给上面定义的数据源MysqlDataSource myDataSource = new MysqlDataSource();// 2. 设置连接的参数myDataSource.setURL(URL);myDataSource.setUser(USER);myDataSource.setPassword(PASSWORD);// 3. 把构建好的Mysql数据源赋值给JDBC中的datasourcedataSource = myDataSource;//下面三个声明在try{}之外,方便finally也能识别Connection connection = null;PreparedStatement statement = null;ResultSet resultSet = null;try{//通过数据源获取一个数据库连接connection = dataSource.getConnection();//接收用户输入的值System.out.print("请输入姓名:");Scanner scanner = new Scanner(System.in);String sn = scanner.next();//定义SQL语句String sql = "select * from student where name = ?";// 获取一个预处理对象statement = connection.prepareStatement(sql);// 处理占位符的值,要匹配上类型,参数1代表第几个占位符,后者表示要被替换的内容statement.setString(1, sn);// 4. 执行SQLresultSet = statement.executeQuery();if (resultSet.next()) { //如果读取到了内容// 创建表示结果的JAVA对象Student student = new Student();student.setId(resultSet.getInt(1));student.setName(resultSet.getString(2));student.setSn(resultSet.getLong(3));student.setEmail(resultSet.getString(4));student.setClassId(resultSet.getInt(5));System.out.println(student);}}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.jdbc.jdbc2.optional.MysqlDataSource;
import javax.sql.DataSource;
import java.sql.*;public class DBUtil {// 先定义一个数据源对象private static DataSource dataSource = null;// 数据库的用户名private static final String USER = "root";// 数据库的密码private static final String PASSWORD = "123456";// 数据库连接字符串private static final String URL = "jdbc:mysql://127.0.0.1:3306/java78?characterEncoding=utf-8&useSSL=false";static {// 初始化数据源,类加载时运行MysqlDataSource mysqlDataSource = new MysqlDataSource();mysqlDataSource.setURL(URL);mysqlDataSource.setUser(USER);mysqlDataSource.setPassword(PASSWORD);dataSource = mysqlDataSource;}// 用private 修饰构造方法,使外部不能new 这个类的对象private DBUtil() {}//获取数据库连接public static Connection getConnection () throws SQLException {return dataSource.getConnection();}//关闭对象并释放资源public static void close (ResultSet resultSet, PreparedStatement 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();}}}
}

使用方法

省略了设置数据源参数和关闭数据源的操作

public class Main{public static void main(String[] args) {//声明三个对象Connection connection = null;PreparedStatement statement = null;ResultSet resultSet = null;try {// 1. 创建数据源并获取数据库连接connection = DBUtil.getConnection();// 2. 构造SQL语句String sql = "select id, name, sn, email, classId from student order by id ASC";// 使用SQL预处理对象处理SQLstatement = connection.prepareStatement(sql);// 3. 执行SQL并获取结果,如果是结果集把结果集转成java对象resultSet = statement.executeQuery();// 遍历结果集,处理查询到数据while (resultSet.next()) {Student student = new Student();student.setId(resultSet.getInt(1));student.setName(resultSet.getString(2));student.setSn(resultSet.getLong(3));student.setEmail(resultSet.getString(4));student.setClassId(resultSet.getInt(5));}// 打印结果System.out.println(student);} catch (SQLException e) {e.printStackTrace();} finally {// 4. 释放资源DBUtil.close(resultSet, statement, connection);}}
}

接收多个查询结果

import java.sql.*;
import java.util.ArrayList;
import java.util.List;public class Demo02_SelectAll {public static void main(String[] args) {// 查询到的所有学生信息放在List里List<Student> students = null;Connection connection = null;PreparedStatement statement = null;ResultSet resultSet = null;try {// 1. 创建数据源并获取数据库连接connection = DBUtil.getConnection();// 2. 构造SQL语句String sql = "select id, name, sn, email, classId from student order by id ASC";// 使用SQL预处理对象处理SQLstatement = connection.prepareStatement(sql);// 3. 执行SQL并获取结果,如果是结果集把结果集转成java对象resultSet = statement.executeQuery();// 遍历结果集,处理查询到数据while (resultSet.next()) {// 如果List为空则创建if (students == null) {students = new ArrayList<>();}// 解析结果集并封装成Student对象Student student = new Student();student.setId(resultSet.getInt(1));student.setName(resultSet.getString(2));student.setSn(resultSet.getLong(3));student.setEmail(resultSet.getString(4));student.setClassId(resultSet.getInt(5));// 加入到集合中students.add(student);}// 打印结果System.out.println(students);} catch (SQLException e) {e.printStackTrace();} finally {// 4. 释放资源DBUtil.close(resultSet, statement, connection);}}
}

数据更改

如果你想update, 那么把SQL语句即可, 原理是相同的,基本不用改Java代码. 例如改成Update student set age=10 where name=?
查询时statement.executeQuery(), 设置是statement.executeUpdate()

import java.sql.*;
import java.util.Scanner;public class Demo03_Delete {public static void main(String[] args) {Connection connection = null;PreparedStatement statement = null;try {// 1. 获取数据库连接connection = DBUtil.getConnection();// 2. 构建SQLString sql = "delete from student where name = ?";// 接收用户的输入System.out.print("请输入要删除的同学姓名:");Scanner scanner = new Scanner(System.in);String name = scanner.next();// 3. 对SQL进行处理,并替换占位符statement = connection.prepareStatement(sql);//替换参数: 1代表第一个问号, name代表填入的数据statement.setString(1, name);// 4. 执行SQL并获取结果int row = statement.executeUpdate();if (row <= 0) {System.out.println("删除失败.");} else {System.out.println("删除成功");}} catch (SQLException e) {e.printStackTrace();} finally {// 释放资源DBUtil.close(null, statement, connection);}}
}

插入数据

import java.sql.*;
import java.util.Scanner;public class Demo04_Insert {public static void main(String[] args) {Connection connection = null;PreparedStatement statement = null;try {// 1. 获取数据库连接connection = DBUtil.getConnection();// 2. 构建SQLString sql = "insert into student values (?, ?, ?, ?, ?)";// 接收用户的输入Scanner scanner = new Scanner(System.in);System.out.print("请输入要添加的同学Id:");int id = scanner.nextInt();// 姓名System.out.print("请输入学生的姓名:");String name = scanner.next();// 学号System.out.print("请输入学生的学号->");long sn = scanner.nextLong();// 邮箱System.out.print("请输入学生的邮箱->");String email = scanner.next();// 班级编号System.out.print("请输入学生的班级编号->");int classId = scanner.nextInt();// 3. 对SQL进行处理statement = connection.prepareStatement(sql);// 替换占位符statement.setInt(1, id);statement.setString(2, name);statement.setLong(3, sn);statement.setString(4, email);statement.setInt(5, classId);// 4. 执行SQL并获取结果int row = statement.executeUpdate();if (row <= 0) {System.out.println("添加失败.");} else {System.out.println("添加成功");}} catch (SQLException e) {e.printStackTrace();} finally {// 释放资源DBUtil.close(null, statement, connection);}}
}

相关文章:

用Java操作MySQL数据库

新建Maven项目 创建Maven项目 添加依赖 在pom.xml的标签里加上下面的内容 如果是MySQL 5.8那么的版本号是5.x.x, 例如5.1.49 如果是MySQL 8.0那么的版本号是8.x.x, 例如 8.0.28 <dependencies><!-- https://mvnrepository.com/artifact/mysql/mysql-connector-java …...

SpringBoot启动报错:java: 无法访问org.springframework.boot.SpringApplication

报错原因&#xff1a;jdk 1.8版本与SpringBoot 3.1.2版本不匹配 解决方案&#xff1a;将SpringBoot版本降到2系列版本(例如2.5.4)。如下图&#xff1a; 修改版本后切记刷新Meavn依赖 然后重新启动即可成功。如下图&#xff1a;...

Vue3 setup语法糖 解决富文本编辑器上传图片64位码过长问题 quill-image-extend-module

引言&#xff1a; 富文本编辑器传图片会解码成64位&#xff0c;非常长导致数据库会报错第一种方法&#xff1a;将数据库类型改成 mediumtext第二种办法&#xff1a;本文中的方法 说明&#xff0c;本周文所用语法糖为Vue3 setup语法&#xff0c;即<script setup> 思路 拦…...

百度坐标(BD09)、国测局坐标(火星坐标,GCJ02)、和WGS84坐标系之间的转换

<!DOCTYPE html> <html><head><meta charset="UTF-8"><title></title></head><body><script>/*** * 百度坐标(BD09)、国测局坐标(火星坐标,GCJ02)、和WGS84坐标系之间的转换*///定义一些常量var x_PI = …...

论文浅尝 | CI4MRC:基于因果推断去除机器阅读理解中的名字偏差

笔记整理&#xff1a;朱珈徵&#xff0c;天津大学硕士&#xff0c;研究方向&#xff1a;问答 链接&#xff1a;https://aclanthology.org/2023.findings-acl.812/ 动机 机器阅读理解&#xff08;Machine Reading Comprehension&#xff0c;MRC&#xff09;是根据给定的文章回答…...

【校招VIP】测试计划之黑盒测试白盒测试

考点介绍&#xff1a; 黑盒测试&白盒测试是大厂和三四线公司校招的必考点。黑盒是以结果说话&#xff0c;白盒往往需要理解实现逻辑。现在商业项目的接口测试往往以白盒为主&#xff0c;也就是需要测试同学自己观察和修改数据库的值进行用例的测试。 但是无论采用哪种测试方…...

学习笔记整理-JS-01-语法与变量

文章目录 一、语法与变量1. 初识JavaScript2. JavaScript的历史3. JavaScript与ECMAScript的关系4. JavaScript的体系5. JavaScript的语言风格和特性 二、语法1. JavaScript的书写位置2. 认识输出语句3. REPL环境&#xff0c;交互式解析器4. 变量是什么5. 重点内容 一、语法与变…...

PHP之PHPExcel

include PHPExcel.php; include PHPExcel/Writer/Excel2007.php; //或者include PHPExcel/Writer/Excel5.php; 用于输出.xls的 //创建一个excel $objPHPExcel new PHPExcel(); // 输出Excel表格到浏览器下载 header(Content-Type: application/vnd.ms-excel); header(Content-…...

Redis系列(一):深入了解Redis数据类型和底层数据结构

Redis有以下几种常用的数据类型&#xff1a; redis数据是如何组织的 为了实现从键到值的快速访问&#xff0c;Redis 使用了一个哈希表来保存所有键值对。 Redis全局哈希表&#xff08;Global Hash Table&#xff09;是指在Redis数据库内部用于存储所有键值对的主要数据结构。…...

javaScript:如何获取html中的元素对象

目录 前言&#xff1a; 方法 1.通过id获取元素 2.通过标签名获取元素 3.通过类名class获取元素 获取body的方法 1.document.getElementsByTagName(body)[0] 2.document.body 相关代码 前言&#xff1a; 通过获取HTML中的元素对象&#xff0c;JavaScript可以对网页进行动…...

面试总结-webpack/git

说说你对webpack的理解 webpack 是一个静态模块打包器&#xff0c;整个打包过程就像是一条生产线&#xff0c;把资源从入口放进去&#xff0c;经过一系列的加工&#xff08;loader&#xff09;&#xff0c;最终转换成我们想要的结果&#xff0c;整个加工过程还会有监控&#x…...

深入解析美颜SDK:算法、效果与实现

在当今数字化社会中&#xff0c;图像处理和美化技术已经成为了许多应用领域的重要组成部分&#xff0c;尤其在视频直播领域&#xff0c;美颜技术更是无处不在。直播美颜SDK作为一种集成的软件工具包&#xff0c;为开发者和应用提供了强大的美颜功能。 一、算法原理 磨皮算法…...

ChatGPT Plus和ChatGPT对比

模型规模更大&#xff0c;参数数量超过6万亿&#xff0c;比ChatGPT大很多训练数据更丰富&#xff0c;包括不同语言、领域和类型的数据语言理解和生成能力更强&#xff0c;能够更准确地理解和生成文本可解释性和可控性更好&#xff0c;支持更多的调参和控制参数&#xff0c;生成…...

计算机网络 运输层 TCP连接建立、释放

三报文而不是两报文...

npm run xxx 的时候发生了什么?(以npm run dev举例说明)

文章目录 一、去package.json寻找scripts对应的命令二、去node_modules寻找vue-cli-service三、从package-lock.json获取.bin的软链接1. bin目录下的那些软连接存在于项目最外层的package-lock.json文件中。2.vue-cli-service文件的作用3.npm install 的作用 总结 一、去packag…...

图解结构体大小和位域例子

struct A {short a; char b; int c : 1; char d : 4; short e : 7; }; 备注&#xff1a;蓝色&#xff1a;表示占一个符号位空间红色&#xff1a;表示补齐其他颜色&#xff1a;实际最大值所占空间 &#xff08;1&#xff09;图解例1 st…...

游戏行业实战案例 5 :玩家在线分布

【面试题】某游戏数据后台设有“登录日志”和“登出日志”两张表。 「登录日志」记录各玩家的登录时间和登录时的角色等级。 「登出日志」记录各玩家的登出时间和登出时的角色等级。 其中&#xff0c;「角色 id 」字段唯一识别玩家。 游戏开服前两天&#xff08; 2022-08-13 至…...

TypeScript 关于对【泛型】的定义使用解读

目录 概念导读泛型函数多个泛型参数泛型约束泛型别名泛型接口泛型类总结&#xff1a; 概念导读 泛型&#xff08;Generics&#xff09;是指在定义函数、接口或类的时候&#xff0c;不预先指定具体的类型&#xff0c;而在使用的时候再指定类型的一种特性。使用泛型 可以复用类型…...

盛元广通食品药品检验检测实验室LIMS系统

随着食品与制药行业法规标准的日益提高和国家两化融合的不断推进&#xff0c;为保障检验工作的客观、公正及科学性&#xff0c;确保制药企业对于生产、实验室、物流、管理的信息化和智能化需求越来越明确&#xff0c;为确保新品可及时得到科学准确的检测检验结果&#xff0c;盛…...

【数据结构】-- 栈和队列

&#x1f407; &#x1f525;博客主页&#xff1a; 云曦 &#x1f4cb;系列专栏&#xff1a;数据结构 &#x1f4a8;吾生也有涯&#xff0c;而知也无涯 &#x1f49b; 感谢大家&#x1f44d;点赞 &#x1f60b;关注&#x1f4dd;评论 文章目录 前言一、栈&#x1f4d9;1.1 栈…...

App无辜躺枪?手把手教你搞定腾讯手机管家误报导致的应用商店下架

当合规应用遭遇误报下架&#xff1a;开发者系统性应对指南运动健康类应用被标记为金融诈骗软件&#xff1f;社交工具因"病毒风险"被各大商店紧急下架&#xff1f;这类看似荒谬的误报事件&#xff0c;正在成为中小开发团队的"无妄之灾"。某知名运动App开发团…...

DeepSeek系统设计辅助效能断崖式下降的3个信号,第2个90%工程师至今未察觉!

更多请点击&#xff1a; https://kaifayun.com 第一章&#xff1a;DeepSeek系统设计辅助效能断崖式下降的3个信号&#xff0c;第2个90%工程师至今未察觉&#xff01; 当 DeepSeek 的系统设计辅助能力突然变“笨”——接口建议频繁失准、上下文感知错乱、生成代码无法通过基础编…...

古戏台构件声学特性的时域有限差分方法【附模型】

✨ 长期致力于时域有限差分法、窑洞、戏台、八字墙、共形技术研究工作&#xff0c;擅长数据搜集与处理、建模仿真、程序编写、仿真设计。 ✅ 专业定制毕设、代码 ✅ 如需沟通交流&#xff0c;点击《获取方式》 &#xff08;1&#xff09;曲面共形网格快速生成算法&#xff1a; …...

网易云音乐NCM转MP3终极指南:ncmdump工具完整使用教程

网易云音乐NCM转MP3终极指南&#xff1a;ncmdump工具完整使用教程 【免费下载链接】ncmdump 项目地址: https://gitcode.com/gh_mirrors/ncmd/ncmdump 你是否曾经从网易云音乐下载了心爱的歌曲&#xff0c;却发现只能在特定播放器上收听&#xff1f;NCM格式的限制让音乐…...

苏州创新药20年,站上全球产业洗牌暴风眼

一个城市的创新药产业集群如何从无到有&#xff0c;又如何在全球化临界点寻找自己的位置。文&#xff5c;徐鑫编&#xff5c;任晓渔过去一年多&#xff0c;苏州是全球创新药产业版图中一个绕不过去的城市。大额海外授权交易频繁传出&#xff0c;在中国高端制造走出去的背景下&a…...

2605.VGGT-Omega 论文解读: 3D重建的Scaling Law, Register Attention效率革命 | Oxford+Meta CVPR26 Oral

VGGT-Omega: Scaling Feed-Forward 3D Reconstruction Jianyuan Wang, Minghao Chen, Shangzhan Zhang, Nikita Karaev, Johannes Schonberger, et al. Visual Geometry Group, Oxford Meta AI | CVPR 2026 Oral | arXiv 2605.15195 Paper | Project Page 一句话总结 VGGT-Om…...

照着用就行:2026 最新降AIGC软件测评与推荐

2026年真正好用的AI论文降重与改写工具&#xff0c;核心看降重效果、去AI味、格式保留、学术适配四大指标。综合实测&#xff0c;千笔AI、ThouPen、豆包、DeepSeek、Grammarly 是当前最值得推荐的梯队&#xff0c;覆盖从免费到付费、从中文到英文、从文科到理工的全场景需求。 …...

[智能体-81]:工程化智能体 = 模型做脑力拆解 + 框架做流程落地。前者是决策者,后者是管理者,tools/function call是内部员工;mcp server是外部资源;

一、全角色人设 & 对应技术组件角色定位对应技术模块核心职责决策者&#xff08;脑力大脑&#xff09;大模型 LLM理解目标、任务拆解、逻辑判断、分支决策、内容生成&#xff0c;负责 “想方案、定步骤”管理者&#xff08;流程总管&#xff09;智能体编排框架&#xff08;…...

开启Python GUI开发新纪元:Tkinter Designer可视化界面自动化生成终极指南

开启Python GUI开发新纪元&#xff1a;Tkinter Designer可视化界面自动化生成终极指南 【免费下载链接】Tkinter-Designer An easy and fast way to create a Python GUI &#x1f40d; 项目地址: https://gitcode.com/gh_mirrors/tk/Tkinter-Designer 在Python GUI开发…...

《我看见的世界:李飞飞自传》第1-6章阅读笔记:从移民少女到AI教母的“看见“之旅

前言 当我们谈论人工智能时&#xff0c;我们谈论的是算法、数据、算力&#xff0c;是那些冰冷的代码和复杂的模型。但在《我看见的世界&#xff1a;李飞飞自传》中&#xff0c;李飞飞用她独特的视角告诉我们&#xff1a;AI的本质&#xff0c;是人类对"看见"世界的渴望…...