Java之JDBC

JDBC是什么

JDBC(Java DataBase Connectivity,java数据库连接)是一种用于执行SQL语句的Java API ,它是sun公司制定的一套接口,它的本质就是一套接口。

为什么sun制定一套JDBC的接口?

 因为每一个数据库的底层实现原理不一样。

Oracle数据库有自己的原理。Mysql数据酷有自己的原理。

......

每一个数据库产品都有自己独特的实现原理

sun公司制定出一套接口,各个数据库厂家负责对JDBC接口的实现

而我们程序员不用关注数据库是怎样实现,我们只需要关注JDBC接口就可以了。

如下图所示:

在开发前,我们需要下载对应数据库的驱动jar包,进行配置

JDBC编程的步骤(重点)

第一步:注册驱动(告诉java程序,即将要连接的是哪个品牌的数据库)

第一种方式:不常用

如图所知,在java.sql包下的一个类,叫做DriverManager.它有一个叫做registerDriver(Driver driver)的一个方法.

             registerDriver(Driver driver)里面的Driver是一个接口,它没有办法new对象,所以我们通过它的实现类

com.mysql.jdbc.Driver.他们的名字相同,包名不同

            (java.sql.Driver) Driver driver=new com.mysql.jdbc.Driver();//父类引用指向子类对象

              DriverManger.registerDriver(driver)

由于registerDriver有异常所以需要处理,通过try...catch...

看第二种方式:(常用)

在JDBC提供的源码中我们可以看到:

Driver实现类的静态代码块中已经实现了对驱动的注册。我们只需要加载这个Driver类就可以了

所以我们通过反射的方式来获得

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

第二步:获取连接(表示jvm进程和数据库进程之间的通道打开了,数据进程建的通信)

String url="jdbc:mysql://localhost:3306/数据库名";//统一资源定位符(网络中某个资源的绝对路径)

String user="";

String password="";

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

getConnection方法依然有异常,继续处理

第三步:获取数据库操作对象(专门执行sql语句的对象)

Statement stmt=conn.createStatement();

createStatement方法依然有异常,继续处理

第四步:执行sql语句(DQL  DML...)

ResultSet rs=stmt.excuteQuery(sql);

第五步:处理查询结果集(当第四步执行的是查询SELECT语句时,才有第五步)

while(rs.next){

}

第六步:释放资源(使用完资源后一定要关闭)

为了保证资源一定释放,在finally语句块中关闭资源

并且遵循从小到大依次关闭,分别对其try...catch

finally {

    if (statement!=null) {
        try {
            statement.close();
        } catch (SQLException e) {
            e.printStackTrace();
        }
    }
    if (connection!=null) {
        try {
            connection.close();
        } catch (SQLException e) {
            e.printStackTrace();
        }
    }
}

 

SQL注入问题

SQL注入漏洞指的是在已知用户名但不知道密码的情况下,还能登陆。package com.dream.demo4;
 
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.Statement;
 
import org.junit.Test;
 
import com.jdbc.dream.utils.JDBCutils;
 
public class JDBCDemo {
    
    @Test
    public void demo() {
        boolean flag = JDBCDemo.login("aaa' or '1=1", "sadfsfsdf");
        if(flag) {
            System.out.println("登陆成功");
        }else {
            System.out.println("登陆失败");
        }
    }
    
    public static boolean login(String username,String password) {
        Connection conn = null;
        Statement stat = null;
        ResultSet res = null;
        boolean flag = false;
        try {
            conn = JDBCutils.getConnection();
            stat = conn.createStatement();
            // 编写SQL语句
            String sql = "select * from user where username ='"+username+"' and password ='"+password+"'";
            res = stat.executeQuery(sql);
            if(res.next()) {
                flag = true;
            }else {
                flag = false;
            }
        } catch (Exception e) {
            
        } finally {
            JDBCutils.release(res, conn, stat);
        }
        return flag;
    }
}

即使密码乱输入也能够登陆成功,这就是SQL注入漏洞,用户可以在文本框中输入aaa' or '1=1。这样就能随意登陆成功了。

导致SQL注入的根本原因是什么?

用户输入的信息中含有sql语句的关键字,并且这些关键字参与sql语句的编译过程,导致sql语句的原意被扭曲,进而达到sql注入

解决sql注入问题

只要用户提供的信息不参与sql语句的编译过程,问题就解决了

即使用户提供的信息中含有SQL语句的关键字,但是么有参与编译,不起作用

要想用户信息不参与sql语句的编译,那么必须使用java.sql.PreparedStatement

PreparedStatement接口继承了java.sql.Statement,属于预编译的数据库操作对象

它的原理是:预先对sql语句的框架进行编译,然后再给sql语句传“值”。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值