Java JDBC快速上手

2023-11-19

一、JDBC介绍

JDBC,Java DataBase Connectivity,Java的数据库连接。
JDBC,本质上是由sun公司开发的一套操作数据库的接口(规范),各个数据库厂商要想使用Java连接自己的数据库,都必须按照JDBC接口的规范提供实现类。
在这里插入图片描述
在这里插入图片描述

1、JDBC快速入门

1.1、 创建Java工程,并导入jar包【驱动包】

JAR 文件就是 Java Archive File,是 Java 的一种文件格式。
JAR 文件非常类似 ZIP 文件——准确的说,它就是 ZIP 文件,所以又叫它文件包。JAR 文件与 ZIP 文件唯一的区别就是在 JAR 文件的内容中,包含了一个 META-INF/MANIFEST.MF 文件(详情单),这个文件是在生成 JAR 文件的时候自动创建的。

新建一个java工程,并在java工程下面创建lib目录
将mysql-connector-java-5.1.47.jar包拷贝到java工程的lib目录下

在这里插入图片描述
右击lib目录下面的jar包----添加到Build Path
在这里插入图片描述
在这里插入图片描述
注册驱动
其实就是将核心驱动类加载到内存中
Class.forName(“com.mysql.jdbc.Driver”);

1.2、 获取数据库连接

Connection con = DriverManager.getConnection(url,username,password);
参数就是数据库的信息

1.3、 编写sql语句
String sql = “insert into user values(null,”王五”,20,”1990-01-01”,18765.00)”;
1.4、 获取执行sql语句的Statement对象

Statement statement = con.createStatement();

1.5、 执行sql,接收返回结果
执行DML语句,使用executeUpdate方法
执行DQL语句,使用executeQuery方法
1.6 释放资源
释放数据库连接
释放Statement对象

在这里插入图片描述
在这里插入图片描述

二、JDBC 执行DQL语句

DQL语句,就是查询语句,JDBC通过executeQuery方法执行查询语句
说明:
JDBC执行DQL语句返回一个结果集(集合),需要从结果集中通过next()方法取数据
在这里插入图片描述
在这里插入图片描述
使用while循环进行优化
在这里插入图片描述
在这里插入图片描述

三、JDBC工具类封装(一)

目的:
将JDBC操作中相同的、重复的代码提取出来,就不用每次都写这些重复的代码了

要求:
1.当类被加载完毕时,就将mysql的驱动加载到内存中
2.希望能够将数据库信息(数据库名、用户名、密码) 保存到db.properties文件中,当类被加载完毕时,能够读取db.properties文件中的数据库的信息
(复习一下IO流Properties类)
3.封装常用的方法,方便以后直接调用
步骤:
1.先将驱动类、数据库名、用户名、密码保存到配置文件中,需要的时候再从配置文件读取
好处:将来如果需要修改数据库、用户名、密码的时候,只需要改配置文件即可
在这里插入图片描述
2.在JDBC工具类中,读取配置文件中的数据库信息
在这里插入图片描述
在这里插入图片描述
3.封装获取数据库连接的方法
将来想获取数据库连接时,只需要调用该方法即可,该方法会给我们返回数据库连接
在这里插入图片描述
4.封装关闭资源的方法
在这里插入图片描述
5.测试一下
在这里插入图片描述

四、JDBC事务处理

1.关闭自动提交
2.如果sql语句都执行成功,执行commit()
3.如何有任何一个sql语句出现异常,执行rollback();

模拟银行转账:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

五、用户登录案例

1.先给user表增加password列
在这里插入图片描述
在这里插入图片描述
添加测试数据
在这里插入图片描述
2.借用Scanner,提示用户输入用户名、密码,然后使用JDBC验证用户名、密码是否正确
在这里插入图片描述
在这里插入图片描述

六、JDBC预处理

预,提前
预习,提前学习
预处理,在sql语句执行前,先编译sql语句

1、 预处理解决什么问题

在这里插入图片描述
上面之所以查询出来结果,因为1’ or 1=1 or ’ 将sql语句的结构改变了
select * from user where name = ‘张无忌’ and password = ‘admin123’;
select * from user where name = ‘1’ or 3=3 or ’ ’ and password = ‘admin123’;
将条件修改为:name = ‘1’ 或者 1=1,由于1恒等于1,所以该条件就成立

可以通过1’ or 1=1 or '用户名破解我们的登录功能
要想解决这个安全问题,需要知道原因
原因在于:不能根据用户名改变sql语句的结构,由原来的的name=xxx条件,改变成:name=’1’ 或者 1= 1

2、 预处理如何使用

预处理解决安全问题思路:
1.使用占位符代替可能被攻击的地方
2.预编译sql语句,目的是:固定sql语句的结构,将来不管传递的用户名是什么,都不会再改变sql结构
3.绑定参数,将真实的内容替换到占位符
4.执行预编译的sql语句
在这里插入图片描述
在这里插入图片描述

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Java JDBC快速上手 的相关文章

  • SQLAlchemy:检查给定值是否在列表中

    问题 在 PostgreSQL 中 检查某个字段是否在给定列表中是使用IN操作员 SELECT FROM stars WHERE star type IN Nova Planet SQLAlchemy 的等价物是什么INSQL查询 我尝试过
  • 我们如何测试我们的 Java UI?

    我们正在寻找记录和回放类型的测试工具来自动化我们的一些 UI 功能测试 我们已经研究了从 Silke 到 QTP 的大多数常见嫌疑 但没有一个起作用 当需要右键单击才能从右键单击菜单中选择某些内容时 或者当您必须在网格的下拉列表中选择一个值
  • 使用 java 的 RAR 档案 [关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • 在 Java 中填充布尔数组

    作为一名相当新手的 Java 程序员 我给自己设定了一个艰巨的挑战 尝试编写一个简单的文本冒险 不出所料 我已经遇到了困难 我试图为我的 Location 类提供一个属性来存储它包含的退出 我为此使用了一个布尔数组 本质上保存代表每个出口的
  • 根据哈希值确认文件内容

    我需要 检查完整性 content文件数量 文件将写入 CD DVD 可能会被复制多次 这个想法是识别正确复制的副本 在从 Nero 等中删除它们之后 我对此很陌生 但快速搜索表明Arrays hashCode byte http down
  • ASM之前看一下maxStack指令吗?

    我正在尝试使用 ASM 库将字节代码转换为不同的格式 这可以使用 MethodVisitor 来完成 就像这个简单的测试代码一样 return new MethodVisitor ASM7 Override public void visi
  • Spring 术语中命令、表单、业务和实体对象之间的区别?

    我试图理解这些对象在松散耦合系统方面的差异 业务对象与实体对象相同吗 我可以使用 MVC 中的业务或实体对象作为我的命令对象吗 命令对象与表单对象相同吗 只是寻找 Spring 术语和用法中对象类型的说明 我在 stackoverflow
  • 在java.util中获取错误ArrayList不带参数[重复]

    这个问题在这里已经有答案了 我已经创建了一个类 Student 现在我尝试将我的 Student 对象存储在 ArrayList 中 但在编译 ArrayList 不接受参数时出现错误 我已经检查了我的代码很多次 但找不到问题所在 我的学生
  • 在Java中使用BufferedWriter写入文件时监视文件大小?

    我正在将一个可能很长的项目列表写入文件 我正在写的项目的长度是可变的 如果生成的文件大小大于10M 则应将其分成多个文件 为了提高性能 我目前使用 BufferedWriter 如下所示 final FileOutputStream fos
  • 我们必须将 .class 文件放在 Tomcat 目录中的位置

    我必须把我的 class文件在 Tomcat 目录中 在我的 Java Complete Reference 书中 他们告诉将其放入C Program Files Apache Tomcat 4 0 webapps examples WEB
  • 使用 Java 通过 HTTP 下载未知长度的文件

    我想用java下载一个HTTP查询 但是我下载的文件在下载时有一个未确定的长度 我认为这将是相当标准的 所以我搜索并找到了它的代码片段 http snipplr com view 33805 http snipplr com view 33
  • 使用 impala 按范围连接表的有效方法

    我第一个有下表 Range 包括值范围和附加列 row From To Country 1 1200 1500 2 2200 2700 3 1700 1900 4 2100 2150 The From and Toare bigint并且是
  • 在Spring-Boot中,我们如何在同一个项目中连接两个数据库(Mysql数据库和MongoDB)?

    我正在尝试创建一个 Spring Boot 项目 其中我有一个要求 我想连接到不同的数据库 MySql 和 MongoDB 我是否需要做一些特殊的事情来连接到这两个数据库 或者 spring boot 会自动计算出自己连接到这两个数据库 我
  • 设置 JAVA_HOME 变量时出现问题

    所以我刚刚下载了 Android Studio 并尝试设置 JAVA HOME 变量以便我可以运行它 我使用的是 Windows 8 并按照我找到的所有说明进行操作 但无济于事 转到高级系统设置 gt 环境变量 然后使用包含我的 jre7
  • MySQL 查询按父级排序然后子级排序

    我的数据库中有一个页面表 每个页面可以有一个父页面 如下所示 id parent id title 1 0 Home 2 0 Sitemap 3 0 Products 4 3 Product 1 5 3 Product 2 6 4 Prod
  • Storm Spout 未收到 Ack

    我已经开始使用storm 所以我使用创建简单的拓扑本教程 https github com nathanmarz storm wiki Tutorial 当我运行我的拓扑时LocalCluster一切看起来都很好 我的问题是我没有得到元组的
  • 将变量从 jenkins 传递到 testng.xml

    我想根据从詹金斯传递的变量运行测试用例 例如 选择您要运行的测试用例 测试用例一 测试用例二 在 pom xml maven 中
  • 如何告诉 IntelliJ 使用 Java 1.6 JDK 启动 gradle?

    一个简单的问题 即使经过几个小时的尝试和搜索 我也无法弄清楚 我安装了 Java 6 和 7 如何告诉 IntelliJ 使用 JDK 版本 1 6 启动 Gradle 构建 无论我做什么 IntelliJ 都会以以下方式开始我的 grad
  • spring data jpa 过滤 @OneToMany 中的子项

    我有一个员工测试实体是父实体并且FunGroup信息子实体 这两个实体都是通过employeeId映射 我需要一种方法来过滤掉与搜索条件匹配的子实体 以便结果仅包含父实体和子实体 满足要求 员工测试类 Entity name Employe
  • 使用 unnest() 返回行?

    我尝试在完成后返回一组行UPDATE 像这样的东西 UPDATE Notis new noti SET notis noti record type FROM SELECT FROM Notis WHERE user id 2 FOR UP

随机推荐