问题
- 说一下对JDBC的理解
- 代码演示连接数据库
- PrepareStatement和statement的使用
解析
- JDBC指的是 Java database connection Java数据库连接数据库管理系统。
- 问题是:
实际的数据库开放厂商有很多种,每个数据库操作指令都不一样,如果开发者直接操作,会有很高的不必要的成本和难度, - 解决方案是:
为了解决这个问题,Java语言进行统一化的管理,Java语言定义了一个接口,让数据厂商封装他们的指令,实现这个接口。而对开发者而言,我们只需要带入开发厂商的实现,一接口的方式调用即可(mysql+mysql驱动+JDBC),实现了统一管理。
2. 写代码实现数据库连接
数据库的连接共分为
- 加载驱动
- 获取连接
- 提供预处理对象
- 执行操作
- 释放资源
代码如下:
import java.sql.*;
//装载需要的信息的类
class Contant{
public static final String URL ="jdbc:oracle:thin:@127.0.0.1:1521:sid";
public static final String USERNAME="username";
public static final String PASSWORD="password";
}
//执行方法的类
public class MyConnection {
Connection connection= null;
Statement statement=null;
ResultSet query=null;
public void main(String[] args) throws SQLException {
try {
//驱动获取连接
connection = DriverManager.getConnection(Contant.URL, Contant.USERNAME, Contant.PASSWORD);
//获取预处理对象
statement = connection.createStatement();
//执行查询的SQL语句
query = statement.executeQuery("select * from table");
//遍历结果输出到控制台
while (query.next()){
int i = query.getInt("Filed");
String y=query.getString("name");
System.out.println(i+y);
}
} catch (SQLException e) {
e.printStackTrace();
} finally {
//释放资源从下到大进行
query.close();
statement.close();
connection.close();
}
}
}
3. PrepareStatement和statement的使用
大多数情况下,我们都不会按照上面的代码使用statement。我们会使用PrepareStatement来代替,有一下几个优点:
- PrepareStatement是预编译的,执行速度较快
- 代码的可读性和可维护性高
虽然使用PrepareStatement来替代Statement会使得代码多几行,但是这样的代码无论从可读性还是可维护性都比statement高很多。
代码演示:
import java.sql.*;
class Contant{
public static final String URL ="jdbc:oracle:thin:@127.0.0.1:1521:sid";
public static final String USERNAME="username";
public static final String PASSWORD="password";
}
public class MyConnection {
Connection connection= null;
PreparedStatement preparedStatement=null;
ResultSet query=null;
public void main(String[] args) throws SQLException {
try {
//驱动获取连接
connection = DriverManager.getConnection(Contant.URL, Contant.USERNAME, Contant.PASSWORD);
//SQl语句
String sql = "insert into customers(name,email,birth)" + "values(?,?,?)";
//获取预处理对象
preparedStatement = connection.prepareStatement(sql);
// 设置name字段
preparedStatement.setString(1, "ATGUIGU");
// 设置email字段
preparedStatement.setString(2, "[email protected]");
// 设置birth字段
preparedStatement.setDate(3, new Date(new java.util.Date().getTime()));
// 执行操作
preparedStatement.executeUpdate();
} catch (SQLException e) {
e.printStackTrace();
} finally {
//释放资源从下到大进行
query.close();
preparedStatement.close();
connection.close();
}
}
}
使用占位符进行数据的输入,可以防止用户的恶意的SQL语句拼接。
- 安全性高
PrepareStatement可以防止SQL注入攻击,而Statement却不能
如果使用与预编译语句,后面传入的内同不会和原来的语句发生匹配关系,使用Statement会被客户端恶意攻击,数据的泄露的风险。
//如使用statement传入下面的sql语句
query = statement.executeQuery("select * from user where name='zhangsan' and password='***' ");
/**
* 如果用户在password的位置输入的是“or 1=1”,
* 会让where的条件全部为真,查出所有用户的信息,导致用户信息泄露。
* 如果输入的是“;drop table user;" 将会有删除数据库的风险
*/
所以在我们通常使用的是PrepareStatement进行预处理执行。