1、什么是JDBC?

JDBC是一类接口,制定了统一访问各类关系型数据库的api,屏蔽了底层数据库的差异,可以通过JDBC API 方便地实现对各种主流数据库的操作。

2、开发步骤?

访问数据库时,首先要注册和加载数据库驱动,只需加载一次,然后在每次访问数据库时创建一个Connection实例,获取数据库连接,获取连接后,执行需要的SQL语句,最后完成数据库操作时释放与数据库间的连接。

第一步:注册加载数据库驱动

此步骤的目的是告知JVM使用的是哪一个数据库的驱动。Java加载数据库驱动的方法是调用Class类的静态方法forName(),语法格式如下:

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

第二步:获得数据库连接

加载完数据库驱动后,就可以建立数据库的连接了,需要使用DriverManager类的静态方法getConnection()方法来实现。代码如下:

1
2
3
4
5
6
Class.forName("com.mysql.jdbc.Driver");
String url = "jdbc:mysql://localhost:3306/database_name";
String user = "root";
Strign password = "root"
//建立连接
Connection conn = DriverManager.getConnection(url, user, password);

  

第三步:获得语句执行对象,然后执行SQL语句,获取执行结果,最后释放资源

建立了连接之后,就可以使用Connection接口的createStatement()方法来获取Statement对象,也可以调用prepareStatement()方法获得PrepareStatement对象,通过executeUpdate()方法来执行SQL语句。

1
2
3
4
String sql = "insert into user(username, sex, address) values('张三','1','北京市')";
Statement stmt = conn.createStatement();    //创建一个Statement对象
stms.executeUpdate(sql);                   //执行SQL语句
conn.close();      

  

还可以使用PreparedStatement接口中的executeUpdate()方法,如下:

1
2
3
4
5
6
7
String sql = "insert into user(username, sex, address) values(?,?,?)";
PreparedStatement ps = conn.preparedStatement(sql);
ps.setString(1, "张三");    //为第一个问号赋值
ps.setInt(2, 1);           //为第二个问号赋值
ps.setString(3, "北京市"); //为第三个问号赋值
ps.executeUpdate();
conn.close();

  

3、PreparedStatement与Statement区别


1.PreparedStatement在使用时只需要编译一次,就可以运行多次,Statement每运行一次就编译一次,所以PreparedStatement的效率更高
2.PreparedStatement的sql语句为用?(占位符)来替换值,Statement的sql语句为字符串拼接
3.PreparedStatement解决了sql注入的问题,Statement没有解决,因为PreparedStatement有一个预编译的过程,就算传入占位符的数据中有sql关键字也都被认为是值。Statement是字符串拼接,传入的整个字符串被默认为sql语句

SQL注入攻击:

举一个简单的例子,假设有一个登录页面,用户需要输入用户名和密码,后台使用 JDBC 执行如下 SQL 语句来验证登录:

SELECT * FROM user WHERE username='xxx' AND password='yyy';

假如攻击者在用户名处输入如下内容:

xxx' OR 1=1; --

那么最终执行的 SQL 语句就会变成:

SELECT * FROM user WHERE username='xxx' OR 1=1; --' AND password='yyy';

其中 -- 表示注释掉后面的语句,此时 SQL 语句等价于:

SELECT * FROM user WHERE username='xxx' OR 1=1;