问题

  • 说一下对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来代替,有一下几个优点:

  1. PrepareStatement是预编译的,执行速度较快
  2. 代码的可读性和可维护性高
    虽然使用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, "simale@163.com");
            // 设置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语句拼接。

  1. 安全性高
    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进行预处理执行。


10-02 16:58