小白学习java第15天:JDBC

1.数据库驱动

想一下我们之前是怎么操作数据库,是不是使用SQL语句对其mysql数据库管理系统,然后管理系统在进行数据库(硬盘文件里面的)进行操作。那么我现在想使用应用程序对其数据库进行操作,应该怎么办呢?

那么数据库驱动就是搭建在应用程序和数据库之间的桥梁!!!

                                            

2.JDBC

根据上面的图可以知道,不同的数据库就需要使用不同的数据库驱动进行操作,适合麻烦的,在java上面就需要使用不同的数据库驱动,是很不方便的!

sun公司为了简化开发人员对于数据库的操作,提供了(java操作数据库的)规范,俗称JDBC(java database conection顾名思义就是java与数据库的连接)

                                            

2.1JDBC下载

我使用的mysql版本是8.0,因此我需要下相关的java-connector 8.0.28相对来说稳定一点!

JDBC下载

2.2JDBC的第一个代码测试

2.2.1前期工作:

        首先我们需要对其进行jar的导入,导入依赖,(先创建一个lib目录,然后添加进去就行!注意需要对lib右键里面的 add as  library)

2.2.2开始编写代码:

数据库里面的表:

java里面的代码:

package com.xcl.test;import java.sql.*;public class Demo01 {public static void main(String[] args) throws ClassNotFoundException, SQLException {//1.添加驱动(固定写法,加载驱动)Class.forName("com.mysql.cj.jdbc.Driver");//2.用户信息和url//useUnicode=true(表示中文有效) &characterEncoding=utf8(编码要求) && useSSL=true(一些其他错误的警告)String url = "jdbc:mysql://localhost:3306/school?useUnicode=true&characterEncoding=utf8&&useSSL=true";String username = "root";String password = "123456";//3.连接成功,数据库对象(拿到了数据库对象,现在就可以对其进行操作数据库对象,connection就代表数据库)Connection connection = DriverManager.getConnection(url, username, password);//4.执行SQL对象Statement statement = connection.createStatement();//5.执行SQL对象去执行SQL,查看返回结果//SQL语句String sql = "select * from student";//执行结果ResultSet resultSet = statement.executeQuery(sql);while (resultSet.next()){System.out.print("id=" + resultSet.getObject("id"));System.out.print("name=" + resultSet.getObject("name"));System.out.print("password=" + resultSet.getObject("password"));System.out.print("sex=" + resultSet.getObject("sex"));System.out.print("birthday=" + resultSet.getObject("birthday"));System.out.print("address=" + resultSet.getObject("address"));System.out.print("email=" + resultSet.getObject("email"));}//6.释放连接resultSet.close();statement.close();connection.close();}
}

分析一下:

2.2.3步骤:

1.注册驱动DriverManager

2.用户信息(用户名、密码)和url

url:

"jdbc:mysql://localhost:3306/school?useUnicode=true&characterEncoding=utf8&&useSSL=true"

格式:协议://主机地址:端口号/数据库名?参数1&参数2

3.获取数据库驱动对象,connection代表数据库,那就拥有数据的权利,(数据库设置自动提交

事务提交、事务回滚)

        Connection connection = DriverManager.getConnection(url, username, password);connection.commit();connection.rollback();connection.setAutoCommit(true);

4.具体sql执行类,上面我们有了数据库需要对于表进行操作还需要一个执行sql语句的类对象

Statement statement = connection.createStatement();

然后就使用sql语句对其进行增删改查

        Statement statement = connection.createStatement();statement.execute(); // 执行任何sql语句statement.executeUpdate(); //更新、插入、删除都是这个,显示的结果是受到影响的行数statement.executeQuery(); //查询操作返回的ResultSet

=======================================================================

3.JDBC的抽取

根据上面我们可以知道对于驱动和连接,以及释放资源都是固定,我们需要进行改变的就是statement对其进行增删改查(CURD),因此我们需要对其进行提取工具类以及重点介绍一下statement的操作!!!

3.1.首先我想对于文件的,我想避免耦合,因此我想写一个配置文件对其进行提取(写在一个.properties文件)

driver=com.mysql.cj.jdbc.Driver
url=jdbc:mysql://localhost:3306/school?useUnicode=true&characterEncoding=utf8&&useSSL=true
username=root
password=123456

3.2.上面是完成了一些文件的修改,我还行进一步简化就是我想创建一个工具类JDBCUnity

package com.xcl.test.Utils;import java.io.FileReader;
import java.sql.*;
import java.util.Properties;public class JdbcUtils {private static String driver = null;private static String url = null;private static String username = null;private static String password = null;//创建一个静态代码块,在工具类之前就就加载好了static {try {//1.propertise集合类Properties properties = new Properties();//加载这个文件properties.load(new FileReader("D:\\javaLearn\\JDBC\\src\\dataBase.properties"));//开始获取文件里面的内容driver = properties.getProperty("driver");url = properties.getProperty("url");username = properties.getProperty("username");password = properties.getProperty("password");//然后就开始体现工具类里面的东西Class.forName("driver");} catch (Exception e) {e.printStackTrace();}}//获取连接public static Connection getConnection() throws SQLException {return DriverManager.getConnection(url, username, password);}//释放资源public static void close(Statement statement,Connection connection){//释放资源if (statement!=null){try {statement.close();} catch (SQLException e) {e.printStackTrace();}}if (connection!=null){try {connection.close();} catch (SQLException e) {e.printStackTrace();}}}public static void close(ResultSet resultSet,Statement 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();}}}
}

3.3.那么我就简单进行测试一下(进行增删改查)

package com.xcl.test;import com.xcl.test.Utils.JdbcUtils;import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;public class Demo02 {public static void main(String[] args) {Connection connection = null;Statement statement = null;ResultSet results = null;try {//获得连接connection = JdbcUtils.getConnection();//常见sql对象statement = connection.createStatement();//开始增删改查//添加
//            String sqlAdd = "insert into student value ('12', '张三', '123456', '男', '1999-01-01', '北京', '123456@qq.com')";
//            int i = statement.executeUpdate(sqlAdd);
//            if (i > 0){
//                System.out.println("添加成功");
//            }//删除
//            String sqlDelete = "delete from student where id = '12'";
//            int i = statement.executeUpdate(sqlDelete);
//            if (i > 0){
//                System.out.println("删除成功");
//            }//修改
//            String sqlUpdate = "update student set name = '李四' where id = '11'";
//            int i = statement.executeUpdate(sqlUpdate);
//            if (i > 0){
//                System.out.println("修改成功");
//            }
//
//            //查询String sqlQuery = "select * from student";results = statement.executeQuery(sqlQuery);while (results.next()){System.out.print("id=" + results.getObject("id"));System.out.print("name=" + results.getObject("name"));System.out.print("password=" + results.getObject("password"));System.out.print("sex=" + results.getObject("sex"));System.out.print("birthday=" + results.getObject("birthday"));System.out.print("address=" + results.getObject("address"));System.out.print("email=" + results.getObject("email"));System.out.println();}} catch (SQLException e) {throw new RuntimeException(e);}finally {JdbcUtils.close(statement,connection);}}
}

4.SQL注入

SQL存在漏洞,会被攻击导致数据泄露。SQL会被拼接or,使得你查询语句where判断一直变成true,就可以盗取!!!

package com.xcl.test;import com.xcl.test.Utils.JdbcUtils;import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;public class SQLError {//SQL注入public static void main(String[] args) {login("' or '1=1","' or '1=1");
//        login("赵六","123456");}private static void login(String userName,String password) {Connection connection = null;Statement statement = null;ResultSet results = null;try {//获得连接connection = JdbcUtils.getConnection();//常见sql对象statement = connection.createStatement();//查询String sqlQuery = "select * from student where name='"+userName+"' and password='"+password+"'";results = statement.executeQuery(sqlQuery);while (results.next()){System.out.print("id=" + results.getObject("id"));System.out.print("name=" + results.getObject("name"));System.out.print("password=" + results.getObject("password"));System.out.print("sex=" + results.getObject("sex"));System.out.print("birthday=" + results.getObject("birthday"));System.out.print("address=" + results.getObject("address"));System.out.print("email=" + results.getObject("email"));System.out.println();}} catch (SQLException e) {throw new RuntimeException(e);}finally {JdbcUtils.close(statement,connection);}}
}

因此我们就需要更好的对象去先预处理这个东西

(主要就是进行预编译,里面输入的参数还用?先先代替就行)

步骤:

1.先用问号代替

2.然后进行填充

代码展示:

package com.xcl.test;import com.xcl.test.Utils.JdbcUtils;import java.sql.*;public class SQLError {//SQL注入public static void main(String[] args) {
//        login("' or '1=1","' or '1=1");login("赵六","123456");}private static void login(String userName,String password) {Connection connection = null;Statement statement = null;ResultSet results = null;try {//获得连接connection = JdbcUtils.getConnection();//常见sql对象
//            statement = connection.createStatement();//查询String sqlQuery = "select * from student where name= ? and password= ?";PreparedStatement  preparedStatement = connection.prepareStatement(sqlQuery);preparedStatement.setString(1,userName);preparedStatement.setString(2,password);results = preparedStatement.executeQuery();while (results.next()){System.out.print("id=" + results.getObject("id"));System.out.print("name=" + results.getObject("name"));System.out.print("password=" + results.getObject("password"));System.out.print("sex=" + results.getObject("sex"));System.out.print("birthday=" + results.getObject("birthday"));System.out.print("address=" + results.getObject("address"));System.out.print("email=" + results.getObject("email"));System.out.println();}} catch (SQLException e) {throw new RuntimeException(e);}finally {JdbcUtils.close(statement,connection);}}
}

5.事务(在java里面表现事务)【这不是完整代码,里面还有工具类和数据库,只是给大家一个思路!】

package com.xcl.test;import com.xcl.test.Utils.JdbcUtils;import java.sql.*;public class TransactionDemo {public static void main(String[] args) {Connection con = null;PreparedStatement ps = null;ResultSet resultSet = null;try {//连接con = JdbcUtils.getConnection();//关闭自动提交,之后不需要开启因为会自动开启事务con.setAutoCommit(false);//进行转账的修改String sql_A = "update account set money = money - 200 where name = 'A'";ps = con.prepareStatement(sql_A);ps.executeUpdate();String sql_B = "update account set money = money + 200 where name = 'B'";ps = con.prepareStatement(sql_B);ps.executeUpdate();//提交事务con.commit();System.out.println("转账成功!");} catch (SQLException e) {//失败后进行回滚try {con.rollback();} catch (SQLException ex) {throw new RuntimeException(ex);}throw new RuntimeException(e);}finally {JdbcUtils.close(resultSet,ps,con);}}
}

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

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

相关文章

django之数据的翻页和搜索功能

数据的翻页和搜素功能 目录 1.实现搜素功能 2.实现翻页功能 一、实现搜素功能 我们到bootstrap官网, 点击组件, 然后找到输入框组, 并点击作为额外元素的按钮。 我们需要使用上面红色框里面的组件, 就是搜素组件, 代码部分就是下面红色框框出来的部分。 把这里的代码复制…

Kotlin Multiplatform--02:项目结构进阶

Kotlin Multiplatform--02:项目结构进阶 引言正文 引言 在上一章中,我们对 Kotlin Multiplatform 项目有了基本的了解,已经可以进行开发了。但我们只是使用了系统默认的项目结构。本章介绍了如何进行更复杂的项目结构管理。 正文 在上一章中&…

【Git】连接github时的疑难杂症(DNS解析失败)

大家好,我是jstart千语。最近在将项目推送到github的时候,突然github就拒绝访问了,即使挂了VPN,网页也进不去,通过git也不能把代码推送上去。 即使后面看别人的一些解决方案,比如取消代理啊、更换ssh的方式…

ViTMAE:掩码自编码器是可扩展的视觉学习者

摘要 本文展示了掩码自编码器(MAE)作为计算机视觉中的可扩展自监督学习方法。我们的MAE方法很简单:我们对输入图像进行随机掩码,并重建缺失的像素。该方法基于两个核心设计。首先,我们开发了一种非对称的编码器-解码器…

全球碳化硅晶片市场深度解析:技术迭代、产业重构与未来赛道争夺战(2025-2031)

一、行业全景:从“材料突破”到“能源革命”的核心引擎 碳化硅(SiC)作为第三代半导体材料的代表,凭借其宽禁带(3.26eV)、高临界击穿场强(3MV/cm)、高热导率(4.9W/cmK&…

AWS Glue ETL设计与调度最佳实践

一、引言 在AWS Glue中设计和调度ETL过程时,需结合其无服务器架构和托管服务特性,采用系统化方法和最佳实践,以提高效率、可靠性和可维护性。本文将从调度策略和设计方法两大维度详细论述,并辅以实际案例说明。 二、调度策略的最…

数据结构手撕--【二叉树】

目录 定义结构体: 初始化: 手动创建一个二叉树: 前序遍历: 中序遍历: 后序遍历 二叉树节点个数: 叶子节点个数: 二叉树第k层节点个数: 二叉树的高度: 查找值为x…

2025 Java 开发避坑指南:如何避免踩依赖管理的坑?

在 Java 开发的世界里,依赖管理就像是一座看不见的桥梁,连接着项目所需的各种第三方库和框架。然而,这座桥梁并非总是稳固,稍有不慎就可能掉入 “依赖地狱”,导致项目编译失败、运行异常。2025 年,随着开源…

用node打开一个网页

前言 使用node打开网页,要求跨平台 方案 使用子进程来用命令行打开网页链接就可以了,需要注意的是Mac系统使用的是open命令,Windows系统使用的是start命令,Linux等系统使用xdg-open命令。针对不同的操作系统使用不同的命令。 封…

使用功能包组织C++节点的具体教程

在 ROS(Robot Operating System)中,使用功能包(package)来组织 C 节点是一种常见且有效的方式,它能让代码结构更清晰、便于管理和复用。 1. 环境准备 确保已经安装了 ROS,这里以 ROS 2 Humble…

二项式分布html实验

二项式分布html实验 本文将带你一步步搭建一个纯前端的二项分布 Monte-Carlo 模拟器。 只要一个 HTML 文件,打开就能运行: 动态输入试验次数 n、成功概率 p 与重复次数 m点击按钮立刻得到「模拟频数 vs 理论频数」柱状图随着 m 增大,两组柱状…

通过 API 对接应用网络商城实现订单自动化

前言 API(Application Programming Interface)即应用程序编程接口,是一种允许不同软件应用程序之间进行交互和数据共享的工具。它通过定义一组明确的规则和协议,使得各个软件系统能够以标准化的方式相互通信。 在支付领域&#x…

openwrt作旁路由时的几个常见问题 openwrt作为旁路由配置zerotier 图文讲解

1 先看openwrt时间,一定要保证时间和浏览器和服务器是一致的,不然无法更新 2 openwrt设置旁路由前先测试下,路由器能否ping通主路由,是否能够连接外网,好多旁路由设置完了,发现还不能远程好多就是旁路由本…

FANUC机器人GI与GO位置数据传输设置

FANUC机器人GI与GO位置数据传输设置(整数小数分开发) 一、概述 在 Fanuc 机器人应用中,如果 IO 点位足够,可以利用机器人 IO 传输位置数据及偏移位置数据等。 二、操作步骤 1、确认通讯软件安装 首先确认机器人控制柜已经安装…

UE5 Assimp 自用

记录一下配assimp库到ue中的过程。因为想在ue里面实现一些几何处理(虽然ue好像有相关的geo的代码),遂配置了一下assimp。 1. 编译整理生成自己所需要的文件。cmake编译,下载github 的官方的assimp-master,然后cmake都是默认的就行…

第18章:MCP在创作领域中的应用

第18章:MCP在创作领域中的应用 创意过程,无论是写作、绘画、音乐创作还是设计,往往充满了不确定性、迭代和灵感的迸发。传统 AI 在创意领域的应用常常局限于风格迁移、简单内容生成等。MCP 框架通过其对记忆、上下文和规划的整合,为 AI Agent 参与和辅助更深层次的创意活动…

电子电子架构 --- 主机厂视角下ECU开发流程

我是穿拖鞋的汉子,魔都中坚持长期主义的汽车电子工程师。 老规矩,分享一段喜欢的文字,避免自己成为高知识低文化的工程师: 简单,单纯,喜欢独处,独来独往,不易合同频过着接地气的生活,除了生存温饱问题之外,没有什么过多的欲望,表面看起来很高冷,内心热情,如果你身…

【Agent】LangManus深度解析:AI自动化框架的对比与langgraph原理

LangManus深度解析:AI自动化框架的技术演进与实践 本文将带你深入探索LangManus这一AI自动化框架的核心技术与其基于langgraph的实现原理,并与OpenManus进行全面对比,助你掌握多智能体系统的前沿技术。 本文3万字,没有时间的话可以…

机器学习-08-推荐算法-案例

总结 本系列是机器学习课程的系列课程,主要介绍机器学习中关联规则 参考 机器学习(三):Apriori算法(算法精讲) Apriori 算法 理论 重点 MovieLens:一个常用的电影推荐系统领域的数据集 23张图&#x…

OpenCV 图形API(63)图像结构分析和形状描述符------计算图像中非零像素的边界框函数boundingRect()

操作系统:ubuntu22.04 OpenCV版本:OpenCV4.9 IDE:Visual Studio Code 编程语言:C11 算法描述 计算点集或灰度图像非零像素的 upright(不旋转)边界矩形。 该函数计算并返回指定点集或灰度图像非零像素的最小 upright …