java中JDBC的基础知识

本文介绍了Java中JDBC的基本概念,包括JDBC的作用、API接口、驱动管理及数据库连接建立。同时,讨论了SQL注入攻击的原理,并提出了防止SQL注入的方法,推荐使用PreparedStatement以提高安全性与性能。
摘要由CSDN通过智能技术生成

一、JDBC的概念

1.概念:Java数据库连接,(Java  Database  Connectivity 简称:JDBC),是java语言中用来规范客户端程序如何来访问数据库的应用程序接口,提供了诸如查询和更新数据库中数据的方法。

2.JDBC API 是一系列接口,它使得应用程序能够进行数据库连接,执行SQL语句,并得到返回结果。

3.Driver接口

 (1)java.sql.Driver 接口是所有JDBC驱动程序需要实现的接口,这个接口是提供给数据库厂商使用的,不同的数据库厂商提供不同的实现。

 (2)在程序中不需要直接去访问实现了Driver接口的类,而是由驱动管理器类(java.sql.DriverManager)去调用这些Driver实现。

      (最终是以不同的jar包出现在项目中的)

  (3)加载与注册JDBC驱动

   ①加载JDBC驱动调用Class类的静态方法forName(),向其传递要加载的JDBC驱动的类名,DriverManager类是驱动程序管理器类,负责管理驱动程序。  

forName()放驱动的类名

通常不用显示调用DriverManager类的registerDriver() 方法来注册驱动程序类的实例,因为Driver接口的驱动程序类都包含了静态代码块,在这个静态代码块中,会调用 DriverManager.registerDriver() 方法来注册自身的一个实例。

(4)常见的几种JDBC驱动类名:

       类 型                  JDBC驱动程序名称

      MySQL                  com.mysql.jdbc.Driver

      SQLServer         com.microsoft.sqlserver.jdbc.SQLServer.Driver

      ORACLE                 oracle.jdbc.driver.OracleDriver

      DB2                    com.ibm.db2.jdbc.net.DB2Driver

  eg: Class.forName(“com.mysql.jdbc.Driver”)

(5)建立连接

  可以调用DriverManager类的getConnection()方法建立到数据库的连接对象Connection.   (Connection在java.sql.Connection包下)

    Connection   conn = DriverManager.getConnection(url,username,passwor)

url用于标识一个被注册的驱动程序,驱动程序管理器通过这个URL选择正确的驱动程序,从而建立到数据库连接(username 用户名,password 密码)

(6).JDBC  URL的标准由三部分组成,各部分间用冒号分隔:

       Jdbc : mysql: // localhost:3306/test(数据库名)

       协议   子协议      子名称

. jdbc:<子协议>:<子名称>.

②协议:JDBC  URL中的协议总是jdbc

子协议:子协议用于标识一个数据库驱动程序

④.子名称:一种标识数据库的方法,子名称可以依不同的子协议而变化,用子名称的目的是为了定位数据库提供足够的信息

个Connection 对象代表个数据库连接如果获取到了Connection,说明连接到了数据库

(7).常用数据库对应的JDBC  URL

RDBMS           URL格式

MySQL        jdbc:nysql://[hostName]:[portNumber][databaseName] 中括号要被替换的(IP地址)

SQLServer     jdbc:sqlserver://[hstName]:[portNumber];

                       DatabaseName=[databaseName]

ORACLE     jdbc:oracle:thin:@hostName:[porNumber]:[databaseName]

DB2           jdbc:db2:[hostName]:[portNumber]//[databaseName]

[hostName]:ip地址,一般本127.0.01

[portNumber]:数据库服务的端口,一般情况:mysql为3306;SQLServer为1433

[databaseName]:我们所建立的数据库的名称

(8).访问数据库

数据库连接被用于向数据库服务器发送命令和SQL语句,在连接建立后,需要对数据库进行访问执行SQL语句

java.sql中有3个接口分别定义了对数据库的调用的不同方式:

Statement    PrepatedStatement     CallableStatement

4.Statement.接口

通过调用Connection对象createStatement()方法创建对象,该对象用于执行静态的SQL语句,并且返回执行结果

Statement接口中定义了下列方法用于执行SQL语句

ResultSet excuteQuery(String sql())  查询的

Int  excuteUpdate (String sql())   更新的

(更新有三个,增  删  改)

5.PrepatedStatement

可以通过调用Connnection对象的PreparedStatement()方法获取

①PreparedStatement接口是Statement的子接口,它表示一条预编译过的SQL语句

②PreparedStatement对象所代表的SQL语句中的参数用问号(?)来表示调用

③PreparedStatement对象的setxxx()方法来设置这些参数  setxxx()方法有两个参数

(1)参数是设置的sql语句中的参数的索引从1开始

(2)设置的sql语句种的参数的值

6. PreparedStatement和Statement区别

(1)代码的可读性可维护

(2)PreparedStatement能最大可能提高性能:

①DBServer会对预编译语句提供性能优化

②PreparedStatement可以防止SQL注入

7.ResultSet 接口

(1).通过调用Statement对象的excuteQuery()方法创建该对象。Resultset对象以逻辑表格的形式封装了执行数据库操作的结果集,Resultset接口由数据库厂商实现。

(2).Resultset对象维护了一个指向当前数据行的游标,初始的时候,游标在第一行之前,可以通过Resultset对象的next()方法移动到下一行。

(3).Resultset接口的常用方法:

   Boolean  next()  获取数据

   Sting   getString()

    Int     getInt()

8.释放关闭资源

Connection  PreparedStatement   statement   Resultset等资源使用完毕后必须进行关闭,类似IO流关闭是一样的,常使用close()方法进行关闭

9.使用直连操作数据库              

<1>加载jdbc驱动程序(项目中添加驱动包)

<2>使用DriverManger建立到数据库的连接

<3>准备sql语句

<4>使用Statement访问数据库

<5>使用ResultSet或者int接收访问数据库的反馈结果

<6>对结果进行输出或展示

<7>关闭资源

SQL注入攻击

1.当应用程序使用输入内容来构造动态,sql语句以访问数据库时,会发生sql注入攻击,所谓的SQL注入,就是通过把SQL命令插入到Web表单递交或输入域或页面请求的查询字符串,最终达到欺骗服务器执行恶意的SQL命令。

2.Stringsql=”select  id from  users where     username=””+username+“ ” and password=””+password+””;

这里的username和password都是我们存取从web表单获得的数据,来看一下简单地注入,如果我们在表单中username的输入框中输入 or 1=1- ,password的表单中随便输入一些东西,假如这里输入123,此时我们所执行的sql语句为:

select id from users where username=”or 1=1- and password=’123’”

因为1=1是true,后面and password=’123’被注释掉了,所以完全跳过了sql验证

3.如何防止SQL注入攻击

(1)Sql注入攻击是指利用设计上的漏洞,在目标服务器上运行_Sql 语句以及进行其他方式的攻击,动态生成Sql语句时没有对用户输入的数据进行验证是Sql注入攻击得逞的主要原因。

(2)对于Java数据库连接JDBC而言SQL注入攻击只对Statement有效,对preparedStatement是无效的,这是因为PreparedStatement不允许在不同的插入时间改变查询的逻辑结构。

4. PreparedStatement相对Statement有以下优点:

      (1). 防注入攻击、   
      (2).多次运行速度快

      (3)防止数据库缓冲区溢出,

      (4).代码的可读性可维护性好.

这四点使得PreparedStatement成为访问数据库的语句对象的首选,缺点是灵活性不够好,有些场合还是必须使用Statement.

5.此类SQL注入攻击可以使用两种方案:
(1).对提交的动态Sql语句检查是否含有’or 1=1’日’等类似情况,并做出相应禁止措施。
(2)使用PerparedStatement替换Statement.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值