小白学习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);}}
}
相关文章:

小白学习java第15天:JDBC
1.数据库驱动 想一下我们之前是怎么操作数据库,是不是使用SQL语句对其mysql数据库管理系统,然后管理系统在进行数据库(硬盘文件里面的)进行操作。那么我现在想使用应用程序对其数据库进行操作,应该怎么办呢࿱…...

大模型应用开发(PAFR)
Prompt问答 特征:利用大模型推理能力完成应用的核心功能 应用场景: 文本摘要分析 舆情分析 坐席检查 AI对话 AgentFunction Calling 特征:将应用端业务能力与AI大模型推理能力结合,简化复杂业务功能开发 应用场景: 旅行指南 数据…...
Go 剥离 HTML 标签的三把「瑞士军刀」——从正则到 Bluemonday
1 为什么要「剥皮」? 安全:去掉潜在的 <script onload…> 等恶意标签,防止存储型 XSS。可读性:日志、消息队列、搜索索引里往往只需要纯文本。一致性:不同富文本编辑器生成的 HTML 五花八门,统一成「…...

U-Mail邮件加速服务:全球链路加速,安全稳定收发
由于跨国网络拥堵、带宽不稳定等因素,导致海外用户在使用企业邮箱收发邮件时,经常出现邮件收发不畅的问题。针对这种情况,U-Mail正式推出了邮件加速服务,U-Mail邮件加速服务依托全球优质加速链路和转发集群服务器,为海…...
实战交易策略 篇十七:翻倍黑马交易策略
文章目录 系列文章设置指标判断大盘买入的条件判断大盘卖出的条件精选个股,挖掘明天能上涨的黑马熊市选股牛市选股短线最佳买点短线最佳卖点“翻倍”的核心秘籍系列文章 实战交易策略 篇一:奥利弗瓦莱士短线交易策略 实战交易策略 篇二:杰西利弗莫尔股票大作手操盘术策略 实…...
反爬策略应对指南:淘宝 API 商品数据采集的 IP 代理与请求伪装技术
一、引言 在电商数据驱动决策的时代,淘宝平台海量的商品数据极具价值。然而,淘宝为保障平台安全和用户体验,构建了严密的反爬体系。当采集淘宝 API 商品数据时,若不采取有效措施,频繁的请求极易触发反爬机制&#x…...

论文精读:大规模MIMO波束选择问题的量子计算解决方案
论文精读:大规模MIMO波束选择问题的量子计算解决方案 概要: 随着大规模多输入多输出系统(MIMO)在5G及未来通信技术中的应用,波束选择问题(MBS)成为提升系统性能的关键。传统的波束选择方法面临计…...
精益数据分析(13/126):洞察数据关系,灵活调整创业方向
精益数据分析(13/126):洞察数据关系,灵活调整创业方向 大家好!在创业和数据分析的探索之路上,每一次的学习都是成长的宝贵机会。今天,咱们接着深入学习《精益数据分析》,一起探索相…...

uniapp-商城-37-shop 购物车 选好了 进行订单确认3 支付栏
支付栏 就是前面用的 car-Layout 在shop也用来这个组件 只是在那里用来的是购物车。 1、 样式 我们开始进入这个页面是点击的shop的购物篮 到这里就变成了支付栏 其实他们是同一个组件 只是做了样式区分 2、具体看看样式和代码 2.1 消失了购物车和改变了按钮名字 如何…...

【LLM+Code】Claude Code Agent 0.2.9 版本PromptTools最细致解读
一、Claude Code 是anthropic团队开发的一个code agent bash工具 具体使用文档:https://docs.anthropic.com/en/docs/agents-and-tools/claude-code/overview 1.1 安装/使用Claude Code 自行安装 npm install -g anthropic-ai/claude-code cd your-project-dire…...

ISCTF2024-misc(部分)
前言 之前写的,一直没发,留个记录吧,万一哪天记录掉了起码在csdn有个念想 1.少女的秘密花园 打开是个图片 随波逐流binwalk一下分离得到一个zip,解压得到base_misc发现是zip 爆破得到密码 解压得到一个txt,将里面的…...

U8G2在PC端模拟(C语言版本)
前提: 电脑已经准备好mingw编译器环境,已经加入环境变量. 测试方法: window下打开cmd,输入gcc -v 会有信息打印. u8g2 u8g2官方支持sdl2接口,已经做好了适配. 所以只需要在使用的开发环境配置好SDL2路径即可. sdl2和u8g2的适配…...

【计算机视觉】CV实战项目 - 深入解析基于HOG+SVM的行人检测系统:Pedestrian Detection
深入解析基于HOGSVM的行人检测系统:从理论到实践 技术核心:HOGSVM检测框架HOG特征原理SVM分类器 项目架构与数据准备INRIA Person数据集目录结构 实战指南:从零构建检测系统环境配置完整训练流程检测应用 关键技术问题与解决方案1. 难例挖掘不…...
如何借助全球动态IP实现多平台账号的批量注册?
无论是社交网络、在线购物平台还是专业应用软件,账号的创建和使用都是必不可少的。然而,在面对不同平台各自的注册限制和策略时,如何高效、安全且合法地进行账号批量注册成为了亟待解决的问题。本文将探讨全球动态IP在这一过程中的作用及其如…...

PR第二课--混剪
1.音乐打点 1.1 手动打点 按钮(如图),或者,快捷键M(如果在已有打点处,再次按M键会进入对标记点的设置界面,如下下图) 1.2 插件打点 一段音乐中,有明显的鼓点时,可以使用打点插件,快捷打点;如果鼓点不明显的话,最好还是手动打点,用插件打点会打出大量的标记点,…...

网页不同渲染方式的应对与反爬机制的处理——python爬虫
文章目录 写在前面爬虫习惯web 网页渲染方式服务器渲染客户端渲染 反爬机制使用session对象使用cookie让请求头信息更丰富使用代理和随机延迟 写在前面 本文是对前两篇文章所介绍的内容的补充,在了解前两篇文章——《爬虫入门与requests库的使用》和《BeautifulSou…...

高级电影感户外街拍人像摄影后期Lr调色教程,手机滤镜PS+Lightroom预设下载!
调色介绍 高级电影感户外街拍人像摄影后期 Lr 调色,是运用 Adobe Lightroom 软件,对户外街拍的人像照片进行后期处理,以塑造出具有电影质感的独特视觉效果。此调色过程借助 Lr 丰富的工具与功能,从色彩、光影、对比度等多维度着手…...
JAVA设计模式——(三)桥接模式
JAVA设计模式——(三)桥接模式(Bridge Pattern) 介绍理解实现武器抽象类武器实现类涂装颜色的行为接口具体颜色的行为实现让行为影响武器修改武器抽象类修改实现类 测试 适用性 介绍 将抽象和实现解耦,使两者可以独立…...
类加载器与jvm的内存
1. 类加载器与内存的关系 类加载器的字节码放在方法区(元空间)中,同时类加载器加载类后类的信息(成员变量、成员方法及修饰符等)存放在方法区中。类的信息所占内存的回收要同时满足两个条件:类的实例被回收…...
docker 配置代理
说明:该方法仅对 docker 程序本身拉取镜像的时候有效,对命令行无效。 docker 配置代理有 2 中方法 1.Daemon configuration 直接在 /etc/docker/daemon.json 文件中配置 {"proxies": {"http-proxy": "http://proxy.example.…...

【硬核干货】JetBrains AI Assistant 干货笔记
快进来抄作业,小编呕心沥血整理的 JetBrains AI Assistant 超干货笔记! 原文链接:【硬核干货】JetBrains AI Assistant 干货笔记 关于晓数神州 晓数神州坚持以“客户为中心”的宗旨,为客户提供专业的解决方案和技术服务ÿ…...

Linux部署ragflow,从安装docker开始~
安装docker https://download.docker.com/linux/static/stable/x86_64/docker-28.0.1.tgz #首先创建一个文件夹,存放我们需要的各类文件,并切换到该目录 mkdir /project && cd /project #此时我们的工作目录已经切换到刚刚创建的文件夹下了,接…...
施磊老师基于muduo网络库的集群聊天服务器(七)
文章目录 数据表字符集问题支持中文和英文**为什么使用 utf8mb4?** 推荐 查看整个表, 再单独修改 客户端群组功能创建群组添加群组群组聊天接收在线群组消息接收离线群组消息补充服务器事件处理器补充服务器查询群组列表问题解决测试 目前报错总结目前为止最恶心的错…...

多态以及多态底层的实现原理
本章目标 1.多态的概念 2.多态的定义实现 3.虚函数 4.多态的原理 1.多态的概念 多态作为面对三大特性之一,它所指代的和它的名字一样,多种形态.但是这个多种形态更多的指代是函数的多种形态. 多态分为静态多态和动态多态. 静态多态在前面已经学习过了,就是函数重载以及模板,…...

使用Go语言实现轻量级消息队列
文章目录 一、引言1.1 消息队列的重要性1.2 为什么选择Go语言1.3 本文实现的轻量级消息队列特点 二、核心设计2.1 消息队列的基本概念2.1.1 消息类型定义2.1.2 消息结构设计 2.2 架构设计2.2.1 基于Go channel的实现方案2.2.2 单例模式的应用2.2.3 并发安全设计 2.3 消息发布与…...
Vue3后代组件多祖先通讯设计方案
在 Vue3 中,当需要设计一个被多个祖先组件使用的后代组件的通讯方式时,可以采用以下方案(根据场景优先级排序): 方案一:依赖注入(Provide/Inject) 响应式上下文 推荐场景ÿ…...

路由与OSPF学习
【路由是跨网段通讯的必要条件】 路由指的是在网络中,数据包从源主机传输到目的主机的路径选择过程。 路由通常涉及以下几个关键元素: 1.路由器:是一种网络设备,负责将数据包从一个网络传输到另一个网络。路由器根据路由表来决定…...

CUDA编程之Grid、Block、Thread线程模型
一、线程模型:Grid、Block、Thread概念 1. 层级定义 Thread(线程) CUDA中最基本的执行单元,对应GPU的单个CUDA核心(SP)。每个线程独立执行核函数指令,拥有独立的寄存器和局部内存空间。 Block(线程块) 由多个线程组成(通常为32的倍数),是逻辑上的并…...
postgres 导出导入(基于数据库,模式,表)
在 PostgreSQL 中,导出和导入数据库、模式(schema)或表的数据可以使用多种工具和方法。以下是常用的命令和步骤,分别介绍如何导出和导入整个数据库、特定的模式以及单个表的数据。 一、导出数据 1. 使用 pg_dump 导出整个数据库…...

小学数学出题器:自动化作业生成
小学数学出题器是专为教师、家长设计的自动化作业生成工具,通过预设参数快速生成符合教学要求的练习题,大幅降低备课与辅导压力。跨平台兼容:支持 Windows 系统免安装运行(解压即用)。免费无广告:永…...