JDBC(全程Java DataBase Connectivity)

概述:

我们知道, 数据库的类型有多种 , 那么java在连接各种各样的数据库时, 直接实现好连接方式并不是最优选择, 所以java向外提供了接口 , 只需要定义好规范, 由数据库开发商来实现如何连接即可

搭建JDBC :

1. 导入对应的数据库驱动包(jar)

2. 加载mysql驱动

3. 连接到数据库

4. 发送sql到数据库

5. 关闭数据库连接通道

首先我们需要向我们的项目中导入mysql的 jar包 , 它是mysql根据jdbc规范制定的连接数据库的方式, 里面是很多的实现类, 导入让我们使用这些类来编写连接程序

这里我们没有使用maven结构, 但是jar包可以先去maven官网下载,或者mysql官网

java项目怎么导入数据库 java如何导入数据库_java

java项目怎么导入数据库 java如何导入数据库_java项目怎么导入数据库_02

 

新建lib目录 , 加入jar包 , 右键 Add as library , 右键确定, 这个jar包就可以使用了

接着我们来连接数据库, java连接mysql数据库代码如下: 

public class JdbcDemo1 {

    public static void methodJdbc(int index) throws ClassNotFoundException, SQLException {
        // 通过java反射机制创建对象
        Class.forName("com.mysql.cj.jdbc.Driver");
        // 连接数据库
        Connection connection= DriverManager.getConnection("jdbc:mysql://127.0.0.1:3306/demo" +
                "?characterEncoding=utf8&useSSL=false&serverTimezone=UTC","root","root");
        //获得Satement执行sql语句
        Statement st = connection.createStatement();
        //发送sql  删除id为index的一列数据
        st.executeUpdate("delete from student where id= "+index);
        //关闭通道
        connection.close();
        st.close();
    }

    public static void main(String[] args) {
        try {
            methodJdbc(5);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

这里我们来解释一下上面代码里的那一大长段字符串到底是什么


● 这需要使用 DriverManager.getConnection() 方法来创建一个Connection对象,它代表一个物理连接的数据库 .


● Connection conn = DriverManager.getConnection(URL,USER,PASS); 
  
URL:jdbc:mysql://ip(127.0.0.1):   端口 
  (3306)/ 
  数据库名?        
  
           characterEncoding=utf8&useSSL=false&serverTimezone=UTC 
  
USER:   用户名 
  (root)     PASS:密码

mysql数据库默认3306端口, 上面例子我们连接的是demo数据库

查询的例子使用demo数据库中的student表, 表如下

 

java项目怎么导入数据库 java如何导入数据库_java项目怎么导入数据库_03

执行代码, 第五列被成功删除

现在我们来介绍第二种发送sql的方式 : 

public class JdbcDemo2 {

    public static void methodJdbc(int num,String name,String sex) throws ClassNotFoundException, SQLException {
        Class.forName("com.mysql.cj.jdbc.Driver");
        Connection connection= DriverManager.getConnection("jdbc:mysql://127.0.0.1:3306/demo" +
                "?characterEncoding=utf8&useSSL=false&serverTimezone=UTC","root","root");
        //此处采用预编译的方式,使用? 符号占位
        PreparedStatement pst = connection.prepareStatement("insert into student(num,name,sex) values (?,?,?)");
        // 1,2,3为 ? 的位置
        pst.setInt(1,num);
        pst.setString(2,name);
        pst.setString(3,sex);
        // 执行
        pst.executeUpdate();
        // 关闭通道
        connection.close();
        pst.close();
    }

    public static void main(String[] args) {
        try {
            methodJdbc(106,"李磊","男");
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

执行后 : 

java项目怎么导入数据库 java如何导入数据库_java_04

可见, 数据已经被成功插入

但是这两种方式有什么区别的 ? 

第一种发送sql我们使用的是Statement, 第二种是PreparedStatement

通过上述两种例子我们可以看出, Statement使用的是拼接字符串的方式, 第一种我们的参数是拼接进去的, 而PreparedStatement使用预编译占位的方式

第二种看似麻烦, 但极大的提高了安全性, 预防sql注入

什么是sql注入呢?

通过上面第一种例子发送sql语句, 采用字符串拼接的方式, 如果有恶意的攻击者在我们发送的sql中再次拼接sql语句 , 例如在上述第一次例子sql后拼接 "or 1 =1"

上面 1 = 1 恒成立, 那么我们第一种例子执行后我们的表将被删的干干净净

所以这样的方式是非常不安全的


而如果你使用预编译语句.你传入的任何内容就不会和原来的语句发生任何匹配的关系. 预编译模式中每个占位符处,只能插入一个值,而会过滤其他语句



所以一般我们更推荐第二种方式



关于简单的 JDBC 我们就先说到这里, 感谢阅读