基于 JDBC 的后端与 MySQL 数据库交互 javaweb

一、了解JDBC

二、添加MySQL的JDBC驱动包

三、使用JDBC连接数据库应用🔗

3.1创建一个包

3.2 查找实例

 3.3 修改添加删除实例

四、封装 📦

DBConnection.java

MysqlUtil.java

 测试使用一下

测试1

测试2 


        在后端开发中,与数据库进行交互是非常常见的需求。MySQL 作为一种广泛使用的开源关系型数据库,提供了强大的数据存储和管理能力。熟悉Navicat Premium -CSDN博客  在上一篇博客中已经了解了这个管理数据库的工具,那么如何在后端与Mysql进行交互呢????

一、了解JDBC

        JDBC(Java Database Connectivity)是 Java 用于连接和操作数据库的标准化接口 。它提供了一套用于与数据库进行交互的 API(应用程序编程接口),允许 Java 程序通过 SQL 语句与数据库进行通信,执行诸如查询、插入、更新和删除等操作。
  • 在实际开发中,企业可能会使用多种不同的数据库(如 MySQL、Oracle、SQL Server 等)。如果没有一个统一的接口,开发者需要为每种数据库编写不同的代码,这不仅增加了开发成本,还降低了代码的可移植性。
  • JDBC 提供了一套标准化的 API使得 Java 程序能够以统一的方式与各种数据库进行交互,而无需关心底层数据库的具体实现细节

二、添加MySQL的JDBC驱动包

        将JAR包放在后端WEB-INF/lib目录下,这个JAR包通常是用于连接MySQL数据库的驱动包。它的主要作用是让Java应用程序能够与MySQL数据库进行通信和交互,MySQL的JAR驱动包(如mysql-connector-java-x.x.xx.jar)提供了必要的类和方法,使得Java代码可以通过JDBC(Java Database Connectivity)接口连接到MySQL数据库。

        显示的mysql对应5.版本,显示MySQL80 对应jar包的8.版本【我这里是显示的mysql所以使用5.版本的jar包】

可以去网上下载资源:

三、使用JDBC连接数据库应用🔗

具体使用jdbc的步骤就不详细写啦,在代码的注释里面写的很详细哦~

3.1创建一个包

创建com.lxy.util package,在包下创建Test类,

修改目录的呈现方式:

 普通的java类不需要部署到tomcat上,加一个main方法作为入口方法:

在这个main中写sql语句。

3.2 查找实例

package com.lxy.util;import java.sql.DriverManager;
import java.sql.ResultSet;import com.mysql.jdbc.Connection;
import com.mysql.jdbc.Driver;
import com.mysql.jdbc.Statement;public class Test {public static void main(String[] args) {String sql = "select * from student";search(sql);}//查找public static void search(String sql) {//和navicat的查询sql操作差不多//报错原因:驱动包可能找不到,点击红线可以try/catch或者抛出,后续代码在try中写try {//1、:加载驱动,没有驱动无法调用数据库Class.forName("com.mysql.jdbc.Driver");//8. 版本的是com.mysql.cj.jdbc.Driver//2、:填写用户信息和urlString url="jdbc:mysql://localhost:3306/thefirst";String username = "root";String password = "2020";//3、:驱动管理类调用方法进行连接,找到连接对象//报错:需要强制类型转换   子类 对象名 =(子类)父类Connection con = (Connection) DriverManager.getConnection(url, username, password);//4、:创建执行sql的对象,同样需要强制类型转换Statement statement = (Statement) con.createStatement();//5、:执行sql语句//executeQuery用于查找,获得返回结果ResultSet resultSet = statement.executeQuery(sql);//6、resultSet处理数据 resultSet.next()指向下一行【默认指向不是数据的第一行,所以要next】while (resultSet.next()) {int id = resultSet.getInt("id");String name = resultSet.getString("name");String sex = resultSet.getString("sex");int age = resultSet.getInt("age");System.out.println("id: " + id + ", name: " + name + ", sex: " + sex + ", age: " + age);}//7、释放资源:先建立的后释放if(resultSet!=null) {resultSet.close();}if(statement!=null) {statement.close();}if(con!=null) {con.close();}} catch (Exception e) {  //ClassNotFound删掉,可以捕获所有出现的异常// TODO Auto-generated catch blocke.printStackTrace();} }}

运行代码:

 

 

 3.3 修改添加删除实例

和查找都是一样的,只是main方法中的sql语句不同

//添加public static void add(String sql) {try {//1、:加载驱动,没有驱动无法调用数据库    Class.forName("com.mysql.jdbc.Driver");//8. 版本的是com.mysql.cj.jdbc.Driver//2、:填写用户信息和urlString url="jdbc:mysql://localhost:3306/thefirst";String username = "root";String password = "2020";//3、:驱动管理类调用方法进行连接,找到连接对象//报错:需要强制类型转换   子类 对象名 =(子类)父类Connection con = (Connection) DriverManager.getConnection(url, username, password);//4、:创建执行sql的对象,同样需要强制类型转换Statement statement = (Statement) con.createStatement();//5、:执行sql语句//executeupdata用于添加,获得返回结果int num = statement.executeQuery(sql);//7、释放资源:先建立的后释放if(statement!=null) {statement.close();}if(con!=null) {con.close();}} catch (Exception e) {  //ClassNotFound删掉,可以捕获所有出现的异常// TODO Auto-generated catch blocke.printStackTrace();} }

注意sql语句要求提前在navicat中写好复制过来,因为会涉及转义字符

    public static void main(String[] args) {String sql = "update student set name=\"小66\",age=19,sex=\"男\" where id =4\r\n" + "";add(sql);}

刷新表:

 

四、封装 📦

           我们可以把常见的操作代码封装成类,使用的时候直接调用即可【只需要修改部分内容】

创建个db包,放入对数据库增删改查的两个class文件【以后用的时候直接调】

DBConnection.java

package com.lxy.db;import java.sql.Connection;
import java.sql.DriverManager;public class DBConnection {String driver = "com.mysql.jdbc.Driver";  //5...//String driver = "com.mysql.cj.jdbc.Driver";//8...String url = "jdbc:mysql://127.0.0.1:3306/thefirst?useUnicode=true&characterEncoding=utf-8&serverTimezone=UTC&useSSL=true";String user = "root";String password = "2020";//密码 根据实际情况修改public Connection conn;public DBConnection() {try {Class.forName(driver);conn = (Connection) DriverManager.getConnection(url, user, password);//// if(!conn.isClosed())// System.out.println("Succeeded connecting to the Database!");} catch (Exception e) {e.printStackTrace();}}public void close() {try {this.conn.close();} catch (Exception e) {e.printStackTrace();}}}

MysqlUtil.java

package com.lxy.db;import java.rmi.StubNotFoundException;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.HashMap;
import java.util.List;
import java.util.Map;import com.sun.org.apache.bcel.internal.generic.Select;
public class MysqlUtil {//添加public static int add(String sql) {int i=0;DBConnection db = new DBConnection();try {        PreparedStatement preStmt = (PreparedStatement) db.conn.prepareStatement(sql);i=preStmt.executeUpdate();preStmt.close();db.close();} catch (Exception e) {e.printStackTrace();}return i;}//修改public static int update(String sql) {int i =0;DBConnection db = new DBConnection();try {PreparedStatement preStmt = (PreparedStatement) db.conn.prepareStatement(sql);i = preStmt.executeUpdate();preStmt.close();db.close();} catch (SQLException e) {e.printStackTrace();}return i;}//删除public static int del(String delstr) {int i=0;DBConnection db = new DBConnection();try {    PreparedStatement preStmt = (PreparedStatement) db.conn.prepareStatement(delstr);i=preStmt.executeUpdate();preStmt.close();db.close();} catch (SQLException e){e.printStackTrace();}return i;}//查数量public static int getCount(String sql) {int sum = 0;DBConnection db = new DBConnection();try {Statement stmt = (Statement) db.conn.createStatement();ResultSet rs = (ResultSet) stmt.executeQuery(sql);while (rs.next()) {sum += rs.getInt(1);}rs.close();db.close();} catch (Exception e) {}return sum;}//查找public static String getJsonBySql( String sql,String[] colums){ArrayList<String[]>  result = new ArrayList<String[]>();DBConnection db = new DBConnection();try {Statement stmt = (Statement) db.conn.createStatement();ResultSet rs = (ResultSet) stmt.executeQuery(sql);while(rs.next()){String[] dataRow = new String[colums.length];for( int i = 0; i < dataRow.length; i++ ) {dataRow[i] = rs.getString( colums[i] );}result.add(dataRow);}rs.close();db.close();} catch (SQLException e) {e.printStackTrace();}return listToJson(result,colums);}public static String listToJson( ArrayList<String[]> list,String[] colums) {String jsonStr = "{\"code\":0,\"msg\":\"ok\",\"data\":[";for(int i = 0; i < list.size(); i++) {String arr = "{";for( int j = 0; j < list.get(0).length; j++) {if( list.get(i)[j] == null || "NULL".equals(list.get(i)[j])) {arr += "\"" + colums[j] + "\":\"\"";}else {arr += "\"" + colums[j] + "\""+":" ;arr +=  "\"" + list.get(i)[j].replace("\"","\\\"") + "\"";}if( j < list.get(0).length - 1 ) {arr += ",";}}arr += "}";if( i < list.size() - 1 ) {arr += ",";}jsonStr += arr;}jsonStr += "]}";return jsonStr;}}

 测试使用一下

测试1

成功输出:

{"code":0,"msg":"ok","data":[{"id":"1","name":"张三","age":"20","sex":"女"},{"id":"2","name":"李四","age":"20","sex":"男"},{"id":"3","name":"小红","age":"20","sex":"女"},{"id":"4","name":"小66","age":"19","sex":"男"},{"id":"6","name":"丽丽","age":"20","sex":"女"}]}

测试2 

刷新表格出现 

 



        至此你已经掌握后端如何使用JDBC与数据库进行交互了!!!! 从检查MySQL安装到封装数据库操作,每一步都详细讲解,希望你能在实际项目中灵活运用这些知识。希望这篇博客对你有所帮助!如果有任何问题或建议,欢迎在评论区留言。😊

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

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

相关文章

贪心算法--

1.柠檬水找零 link:860. 柠檬水找零 - 力扣&#xff08;LeetCode&#xff09; code class Solution { public:bool lemonadeChange(vector<int>& bills) {// 贪心算法&#xff0c; 优先花出大面额bill&#xff0c; 尽可能保护小面额billint five 0, ten 0;// 不…

基于YOLO11深度学习的电瓶车进电梯检测与语音提示系统【python源码+Pyqt5界面+数据集+训练代码】

《------往期经典推荐------》 一、AI应用软件开发实战专栏【链接】 项目名称项目名称1.【人脸识别与管理系统开发】2.【车牌识别与自动收费管理系统开发】3.【手势识别系统开发】4.【人脸面部活体检测系统开发】5.【图片风格快速迁移软件开发】6.【人脸表表情识别系统】7.【…

github生成badges的方法

在Github页面上生成类似下面这样的badge的方法 你可以通过以下步骤在GitHub个人主页的README中创建类似的技术栈徽章&#xff1a; 一、使用 Shields.io 生成徽章 Shields.io 是一个开源徽章生成工具&#xff0c;支持自定义文本、颜色、图标等参数。 1. 基础模板 https://…

vue3 二次封装uni-ui中的组件,并且组件中有 v-model 的解决方法

在使用uniappvue3开发中&#xff0c; 使用了uni-ui的组件&#xff0c;但是我们也需要自定义组件&#xff0c;比如我要自定一个picker 的组件&#xff0c; 是在 uni-data-picker 组件的基础上进行封装的 父组件中的代码 <classesselect :selectclass"selectclass"…

Spring Boot启动流程及源码实现深度解析

Spring Boot启动流程及源码实现深度解析 一、启动流程概述 Spring Boot的启动流程围绕SpringApplication类展开&#xff0c;核心流程可分为以下几个阶段&#xff1a; 初始化阶段&#xff1a;推断应用类型&#xff0c;加载ApplicationContextInitializer和ApplicationListene…

爬虫案例七Python协程爬取视频

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 前言一、Python协程爬取视频 前言 提示&#xff1a;这里可以添加本文要记录的大概内容&#xff1a; 爬虫案例七协程爬取视频 提示&#xff1a;以下是本篇文章正文…

uni-app开发的App和H5嵌套封装的App,以及原生App有什么区别

uni-app 开发的 App 和 H5 嵌套封装的 App 是两种不同的开发模式&#xff0c;虽然它们都可以实现跨平台开发&#xff0c;但在技术实现、性能、功能支持等方面有显著区别。以下是详细对比&#xff1a; 1. uni-app 开发的 App uni-app 是一个基于 Vue.js 的跨平台开发框架&#…

Python 爬虫实战案例 - 获取拉勾网招聘职位信息

引言 拉勾网&#xff0c;作为互联网招聘领域的佼佼者&#xff0c;汇聚了海量且多样的职位招聘信息。这些信息涵盖了从新兴科技领域到传统行业转型所需的各类岗位&#xff0c;无论是初出茅庐的应届生&#xff0c;还是经验丰富的职场老手&#xff0c;都能在其中探寻到机遇。 对…

LM Studio 替换源的方式解决huggingface.co无法访问的问题

安装软件完成之后&#xff0c;不要打开&#xff0c;打开了就直接关闭 在安装目录下&#xff0c;比如我安装在E:\Program Files\LM Studio 下面三个文件中的huggingface.co全部替换为hf-mirror.com然后再打开即可。 E:\Program Files\LM Studio\resources\app\.webpack\rende…

【模拟CMOS集成电路设计】带隙基准(Bandgap)设计与仿真(基于运放的电流模BGR)

【模拟CMOS集成电路设计】带隙基准&#xff08;Bandgap&#xff09;设计与仿真 前言工程文件&部分参数计算过程&#xff0c;私聊~ 一、 设计指标指标分析&#xff1a; 二、 电路分析三、 仿真3.1仿真电路图3.2仿真结果(1)运放增益(2)基准温度系数仿真(3)瞬态启动仿真(4)静态…

微服务拆分-远程调用

我们在查询购物车列表的时候&#xff0c;它有一个需求&#xff0c;就是不仅仅要查出购物车当中的这些商品信息&#xff0c;同时还要去查到购物车当中这些商品的最新的价格和状态信息&#xff0c;跟购物车当中的快照进行一个对比&#xff0c;从而去提醒用户。 现在我们已经做了服…

机动车授权签字人考试的报名条件是什么?

机动车授权签字人考试的报名条件通常如下&#xff1a; 学历职称与工作经验要求 中级职称及以上&#xff1a;应具备中级及以上专业技术职称&#xff0c;且从事相关检验检测工作三年及以上。如果承检车型有专项作业车、大型客车、校车和危险货物运输车等&#xff0c;若不是相关专…

智慧工厂监测信息系统:构筑安全的数字化未来

在现代工业的浪潮中&#xff0c;智慧工厂已成为推动生产效率和产品质量提升的关键力量。为了确保这一先进生产模式的稳健运行&#xff0c;智慧工厂监测信息系统应运而生&#xff0c;并通过一系列安全措施&#xff0c;为企业的数字化转型保驾护航。 安全注册&#xff0c;筑牢第…

P2P中NAT穿越方案(UDP/TCP)(转)

转自&#xff1a;P2P中NAT穿越方案&#xff08;UDP/TCP&#xff09;_udp反向链接-CSDN博客 同&#xff1a;P2P中NAT穿越方案&#xff08;UDP/TCP&#xff09; - 知乎 (zhihu.com) 本文介绍了传统基于udp的打洞方式&#xff0c;更进一步阐述了tcp打洞的原理&#xff0c;是对于…

算法 之 树形dp 树的中心、重心

文章目录 重心实践题目小红的陡峭值 在树的算法中&#xff0c;求解树的中心和重心是一类十分重要的算法 求解树的重心 树的重心的定义&#xff1a;重心是树中的一个节点&#xff0c;如果将这个点删除后&#xff0c;剩余各个连通块中点数的最大值最小&#xff0c;那么这个节点…

游戏引擎学习第146天

音高变化使得对齐读取变得不可能&#xff0c;我们可以支持循环声音了。 我们今天的目标是完成之前一段时间所做的音频代码。这个项目并不依赖任何引擎或库&#xff0c;而是一个教育项目&#xff0c;目的是展示从头到尾运行一个游戏所需要的全部代码。无论你对什么方面感兴趣&a…

深入理解MySQL主从原理

导读 高鹏&#xff08;网名八怪&#xff09;&#xff0c;《深入理解MySQL主从原理》系列文的作者。 本系列通过GTID、Event、主库、从库、案例分析&#xff0c;五大块来详细讲解主从原理。 这篇文章重在学习笔记整理&#xff01; 在学习《深入理解MySQL主从原理》一书时&…

前端数据模拟利器 Mock.js 深度解析

前端数据模拟利器 Mock.js 深度解析 一、Mock.js 核心价值 1.1 为何需要数据模拟 前后端并行开发加速接口文档驱动开发异常场景模拟测试演示环境数据构造 1.2 Mock.js 核心能力 // 典型数据生成示例 Mock.mock(/api/user, {"users|5-10": [{"id|1": 1…

Phi-4-multimodal:图、文、音频统一的多模态大模型架构、训练方法、数据细节

Phi-4-Multimodal 是一种参数高效的多模态模型&#xff0c;通过 LoRA 适配器和模式特定路由器实现文本、视觉和语音/音频的无缝集成。训练过程包括多阶段优化&#xff0c;确保在不同模式和任务上的性能&#xff0c;数据来源多样&#xff0c;覆盖高质量网络和合成数据。它的设计…

前后端数据加密传输【最佳方案】

AES和RSA区别 算法类型安全性密钥长度/输出长度速度应用场景AES对称加密高128位、192位、256位快适用于大规模数据加密&#xff0c;入HTTPS协议的数据传输RSA非对称加密高1024位、2048位、4096位较慢适用于数据安全传输、数字签名和身份验证 综上&#xff1a;兼顾安全性和性能…