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语句传“值”。