iis服务器助手广告广告
返回顶部
首页 > 资讯 > 数据库 >由浅到深学习JDBC一
  • 679
分享到

由浅到深学习JDBC一

2024-04-02 19:04:59 679人浏览 独家记忆
摘要

JDBC:虽然由于快节奏的开发,编程速度的追求,越爱越多的mvc框架出现,比如持久层的hibernate,mybatis等等,他们对Dao层的支持都很强大,既快速,又简便。但是他们的底层同样是使用了JDBC

JDBC:


虽然由于快节奏的开发编程速度的追求,越爱越多的mvc框架出现,比如持久层的hibernate,

mybatis等等,他们对Dao层的支持都很强大,既快速,又简便。但是他们的底层同样是使用了JDBC,

为了追求高速简便,我们可以不使用JDBC,但一定要了解JDBC。了解JDBC也有助于学习其他持久层框架。


java和数据库交互需要中间程序作为中转。在很早以前,数据库厂商还没有一套统一的api作为

java语言和数据库的接口,开发程序是一件很头疼的事。对不同的数据库需要写不同的程序来作为交互。

     java访问-----oracle程序-----oracle数据库

     java访问------Mysql程序------mysql数据库

     java访问-------db2程序--------db2数据库

那到底什么是JDBC呢:

    JDBC是代表Java数据库连接,这对java编程语言和广泛的数据库之间独立于数据库的连接标准的Java API

     有了JDBC开发就统一了很多。

     java访问-----JDBC程序-----oracle数据库

     java访问------JDBC 程序------mysql数据库

     java访问------JDBC 程序--------db2数据库


以下简介JDBC针对oracl和mysql数据库。

oracle提供的jdbc接口的实现类-------ojdbc5.jar------jdk5.0  ojdbc6.jar-----jdk6.0

mysql提供的jdbc接口实现类--------mysql-connector-java-6.0.6

如果要开发JDBC程序,必然少不了这些jar包。下载可以去官网

https://dev.mysql.com/downloads/connector/


JDBC常用API简介:

java.sql.Connection:代表一个数据库连接;

java.sql.Statement:发送sql语句1至数据库;(发送sql的工具

DriverManager:(类) 管理多个数据库驱动类

java.sql.ResultSet:结果集,存放查询语句执行后返回的数据结果


下图1.0为JDBC访问数据库流程


                                                图1.0




由浅到深学习JDBC一



JDBC开发步骤

1: 加载驱动

如果是oracle数据库:

将oracle ojdbc.jar 复制到项目里,点击项目,右键build path --add to buidpath 

Class.forName("oracle.jdbc.OracleDriver");

如果是mysql数据库:

将mysql  mysql-connector-java-6.0.6-bin 复制到项目里,build path --add to buidpath 

Class.forName("com.mysql.jdbc.Driver") ;   

2:连接数据库

     user:root----数据库用户名

     passWord:root------数据库密码

     url: oracle ----协议 :子协议 :thin:@ip:端口:SID(SID数据库的实例名)。

     eg:String url = "jdbc:oracle:thin:@localhost:1521:XE";

     url:mysql ------ 协议:子协议://ip:端口:数据库名

   eg:String url = "jdbc:mysql://localhost:3306/zdx";


3:准备sql

     sql字符串中不能有分号;

4:Statement将sql发送至数据库

      int i=  executeUpdate(sql); //返回受影响的行数

5:如果是查询语句,返回结果集,处理ResultSet。

6:关闭连接,释放资源,按照先打开后关闭的原则。


以上6步骤时开发JDBC程序的标准步骤。


ResultSet结果集简介及使用方法:

     ResultSet结果集:存放查询结果数据。

     ResultSet rs = Statement.executeQuery();

     rs指针初始位置在第一行数据之前

     boolean rs.next(): ,

     将rs的指针向下移动一位,当前行无数据返回false,有数据返回true,并获得查询数据。

     提供一组getXXX(int列序号或String列名)方法用于取得数据


以上是JDBC简介,下面是JDBC例子,例子才是王道。

JDBC1.0版本------是1.0版本。后面还会有更优秀的版本娓娓道来!


JDBC_ResultSet.java

public class JDBC_ResultSet {

       public static void main(String[] args) throws ClassNotFoundException, SQLException {

             //1:加载驱动

             //Class.forName("oracle.jdbc.OracleDriver");

             Class.forName("com.mysql.jdbc.Driver");

             //2:获得数据库连接

             String user = "root";

             String password = "root";

             //String url = "jdbc:oracle:thin:@localhost:1521:XE";

             String url = "jdbc:mysql://localhost:3306/zdx?serverTimezone=UTC";

             Connection conn = DriverManager.getConnection(url,user,password);

             //3:准备sql

             String sql = "select * from student";

             //4:创建Statement,发送sql

             Statement stm = conn.createStatement();//获的statement对象

             //5:如果是查询,处理结果集

             ResultSet rs = stm.executeQuery(sql);

             while(rs.next()){

                    int id = rs.getInt(1);

                    String name = rs.getString(2);

                    int age = rs.getInt(3);

                    String phone = rs.getString(4);

                    System.out.println(id+"---"+name+"---"+age+"---"+phone);

             }

             //6:关闭连接,释放资源,原则,先打开后关闭

             stm.close();

             conn.close();

             

       }

}



到了此处,我们的JDBC1.0已经写完了,但是为什么说是1.0呢,因为这个版本有一个很大的漏洞。

没错,那就是——依赖注入问题。

===================华丽丽的分割线==============================

下面我们可以看这个例子


JDBC_Statement.java


public class JDBC_Statement {

       public static void main(String[] args) throws Exception {

             

             Scanner sc = new Scanner(System.in);

             System.out.println("请输入卡号");

             String card_id = sc.nextLine();

             System.out.println("请输入密码");

             String pwd = sc.nextLine();

             //1:加载驱动

             Class.forName("com.mysql.jdbc.Driver");

             //2:获得数据库连接

             String user = "root";

             String password = "root";

             String url = "jdbc:mysql://localhost:3306/zdx?serverTimezone=UTC";

             Connection conn = DriverManager.getConnection(url,user,password);

             //3:准备sql

             String sql = "select * from account where card_id ="+card_id

                                 +" and password = '"+pwd+"'";

             System.out.println(sql);

             //4:创建Statement,发送sql

             Statement stm = conn.createStatement();//获的statement对象

             //5:如果是查询,处理结果集

             ResultSet rs = stm.executeQuery(sql);

             if(rs.next()){

                    System.out.println("可以取钱了");

             }else{

                    System.out.println("密码账户不正确");

             }

             //6:关闭连接,释放资源,原则,先打开后关闭

             stm.close();

             conn.close();

       }

}



这是一个银行取钱的例子,如代码所写。

数据库有这样一张account表,数据和字段如下:


由浅到深学习JDBC一

现在在控制台输入卡号密码,卡号密码正确即可取钱,

错误即提示账户不正确。


现在控制台输入正确卡号密码


由浅到深学习JDBC一

然后,我输入错误的卡号密码竟然也可以取钱!输入错误的卡号 “123 or 1=1 -- ”密码 "zxc"结果如下

由浅到深学习JDBC一


可见依然能访问数据库,这对于银行可是致命性错误,密码错误还可以取钱。

这就是依赖注入引起的著名错误。

依靠人为输入破坏sql结构.

select * from account where id = 1001 or 1=1 -- and password = 'xxx'

这条sql里,其中--是sql里的注释 or 1=1 永远为真并且还是or连接,

所以这条sql只执行到 or 1=1 ,1=1又是恒等。所以跳过了密码。


为了解决这个问题,我们就要说PreparedStatement!


PreparedStatement简介及使用


PreparedStatement构建动态SQL,通过PreparedStatement执行SQL语句,解决注入***。

PreparedStatement是Statement的子接口。

通过连接创建PreparedStatement,创建时将SQL语句中发生变化的部分用占位符“?“ 代替。

功能:和statement一样,发送sql语句。 

          但是执行多个同构sql效率高。同构sql能省去①②③步骤。

使用步骤:

     1.创建pstm

     String sql = "select * from account where card_id = ? and password = ?"

     PreparedStateement pstm = conn.prepareStatement(sql);

          ①验证权限

          ②验证语法

          ③将sql转换内部指令

2.绑定参数

     pstm.setInt(1,值);

     pstm.setString(2,值);

3.发送绑定参数至DB数据库

     pstm.executeUpdate();//曾删改

     pstm.executedQuery();//查询

          ④执行内部指令操作数据库

mysql内部执行sql步骤:

          ①验证权限

          ②验证语法

          ③将sql转换内部指令

          ④执行内部指令操作数据库

使用PareparedStatement解决注入***问题后的代码如下:

JDBC2.0版本 是2.0版本>_< 。后面还会有更优秀的版本娓娓道来!

JDBC_PreparedStatement.java


public class JDBC_PreparedStatement {

       public static void main(String[] args) throws Exception {

             

             Scanner sc = new Scanner(System.in);

             System.out.println("请输入卡号");

             String card_id = sc.nextLine();

             System.out.println("请输入密码");

             String pwd = sc.nextLine();

             //1:加载驱动

             //Class.forName("com.mysql.jdbc.Driver");

             //2:获得数据库连接

             String user = "root";

             String password = "root";

             String url = "jdbc:mysql://localhost:3306/zdx?serverTimezone=UTC";

             Connection conn = DriverManager.getConnection(url,user,password);

             //3:准备sql

             String sql = "select * from account where card_id =? and password =?";

             PreparedStatement pstm = conn.prepareStatement(sql);

             pstm.setInt(1, Integer.valueOf(card_id));

             pstm.setString(2, pwd);

             //5:如果是查询,处理结果集

             ResultSet rs = pstm.executeQuery();

             if(rs.next()){

                    System.out.println("可以取钱了");

             }else{

                    System.out.println("密码账户不正确");

             }

             //6:关闭连接,释放资源,原则,先打开后关闭

             rs.close();

             pstm.close();

             conn.close();

       }

}

现在用PreparedStatement程序执行,输入卡号,密码


由浅到深学习JDBC一


出现异常,不会再出现密码错误却取钱的问题了!!!


总结对比一下 Statement 和PreparedStatement




Statement

PreparedStatement

关系

父接口

子接口

安全

存在注入隐患

解决sql注入

效率

执行异构sql快

执行同构sql快


至此JDBC2.0结束。JDBC基本内容结束,以下是JDBC进阶内容。和优化版JDBC例子。


=====================华丽丽的分割线===========================


由于 篇幅有限,后续部分请参阅下篇博客。由浅到深学习JDBC二

不妥之处恳请读者批评指正,共同进步。

您可能感兴趣的文档:

--结束END--

本文标题: 由浅到深学习JDBC一

本文链接: https://www.lsjlt.com/news/40515.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • SQL注入宽字节注入由浅到深学习
    目录前言基础知识宽字节宽字节注入例子例题一例题二SQLMAP应用结语前言 突然想起来之前讲SQL注入时忘记讲一下这个宽字节注入了,因为这个知识点还是挺重要的,所以本文就带大家了解一...
    99+
    2023-02-24
    SQL宽字节注入 SQL 注入
  • 由浅入深学习TensorFlow MNIST 数据集
    目录MNIST 数据集介绍LeNet 模型介绍卷积池化 (下采样)激活函数 (ReLU)LeNet 逐层分析1. 第一个卷积层2. 第一个池化层3. 第二个卷积层4. 第二个池化层5...
    99+
    2024-04-02
  • Java由浅入深学习数组的使用
    目录一、前言二、数组的定义1.概述2.静态初始化数组3.动态初始化数组4.总结三、数组的属性1.访问2.长度3.遍历四、内存图1.单数组内存图2.多数组内存图3.数组指向相同内存五、...
    99+
    2024-04-02
  • JDBC获取数据库连接由浅入深
    添加MySQL驱动: 不同的数据库厂商都会有自己的实现java.sql.Driver接口的驱动程序,例如mysql的实现就是com.mysql.jdbc.Driver,将mysql-...
    99+
    2024-04-02
  • Python学习 :深浅拷贝
    深浅拷贝   一、浅拷贝 只拷贝第一层数据(不可变的数据类型),并创建新的内存空间进行储蓄,例如:字符串、整型、布尔 除了字符串以及整型,复杂的数据类型都使用一个共享的内存空间,例如:列表 列表使用的是同一个内存地址,指向原拷贝的值,即使...
    99+
    2023-01-30
    深浅 Python
  • opencv深入浅出了解机器学习和深度学习
    目录机器学习kNN算法图解kNN算法用kNN算法实现手写数字识别SVM算法图解SVM算法使用SVM算法识别手写数据k均值聚类算法图解k均值聚类算法使用k均值聚类算法量化图像颜色深度学...
    99+
    2024-04-02
  • C#异步编程由浅入深(一)
    目录一、什么算异步?二、在编程中的异步三、原始的异步编程模式之回调函数1、回调函数一、什么算异步? 广义来讲,两个工作流能同时进行就算异步,例如,CPU与外设之间的工作流就是异步的。...
    99+
    2024-04-02
  • 《深入浅出深度学习:原理剖析与pytho
    8.1 生物神经元(BN)结构 1、人脑中有100亿-1000亿个神经元,每个神经元大约会和其他1万个神经元相连 2、细胞体:神经元的主体,细胞体=细胞核+细胞质+细胞膜,存在膜电位 3、树突:从细胞体向外延伸出许多突起的神经纤维。输入...
    99+
    2023-01-31
    深入浅出 深度 原理
  • python学习笔记:第7天 深浅拷贝
    目录 1. 基础数据类型补充 2. set集合 3. 深浅拷贝 1. 基础数据类型补充 (1)join方法 join方法是...
    99+
    2023-01-30
    深浅 学习笔记 python
  • Java线程池由浅入深掌握到精通
    目录1.为什么使用线程池?2.线程池的好处:3.线程池使用的场合4.创建和停止线程5.停止线程池的方法6.暂停和恢复线程池1.为什么使用线程池? 反复创建线程开销大,可以复用线程池 ...
    99+
    2024-04-02
  • Go语言在人工智能:从机器学习到深度学习
    go语言在人工智能中广泛应用,包括在机器学习和深度学习中。文章介绍了go语言在机器学习中的库,如gonum和scikit-go,并展示了一个使用go语言训练逻辑回归模型的实用案例。此外,...
    99+
    2024-04-08
    人工智能 机器学习 python go语言
  • Python基础学习之深浅拷贝问题及递归函数练习
    目录一、深浅拷贝问题二、递归函数练习1. 求阶乘2. 猴子吃桃问题3. 打印斐波那契数列一、深浅拷贝问题 在实际工作中,经常涉及到数据的传递,在数据传递使用过程中,可能会发生数据被修...
    99+
    2024-04-02
  • php学习(一):从基础PHP到高级PHP知识,一站式学习
    1.composer常用命令 composer list --help list命令的帮助 composer list 显示包信息 ...
    99+
    2023-09-05
    php sql 中间件
  • 深入浅出带你学习IIS中间件常见漏洞
    前言 在渗透过程中我们经常会思考如何去进行渗透,假如给了我们一个有很多中间件的网站我们要如何进行渗透呢?于是本人准备写一些包含常见中间件漏洞攻击的总结,希望可以帮到大家在面临不同渗透环境时会有渗透思路...
    99+
    2023-09-13
    学习 中间件 php
  • 解密ASP:深入浅出,循序渐进的学习之旅
    ASP.NET 是微软开发的一种用于构建动态网站和应用程序的服务器端技术。它提供了加密和解密功能,以保护敏感数据免遭未经授权的访问。本指南将逐步指导您了解 ASP 中加密和解密的原理和实践。 加密 加密是一种将明文(可读文本)转换为密文(...
    99+
    2024-03-14
    ASP基础
  • 通过一篇文章由浅入深的理解JSONP并拓展
    目录简单描述层层深入真相浮现相关拓展:JSONP攻击1.JSONP 跨域劫持2.JSONP 跨域劫持token 实现CSRF3.Referer 头的绕过参考链接总结简单描述 JSON...
    99+
    2024-04-02
  • PyTorch深度学习LSTM从input输入到Linear输出
    目录LSTM介绍LSTM参数InputsOutputsbatch_first案例LSTM介绍 关于LSTM的具体原理,可以参考: https://www.jb51.net/artic...
    99+
    2024-04-02
  • 一篇文章带你深入学习Python函数
    目录函数的特性:函数是对象:函数可以删除:总结函数的特性: 函数是对象函数可以删除函数名字和函数本身完全是分开的函数因为是对象,可以结合数据结构使用函数因为是对象,可以作为函数参数函...
    99+
    2024-04-02
  • Java8深入学习系列(一)lambda表达式介绍
    前言最近在学习java8,所以接下来会给大家介绍一系列的Java8学习内容,那么让我们先从lambda表达式开始。众所周知从java8出现以来lambda是最重要的特性之一,它可以让我们用简洁流畅的代码完成一个功能。 很长一段时间java被...
    99+
    2023-05-31
    java8 lambda表达式 ava
  • 服务器上运行跑深度学习代码(一)
    文章目录 重现论文里的代码更新服务器python版本程序提示torch 找不到CUDA!!!文件中路径的选择batch size 的设置与程序的运行有关系? 重现论文里的代码 我准备复...
    99+
    2023-09-12
    深度学习 服务器 python
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作