JDBC实现--保姆级教程~

本来以为写过一个使用python与数据库连接的文章,但是今天突然发现没有,那就直接写Java与数据库连接的吧。当然如果大家有需要可以告诉我,有时间的话也可以写一个的pymysql的使用的。

数据库有很多种,接下来我就以MySQL为例来进行讲解了,当然Java与其他数据库的连接也同样是这几步,因为他们都有同一个接口,见下

一.注册驱动

就是确定要使用哪个数据库

1.1下载驱动包

如果有对应jar包的就可以跳过这一步了

对应的地址在这里:MySQL驱动包下载地址

当然一般不建议使用最新版,旧版可以在Archives中找到

下载完成之后,解压

1.2添加jar包

打开解压过的文件,并找到上面标注的jar包

1.一般是可以直接放到你Java项目中的lib目录里面(如果找不到可以直接进行下面的第二步)

2.还需要在开发工具里把该 JAR 包添加到项目的类路径,这样 Java 虚拟机运行时才能找到它。

接下来需要在项目结构的模块中添加对应的jar包

直接在文件中找到之前你解压完成后,文件里对应的jar包就好了

1.3编写代码
// 1.注册驱动(确定要使用哪个数据库)
Class.forName("com.mysql.jdbc.Driver"); // 加载Driver类--在mysql5的驱动包之后,其实也可以省略// DriverManager.registerDriver(new com.mysql.jdbc.Driver());    也可以这样,但是会有点显得多此一举(会重复注册两次)

二.连接数据库

就是要获取到一个数据库连接对象

// 2.连接数据库(获取到一个数据库连接对象)
final String URL = "jdbc:mysql://127.0.0.1:3306/demo1";    // :前可看作协议,数据库不同,协议不同
final String NAME = "root";    // 你数据库的用户名
final String PASSWORD = "1234";    // 你数据库的密码Connection conn = DriverManager.getConnection(URL, NAME, PASSWORD);

其实Connection与MySQL的事务也有关系,在这里我也就不过多赘述了,如果想继续扩充可以自己去查找资料,或在评论区滴我,后续有需要的我可以补充上噢

三.编写sql语句

一般建议先保证语句正确之后,再直接复制到代码中

这个也就不多说了,举个栗子

// 3.编写sql语句
String sql = "select * from tb_user;";

四.把sql语句发送给数据库

4.1实践

数据库执行sql代码,并返回执行结果

// 4.把sql语句发送给数据库(数据库执行sql代码,并返回执行结果)
Statement stmt = conn.createStatement();    // 基于数据库连接对象,创建一个操作数据库的对象// ①使用sql查找时
ResultSet rs = stmt.executeQuery(sql);  // 把sql代码发给数据库// ②使用sql进行增删改操作时
int row = stmt.executeUpdate(sql);    // 执行DML,DDL语句
// 执行DML语句时,执行后返回受影响行数    受影响行数为0表示增删改没有成功
// 执行DDL语句时,执行后返回0表示成功

4.2sql注入风险

但是使用Statement会有sql注入风险

例如,如果在上一步的password是这样的:

// 3.编写sql语句
String username = "aaa";
String password = "aaa' or 1=1-- ";// sql语句拼接时记得加空格(这里的?表示一个占位符)
String sql = "select * from tb_user where username = ? and password = ?;";

那么在使用Statement执行结果时,是一定会成功的,这时候对于数据库中的数据来说,就不是很安全了,所以在这个时候就有了PreparedStatement。而他其实也是Statement的一个子接口。

// 4.把sql语句发送给数据库(数据库执行sql代码,并返回执行结果)
// 创建预编译对象PreparedStatement pstmt = conn.prepareStatement(sql);    // 基于数据库连接对象,创建一个操作数据库的对象// 给sql语句中的占位符赋值
pstmt.setString(1,username);
pstmt.setString(2,password);ResultSet rs = pstmt.executeQuery();  // 这里就不需要再传递内容了

其实PreparedStatement的作用也就相当于把敏感字符进行了一个转义,像'和--都把他们变成了字符串,而不是sql语句本身

一般来说建议使用:PreparedStatement,防止出错

五.处理sql的执行结果

注意区分查找和增删改其他操作的书写。

// 5.处理sql的执行结果(查询)
while(rs.next()){System.out.print(rs.getInt("id")+"\t");System.out.print(rs.getString("username")+"\t");System.out.println(rs.getString("password")+"\t");
}// 如果是增删改操作,就可以直接判断受影响的行数是多少来判断是否执行成功了
if(row > 0){System.out.println("数据操作成功");
}else{System.out.println("数据操作失败");
}

使用步骤:

1.游标向下移动一行,并判断该行是由有数据:next()

2.获取数据:getxxx(参数)

要注意,

1.获取到的数据是什么,就是get什么,例如说int-getInt,varchar-getString

2.而getxxx里面的参数,不管他之前的名字是什么,结果集上是什么就用什么来查询

因为在idea中返回的结果,是根据mysql中的执行结果来返回的

六.释放资源

断开和数据库的连接

// 6.释放资源(断开和数据库的连接)
rs.close();
stmt.close();    // 注意是pstmt还是stmt
conn.close();

就把所有打开的都关闭就是了,谁和谁的都不一样,关闭的顺序与你书写的顺序相反

就像我下面整体的代码,开启连接的顺序是:conn,stmt,rs。所以关闭的顺序就是rs,stmt,conn。

总:代码示例

下面代码我都是使用了@Test注解,大家也可以直接修改为main函数

基础代码:

package JDBC;import org.junit.Test;import java.sql.*;public class JbdcQuickStart {@Testpublic void quickStartTest() throws ClassNotFoundException, SQLException {
//        1.注册驱动(确定要使用哪个数据库)Class.forName("com.mysql.jdbc.Driver"); // 加载Driver类--在mysql5的驱动包之后,其实也可以省略
//        DriverManager.registerDriver(new com.mysql.jdbc.Driver());    也可以这样,但是会有点显得多此一举(会重复注册两次)//        2.连接数据库(获取到一个数据库连接对象)String url = "jdbc:mysql://127.0.0.1:3306/demo1";   // :前可看作协议Connection conn = DriverManager.getConnection(url,"root","1234");//        3.编写sql语句String sql = "select * from tb_user;";//        4.把sql语句发送给数据库(数据库执行sql代码,并返回执行结果)Statement stmt = conn.createStatement();    // 基于数据库连接对象,创建一个操作数据库的对象ResultSet rs = stmt.executeQuery(sql);  // 把sql代码发给数据库
//        5.处理sql的执行结果while(rs.next()){System.out.print(rs.getInt("id")+"\t");System.out.print(rs.getString("username")+"\t");System.out.println(rs.getString("password")+"\t");}//        6.释放资源(断开和数据库的连接)rs.close();stmt.close();conn.close();}
}

防止sql注入代码:
 

package JDBC;import org.junit.Test;import java.sql.*;public class SQL注入demo {//    使用PerparedStatement解决SQL注入问题@Testpublic void loginTest() throws ClassNotFoundException, SQLException {//        1.注册驱动(确定要使用哪个数据库)Class.forName("com.mysql.jdbc.Driver");//        2.连接数据库(获取到一个数据库连接对象)final String URL = "jdbc:mysql://127.0.0.1:3306/demo1";final String NAME = "root";final String PASSWORD = "1234";Connection conn = DriverManager.getConnection(URL, NAME, PASSWORD);//        3.编写sql语句String username = "aaa";String password = "aaa' or 1=1-- ";//        sql语句拼接时记得加空格
//        String sql = "select * from tb_user "+"where username = '小花' and password = '12345';";String sql = "select * from tb_user where username = ? and password = ?;";//        4.把sql语句发送给数据库(数据库执行sql代码,并返回执行结果)
//        创建预编译对象PreparedStatement pstmt = conn.prepareStatement(sql);    // 基于数据库连接对象,创建一个操作数据库的对象//        给sql语句中的占位符赋值pstmt.setString(1,username);pstmt.setString(2,password);ResultSet rs = pstmt.executeQuery();  // 这里就不需要再传递内容了
//        5.处理sql的执行结果if (rs.next()) {String strname = rs.getString("username");String pwd = rs.getString("password");System.out.println("欢迎" + username + "登录");} else {System.out.println("登录失败!");}//        6.释放资源(断开和数据库的连接)rs.close();pstmt.close();conn.close();}
}

附加

其实我们对比代码可以发现,不管是什么操作,有几个步骤其实是不会改变的

这时候我们就可以把相似的代码合成一个包,以方便我们调用

接下来就直接给代码了

package JDBC.JDBC工具类的使用;/** 编写工具类:*   1.私有构造方法*   2.提供静态方法* */import java.sql.*;public class JdbcUtil {private static final String DRIVER = "com.mysql.jdbc.Driver";//    数据库连接参数(这是固定上了,按理说我感觉可以让他到时候自己设置)private static final String URL = "jdbc:mysql://127.0.0.1:3306/demo1";private static final String NAME = "root";private static final String PASSWORD = "1234";
//    private static final String URL = "";
//    private static final String NAME = "";
//    private static final String PASSWORD = "";// 注册驱动(仅需1次)static {try {Class.forName(DRIVER);} catch (ClassNotFoundException e) {throw new RuntimeException(e);}}// 数据库连接public static Connection getConnection() throws SQLException {return DriverManager.getConnection(URL, NAME, PASSWORD);}// 释放资源(重载)public static void close(Connection conn, Statement stmt) {close(conn,stmt,null);  // 方法重用}public static void close(Connection conn, Statement stmt, ResultSet rs) {try {if (rs != null) {rs.close();}} catch (SQLException e) {throw new RuntimeException(e);}try {if (stmt != null) {stmt.close();}} catch (SQLException e) {throw new RuntimeException(e);}try {if (conn != null) {conn.close();}} catch (SQLException e) {throw new RuntimeException(e);}}
}

总体就是这样啦,如果有什么问题可以随时在评论区提问噢~~~

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

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

相关文章

Ubuntu18.04搭建samda服务器

一.什么是Samba服务器? Samba服务器是一种基于开源协议实现的网络共享服务软件,主要用于在不同操作系统(如Windows、Linux、Unix)之间实现文件和打印机共享功能。其核心目标是解决跨平台资源共享的兼容性问题,尤其是在…

《分词算法大揭秘:BPE、BBPE、WordPiece、ULM常见方法介绍》

分词算法是自然语言处理(NLP)中的一个重要预处理步骤,它将文本分割成更小的单元(如单词、子词或字符)。以下是几种常见的分词算法:Byte Pair Encoding (BPE)、Byte-level BPE (BBPE)、WordPiece 和 Unigram…

WordPress01 - 后台常用功能

最近些日子研究Wordpress,做些简单的笔记。 怎么安装Wordpress,怎么进的后台,这些咱就不唠了哈,网上到处是教程。 目录 1,Wordpress的后台 1-1, Posts(投稿) 1-2,Media(媒体) 1-3&#xf…

R8周:RNN实现阿尔茨海默病诊断

🍨 本文为🔗365天深度学习训练营中的学习记录博客 🍖 原作者:K同学啊 一、前期准备 1.设置GPU import numpy as np import pandas as pd import torch from torch import nn import torch.nn as nn import torch.nn.functi…

今天python练习题

目录 一、每日一言 二、练习题 三、效果展示 四、下次题目 五、总结 一、每日一言 不要害怕失败,失败可能成为我们前进的动力! 二、练习题 有列表lst [[1,2,3],[4,5,6],[7,8,9]],取出其中的元素1/5/9组成新的列表 # 有列表lst [[1,2,3],[4,5,6],[…

机器人强化学习入门学习笔记(二)

基于上一篇的《机器人强化学习入门学习笔记》,在基于 MuJoCo 的仿真强化学习训练中,除了 PPO(Proximal Policy Optimization)之外,还有多个主流强化学习算法可用于训练机器人直行或其他复杂动作。 🧠 一、常见强化学习算法对比(可用于 MuJoCo) 算法类型特点适合场景PP…

用 DuckDB 高效分析 JSON 数据:从入门到实战

解析 JSON 文件进行分析常常充满挑战。无论你是在处理 API 响应、日志文件,还是应用数据,如果没有合适的工具,分析 JSON 都会非常耗时。 借助 DuckDB,你可以直接用 SQL 查询复杂的 JSON 文件,无需编写复杂的解析代码或…

从贴牌到品牌:出海官网如何让中国制造“贵”起来?

在全球经济一体化的当下,中美关税战如同一记重锤,给国际贸易格局带来了巨大震荡。自贸易摩擦爆发以来,双方多次调整关税政策,涉及的商品种类不断增多,税率持续攀升,众多中国企业的出口业务遭受重创&#xf…

react-13react中外部css引入以及style内联样式(动态className与动态style)

1. 外部css文件 - 普通引入 1.1 创建一个 CSS 文件,MyComponent.css。 /* MyComponent.css */ .my-class {color: red;font-size: 20px; } 1.2 组件中import引入 import React from react; import ./MyComponent.css; // 引入 CSS 文件function MyComponent() {r…

n8n 与智能体构建:开发自动化 AI 作业的基础平台

n8n 是一款开源的自动化流程构建平台,通过其模块化节点系统,开发者可以快速实现跨平台的任务编排、数据集成与智能交互。当 n8n 与大型语言模型(LLM)结合时,就能构建出具备感知、推理、执行能力的 AI 智能体&#xff0…

14.Spring Boot 3.1.5 集成 Spring Security 进行访问控制

14.Spring Boot 3.1.5 集成 Spring Security 进行访问控制 Spring Security 是一个强大且高度可定制的认证和访问控制框架,专为基于 Spring 的应用程序设计。它为基于 Java EE 的企业应用程序提供了全面的安全解决方案,包括 Web 应用程序安全和方法级安…

Linux学习笔记(二):Linux权限管理

文章目录 一、Linux下用户的分类1. Linux下用户分为两类:2. 这两类用户如何进行切换呢?3. 短暂提权 二、何为权限1. 什么是权限2. Linux的文件后缀意义 三、修改权限1. 设置文件的访问权限——chmod2. 修改文件拥有者——chown3. 修改文件所属组——chgr…

学习alpha,第2个alpha

alphas (-1 * ts_corr(rank(ts_delta(log(volume), 2)), rank(((close - open) / open)), 6)) 先分析操作符从左到右 ts_corr: Pearson 相关度量两个变量之间的线性关系。当变量呈正态分布且关系呈线性时,它最有效。 ts_corr(vwap, close, 20)是一个计算时间序列相…

Paddle Serving|部署一个自己的OCR识别服务器

前言 之前使用C部署了自己的OCR识别服务器,Socket网络传输部分是自己写的,回过头来一看,自己犯傻了,PaddleOCR本来就有自己的OCR服务器项目,叫PaddleServing,这里记录一下部署过程。 1 下载依赖环境 1.1 …

React Native【详解】搭建开发环境,创建项目,启动项目

下载安装 node https://nodejs.cn/download/ 查看 npx 版本 npx -v若无 npx 则安装 npm install -g npx创建项目 npx create-expo-applatestRN_demo 为自定义的项目名称 下载安装 Python 2.7 下载安装 JAVA JDK https://www.oracle.com/java/technologies/downloads/#jdk24-…

NVIDIA Halos:智能汽车革命中的全栈式安全系统

高级辅助驾驶行业正面临一个尴尬的"安全悖论"——传感器数量翻倍的同时,事故率曲线却迟迟不见明显下降。究其原因,当前行业普遍存在三大技术困局: 碎片化安全方案 传统方案就像"打补丁",激光雷达厂商只管点云…

数据资产管理与AI融合:物联网时代的新征程

一、引言 在当今数字化浪潮席卷全球的时代,数据资产已成为企业和组织的核心竞争力之一。随着物联网(IoT)技术的飞速发展,海量的数据如潮水般涌来,如何高效地管理和利用这些数据资产成为了亟待解决的问题。与此同时&am…

MySQL 表的内外连接

文章目录 表的内外连接(重点)内连接外连接左外连接右外连接 表的内外连接(重点) 内连接 内连接实际上就是利用where子句对两种表形成的笛卡儿积进行筛选,我们前面学习的查询都是内连接,也是在开发过程中使…

VTK 交互类介绍

基本概念 交互器(Interactor): 处理用户输入事件的基础类 交互样式(InteractorStyle): 定义具体的交互行为 Widgets: 可交互的UI组件,如滑块、按钮等 Picker: 用于选择场景中的对象 常用交互类 类名功能描述vtkRenderWindowInteractor渲染窗口交互器vtkInteractorStyle交互样式…

C语言动态库与静态库编译测试示例详细介绍终结篇

C语言动态库与静态库编译链接时的详细对比与示例 下面我将提供更详细的示例,并通过对比表格清晰地展示静态库和动态库的特性差异以及它们之间的各种链接关系。 ## 1. 静态库与动态库特性对比 | 特性 | 静态库(.a/.lib) | 动态…