java如何连接数据库? --- JDBC技术

JDBC(全程Java DataBase Connectivity)

概述:

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

搭建JDBC :

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

2. 加载mysql驱动

3. 连接到数据库

4. 发送sql到数据库

5. 关闭数据库连接通道

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

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

 

新建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表, 表如下

 

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

现在我们来介绍第二种发送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();
        }
    }
}

执行后 : 

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

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

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

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

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

什么是sql注入呢?

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

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

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

而如果你使用预编译语句.你传入的任何内容就不会和原来的语句发生任何匹配的关系. 预编译模式中每个占位符处,只能插入一个值,而会过滤其他语句
所以一般我们更推荐第二种方式
关于简单的 JDBC 我们就先说到这里, 感谢阅读


版权声明:本文为xx12321q原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。