谈谈Java访问MySQL:JDBC的用法

文章目录

        • 基本介绍
        • 导入jar包
        • 简要介绍连接流程和配置
        • 代码演示
        • JDBC核心组件
          • 加载数据库驱动
          • 获得连接
          • 获得Statemnet对象
          • 执行SQL语句
          • 处理结果集
          • 释放资源
        • 关于sql注入问题

基本介绍

     要想用Java操作MySQL数据库,就需要JDBC,JDBC是官方的一个jar包,提供了一系列操作数据库的接口,所以连接MySQL的第一步就是导入这个jar包。

导入jar包

这里jar包已经上传至百度云盘:
链接:https://pan.baidu.com/s/1aRqOMWw-df00dQem2XGv6A
提取码:7h8j
如果是Maven项目的话,那么直接导入依赖:

    
      mysql
      mysql-connector-java
      8.0.15
    

这里使用的是8.0.15版本

简要介绍连接流程和配置

导入好了以后就可以写代码操作数据库了,操作流程主要分为以下几个方面:

  1. 加载驱动
  2. 获得连接
  3. 通过获得的连接创建Statement对象
  4. 通过创建的Statement对象执行sql语句
  5. 释放资源

介绍完了步骤,下面介绍4个核心配置:
注意这里是根据8.0.15版本来说的

  1. 数据库驱动包的全路径:com.mysql.cj.jdbc.Driver,如果是5点几版本的,那么没有cj
  2. 请求数据库的URL:jdbc:mysql://localhost:3306/test
    最后面的test为数据库名称
    只是这样写会运行报错(时区问题,字符编码问题),所以URL这块后面还要加上问号,再跟上一些配置:
    ?useUnicode=true&characterEncoding=utf-8&useSSL=false&serverTimezone=UTC
  3. 数据库账号:一般用root用户登录时,账号都为root
  4. 数据库密码:这块填写你的数据库密码

代码演示

通过代码来演示一下:
首先看一下数据库中的表
谈谈Java访问MySQL:JDBC的用法_第1张图片
这是test数据库中的test表,表的内容如图所示。

接下来看一下代码演示:

public class ConnectMySQL {
    public static void main(String[] args) throws ClassNotFoundException, SQLException {
        //加载驱动
        Class.forName("com.mysql.cj.jdbc.Driver");
        //获得连接
        Connection connection = DriverManager.getConnection("jdbc:mysql://localhost:3306/test?useUnicode=true&characterEncoding=utf-8&useSSL=false&serverTimezone=UTC", "...用户名...", "...密码...");
        //通过获得的连接创建Statement对象
        String sql = "select * from test";
        Statement statement = connection.createStatement();
        //通过创建的Statement对象执行sql语句
        ResultSet resultSet = statement.executeQuery(sql);

        /**
         * resultSet就是返回的结果
         */
        while (resultSet.next()) {
            //如果有下一条记录

            //分别打印第1,2,3,4列,这里是从1开始计算的
            System.out.print(resultSet.getString(1)+ " ");
            System.out.print(resultSet.getString(2)+ " ");
            System.out.print(resultSet.getString(3)+ " ");
            System.out.print(resultSet.getString(4)+ " ");
        }
        //使用finaly释放资源,这里省略
    }
}

注意:

  1. 不要直接去拷贝我的代码,需要看清楚里面要配置的东西:第一步加载驱动,这里不需要改变。第二步获得连接,这里的用户名和密码要填上你的数据库用户名和密码,数据库名称也要匹配。其他的和我相同。第三步sql语句我写了一个查询语句,这里先暂时和我保持一致,等后面运行成功再去更换sql类型进行测试。最后一步是查询语句,返回的是一个查询结果的集合。
  2. 最后我遍历了结果集合,进行打印,这里的迭代器使用和集合那块的 iterator 不太一样,这里已经为你生成了迭代器,而且next方法返回的是是否还有下一个元素,如果没有就停止循环,如果有,那么本次集合就是针对该条记录来说的,getString指定第几列,列数是从1开始的。也可以直接指定列名。

来看一下运行结果:
在这里插入图片描述
和预想的相同。

JDBC核心组件

加载数据库驱动

                    Class.forName(“com.mysql.cj.jdbc.Driver”);
通过反射进行驱动类的加载。当然这里指的是版本是8点几

获得连接

                    DriverMananger.getConnection(“url”,“user”,“password”);
传递的参数包含三部分:

  1. String url,:数据库连接的URL
    格式:jdbc:数据库的子协议://ip+端口/数据库名
    eg:jdbc:mysql://localhost:3306/test 在后面加上上面提到的一些配置(避免时区,编码问题)

  2. String user, 数据库连接的用户名

  3. String password:数据库的密码

该过程返回的是connection对象

获得Statemnet对象

statement有三种实现:

  1. 创建基本的Statement对象
java.sql.Statement ->Statement statement = connection.createStatement()
  1. 创建预编译的Statement对象
java.sql.PreparedStatement->PreparedStatement preparedStatement = connection.prepareStatement("");

这种预编译的模式可以防止sql注入,什么是sql注入呢?本篇文章最后讲解这个问题

  1. 创建带有回调功能的CallableStatement对象
java.sql.CallableStatement-> CallableStatement callableStatement = connection.prepareCall();
执行SQL语句

常用执行sql有两种方式:

  1. executeQuery(sql)
    用于查询语句,上面我们所举的例子就是用的该方法
  2. executeUpdate(sql)
    用于更新语句,更新语句包括增加,删除,修改。
处理结果集

     处理结果集当我们执行的是executeQuery查询语句的时候,返回的是ResultSet的结果集合。该结果集的大概用法在代码处已经讲过,这里不再赘述。
     如果是executeUpdate更新语句的时候,返回的是int值,该int表示sql操作影响的记录数量。

释放资源

     如果执行完了sql语句而不释放资源,那么服务器的连接数会随着客户端的使用次数增多而出现问题,所以一定要记得释放连接。

关于sql注入问题

什么是sql注入问题呢?
     JDBC编程时,sql语句肯定不能写死,也就是说,sql中的条件以及拿到哪些属性都需要要我们自己来控制,那么jdbc编程就可以分为两种方式:

  1. 使用statement,拼接sql语句
  2. 使用prepareStatement执行预编译

sql注入就是第一种情况导致的,来看看是什么情况

在这里,我写一个方法来判断数据库中是否有这样的值?
数据库:
谈谈Java访问MySQL:JDBC的用法_第2张图片
     可以看到这里只有一行abc的记录,那么使用拼接的方式,看看我如何来sql注入
这里我模拟查询数据的过程,按照sql拼接的功能来说:main方法传入的如果是‘abc’,是数据库中有的,那么返回true,如果没有就返回false。

public class SQLInput {
    public static void main(String[] args) throws SQLException, ClassNotFoundException {
    	//这里我去查询有没有def...这样的数据
        System.out.println(execute("def' or 1=1 or '1'='1"));
    }
    public static boolean execute(String A) throws ClassNotFoundException, SQLException {
        //加载驱动
        Class.forName("com.mysql.jdbc.Driver");
        //获得连接
        Connection connection = DriverManager.getConnection("jdbc:mysql://localhost:3306/test?useUnicode=true&characterEncoding=utf-8&useSSL=false&serverTimezone=UTC", "root", "123456");
        //通过获得的连接创建Statement对象
        String sql = "select * from test where A='"+A+"'"  ;
        //为了直观的看到原因,打印一下sql语句
        System.out.println(sql);
        Statement statement = connection.createStatement();
        //通过创建的Statement对象执行sql语句
        ResultSet resultSet = statement.executeQuery(sql);
        if(resultSet.next()) {
            return true;
        }
        return false;
    }
}

我输入的是def’ or 1=1 or ‘1’='1
看看打印结果:
谈谈Java访问MySQL:JDBC的用法_第3张图片
返回是true,看到打印的sql你明白了吗?
所以,推荐使用Preparestatement,实行预编译,在放入值的时候就进行判断,谨防sql注入。

     到这里,基本的用法就已经讲完了,这里的用法需要按照我讲的去做。如果出现异常,那么可能是版本号,密码的问题。如果有问题解决不了,欢迎留言,我会第一时间解答。

你可能感兴趣的:(JavaSE,数据库,jdbc,java,mysql,连接,数据库)