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

MySQL的JDBC编程

系列文章目录

MySQL的基础操作-CSDN博客

MySQL操作进阶-CSDN博客

MySQL索引事务-CSDN博客


目录

系列文章目录

前言

一、前置知识

1. 引入依赖

2. 认识 url

二、JDBC 操作流程

1. JDBC 的写操作

2. JDBC 的读操作


前言

本文介绍了MySQL数据库的JDBC操作流程,包括前置知识、写操作和读操作的实现步骤。内容涵盖:1)如何创建Maven项目并引入MySQL依赖;2)URL格式解析;3)JDBC写操作流程(创建数据源、建立连接、构造SQL、执行更新、释放资源);4)使用PreparedStatement防止SQL注入;5)JDBC读操作流程(执行查询、处理ResultSet结果集)。文章通过代码示例详细演示了插入、查询等基本操作,并强调了资源释放的顺序和SQL语句参数化的安全性考虑。


一、前置知识

1. 引入依赖

创建 Maven 项目,同时在 Maven Respository 中找到 MySQL 的依赖,在 Maven 项目中引入;

    <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>

2. 认识 url

url 是资源在网路上的位置;

以下面 url 为例:

jdbc:mysql://127.0.0.1:3306/myjdbc?characterEncoding=utf8&useSS=false

jdbc:mysql 表示 url 的作用,是给 jdbc 操作 mysql 的;

127.0.0.1 表示 IP 地址,描述网络上主机所在的位置;

3306 表示端口号,代表操作网络的应用程序;

myjdbc 表示数据库名;

characterEncoding=utf8 指定字符集为 utf8;

useSS=false 表示设置为不加密;

? 前面表示资源,后面表示访问资源的参数;

& 表示参数间的分隔符,多个参数使用这个符号分割;

二、JDBC 操作流程

1. JDBC 的写操作

1. 创建数据源,设置好 url,用户名和密码;

2. 建立和数据库服务器的连接;

3. 构造 sql,使用 JDBC 操作数据库仍然需要手动构造 sql;

构造完 sql 之后需要预处理 sql 语句,目的是检查 sql 编写是否正确,避免直接发给服务器,导致服务器报错,浪费服务器资源;

除了检查 sql 是否正确,还会解析 sql 得到结构化的数据,直接把解析好的结构化数据发给数据库服务器,服务器就省下了这部分解析的工作;

4. 把 sql 发给服务器,服务器返回受到影响的行数;

5. 关闭连接,释放资源;先获得的资源后释放,后获得的资源先释放;

import com.mysql.jdbc.jdbc2.optional.MysqlDataSource;import javax.sql.DataSource;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.SQLException;// 在数据库中插入数据
public class Demo1 {public static void main(String[] args) throws SQLException {// 1. 创建数据源DataSource dataSource = new MysqlDataSource();((MysqlDataSource)dataSource).setUrl("jdbc:mysql://127.0.0.1:3306/myjdbc?characterEncoding=utf8&useSSL=false");//    设置用户名和密码((MysqlDataSource)dataSource).setUser("root");((MysqlDataSource)dataSource).setPassword("123456");// 2. 建立和数据库服务器之间的连接Connection connection = dataSource.getConnection();// 3. 构造 sqlString sql = "insert into student values(1, '张三')";//    预处理 sql 语句PreparedStatement statement = connection.prepareStatement(sql);// 4. 把 sql 发给服务器int n = statement.executeUpdate();// 5. 关闭连接,释放资源statement.close();connection.close();}
}

更新和删除记录的操作和插入的操作步骤相同,只需要更改 sql 语句;

注意:

为了解决 sql 写死的问题,代码中的 sql 是可以拼接参数的;

但是字符串中拼接上参数,容易被注入 sql 攻击,为了避免被注入 sql,可以使用占位符 “?”,再调用 PreparedStatement 的 setInt(), setString() 等方法进行替换;

        // 3. 构造 sql//String sql = "insert into student values(" + id + ", '" + name +"')";String sql = "insert into student values (?, ?)";//    预处理 sql 语句 - 检查 sql 是否存在问题PreparedStatement statement = connection.prepareStatement(sql);statement.setInt(1, id);statement.setString(2, name);

2. JDBC 的读操作

读操作和写操作的主要区别:

1. sql 语句:需要编写查询语句;

2. 执行 sql 的方法:executeQuery();

3. 执行 sql 语句的返回值:返回的结果集的类型为 ResultSet;

ResultSet 默认指向第 0 行记录的前一个位置,调用 next() 方法,才会指向第 0 行记录;

如果 next() 指向的地方有数据记录,返回 true,否则返回 false;

4. 获取数据记录的列需要使用 getInt(),getString() 等方法,取决于列的数据类型,括号中填写要获取临时表的列名,如果使用别名,就写别名;

5. 关闭资源时,要注意关闭 ResultSet,因为 ResultSet 是最后打开的,因此要最先关闭;

import com.mysql.jdbc.jdbc2.optional.MysqlDataSource;import javax.sql.DataSource;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;// jdbc 查询
public class Demo2 {public static void main(String[] args) throws SQLException {// 1. 创建数据源DataSource dataSource = new MysqlDataSource();((MysqlDataSource) dataSource).setUrl("jdbc:mysql://127.0.0.1:3306/myjdbc?characterEncoding=utf8&useSSL=false");((MysqlDataSource) dataSource).setUser("root");((MysqlDataSource) dataSource).setPassword("123456");// 2. 建立连接Connection connection = dataSource.getConnection();// 3. 编写 sql 语句String sql = "select * from student";PreparedStatement statement = connection.prepareStatement(sql);// 4. 执行 sql 语句ResultSet resultSet = statement.executeQuery();// 5. 遍历结果集合//    通过 next() 方法,可以获取临时表的每一行数据,执行到最后一行的下一行会返回 falsewhile(resultSet.next()){int id = resultSet.getInt("id");String name = resultSet.getString("name");System.out.println("id = " + id + ", name = " + name);}// 6. 释放资源resultSet.close();statement.close();connection.close();}
}

 注意:读操作同样可以使用占位符,后续用变量去替换;


http://www.lryc.cn/news/603944.html

相关文章:

  • Seq2Seq学习笔记
  • 【绘制图像轮廓】——图像预处理(OpenCV)
  • idea运行tomcat日志乱码问题
  • CentOS安装ffmpeg并转码视频为mp4
  • 编程算法在金融、医疗、教育、制造业等领域的落地案例
  • 单片机(STM32-WIFI模块)
  • windows电脑如何截屏 windows电脑截屏教程汇总
  • 【机器学习深度学习】DeepSpeed框架:高效分布式训练的开源利器
  • Python Flask: Windows 2022 server SMB账户(共享盘账户)密码修改
  • 影刀RPA_初级课程_玩转影刀自动化_EXCEL操作自动化
  • 数据结构(5)单链表算法题(中)
  • 第二十二天(数据结构,无头节点的单项链表)
  • 期刊基础学习
  • 抵御酒店管理系统收银终端篡改攻击 API 加密的好处及实现——仙盟创梦IDE
  • 携全双工语音通话大模型亮相WAIC,Soul重塑人机互动新范式
  • BitMart 启动中文品牌“币市”:引领加密资产本地化发展新篇章
  • 【Linux】批量处理多个用户的 sudo 权限问题
  • 01背包问题:Python动态规划深度解析与工程实践
  • napping-1.0.1靶机练习
  • MySQL(配置)——MariaDB使用
  • 2025年Solar应急响应公益月赛-7月笔记ing
  • Java 10 新特性解析
  • 机器学习笔记(四)——聚类算法KNN、Kmeans、Dbscan
  • 域名常见问题集(九)——域名市场介绍
  • 基于JavaWeb的兼职发布平台的设计与实现
  • LangChain和LangGraph 里面的 `create_react_agent`有什么不同
  • 从0到1理解大语言模型:读《大语言模型:从理论到实践(第2版)》笔记
  • Marin说PCB之POC电路layout设计仿真案例---10
  • AI 对话玩具的语音芯片模块方案设计与应用场景​
  • 如何解决人工智能在社会治理中面临的技术和伦理挑战?