IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 大数据 -> JDBC介绍 -> 正文阅读

[大数据]JDBC介绍

JDBC(Java Data Base Connection)Java中提供的一套操作数据库的API接口,用于java语言连接操作数据库

常用API组件

DriverManager:这个类是驱动管理类,管理一系列数据库驱动程序,用于简历和数据库的连连接
Connection:该接口具有接触数据库所有的方法,表示和数据库通信的上下文对象
Statement:该对象将SQL提交的数据库
ResultSet:SQL查询语句的结果集通过resultSet返回给用户
SQLException:该类是和数据库交互中任何错误

JDBC使用

1、引入MySQL驱动
通过maven引入依赖

      <!--MySQL的驱动依赖-->
      <dependency>
          <groupId>mysql</groupId>
          <artifactId>mysql-connector-java</artifactId>
          <version>5.1.39</version>
      </dependency>

2、jdbc连接数据库编程

            //1、加载数据库驱动  MySQL-》com.mysql.jdbc.Driver
            Class.forName("com.mysql.jdbc.Driver");


            //连接数据库
            /**
             * DriverManager管理连接
             *Connection getConnection(String url,String user, String password)
             * url:jdbc:mysql://120.0.0.1:3306/test
             * user:用户名
             * password:密码
             */
            Connection connection = DriverManager.getConnection("jdbc:mysql://127.0.0.1:3306/test", "root", "123456");
            System.out.println("连接成功");
            
            


            //获取Statement结果
            Statement statement = connection.createStatement();

            //修改数据
            String sql1 = "update student set Sname='tulun' where SID=18 ";
            int i = statement.executeUpdate(sql1);


            //查询数据库
            String sql ="select * from student";
            ResultSet resultSet = statement.executeQuery(sql);

            //对结束处理
            while (resultSet.next()) {
                String sname = resultSet.getString("Sname");
                System.out.println(sname);
            }

            //关闭资源
            resultSet.close();
            statement.close();
            connection.close();


        } catch (Exception e) {
            System.out.println("连接失败");
            e.printStackTrace();
        }

编程步骤:
1、引入mysql-connector-java依赖包
2、引入MySQL驱动
3、DriverManager连接数据库获取Connection对象
4、通过Connection获取Statement对象进行SQL操作
5、如果是查询操作处理结果集:ResultSet
6、关闭资源

常用API

Connection接口:数据库连接的对象
获取Statement对象:
PreparedStatement prepareStatement(String sql) :获取PreparedStatement对象
Statement createStatement() :获取Statement对象
CallableStatement prepareCall(String sql) :获取CallableStatement对象
处理事务:void commit() 提交事务
Statement接口:用来执行SQL语句
boolean execute(String sql):提交SQL语句 返回Boolean类型 可以提交变更操作(插入、删除、修改)
int executeUpdate(String sql) :提交执行DML语言,返回结果表示影响数据库数据行数
ResultSet executeQuery(String sql):执行查询操作,返回的结果在ResultSet中
ResultSet():返回结果集
boolean next():判断是否还有数据,每调用一次获取的是数据库对应的一行记录
问题:PreparedStatement和Statement的区别

            //获取Statement结果
            Statement statement = connection.createStatement();
            //修改数据
            String sql1 = "update student set Sname='tulun' where SID=18 ";
            int i = statement.executeUpdate(sql1);


            /**
             * PreparedStatement
             * 采用预编译机制处理
             * SQL和参数分别传递
             * SQL上参数的位置通过占位符'?'处理
             * preparedStatement.setString 起始位置为1 
             */
            //需要将SQL和参数分别传递,采用了预编译机制 '?'占位符
            String sql2="update student set Sname = ?  where SID = ?";
            PreparedStatement preparedStatement = connection.prepareStatement(sql2);
            preparedStatement.setString(1,"tulun1");
            preparedStatement.setString(2,"18");

            preparedStatement.execute();

SQL注入问题及解决方案

SQL注入:利用非法的SQL拼接来达到入侵数据库的目的
以登录为例:

/**
     * 登录方法
     */
    boolean doLogin(String name, String passwd) {
        boolean result = false;
        try {
            //1、加载数据库驱动  MySQL-》com.mysql.jdbc.Driver
            Class.forName("com.mysql.jdbc.Driver");


            Connection connection = DriverManager.getConnection("jdbc:mysql://127.0.0.1:3306/test", "root", "123456");
            System.out.println("连接成功");

            //获取Statement结果
            Statement statement = connection.createStatement();

            //查询数据库
            String sql = "select * from user where name='"+name+"' and passwd = '"+passwd+"'";
            ResultSet resultSet = statement.executeQuery(sql);

            if (resultSet.next()) result = true;


            //关闭资源
            resultSet.close();
            statement.close();
            connection.close();


        } catch (Exception e) {
            System.out.println("连接失败");
            e.printStackTrace();
        }

        return result;
    }
        String name = "12345  ";
        String passwd = "12343563445";

        //select * from user where name = 12345 or 1=1  and passwd =  32453425

        UserDao userDao = new UserDao();
        boolean login = userDao.doLogin(name, passwd);
        if (login) {
            System.out.println("用户登录成功");
        } else {
            System.out.println("用户名或密码错误,请重新登录");
        }

在上述代码中,用户名和密码来和SQL进行拼接查询数据库,查询操作是需要用户名和密码正确才能执行成功。
将name参数写成”name = 12345 or 1=1 and passwd=1234“ name参数拼接中通过非法的SQL拼接达到修改SQL语义,就达到了入侵数据库的目的 当name = 12345或者 1=1and passwd=1234 后面中只要任何一个成绩即可 1=1 为true ,就不在判断passwd是否正确,因此对应登录操作给定用户名,不知道密码情况下也能完成登陆。

SQL注入问题解决方案:

使用PreparedStatement解决:
在这里插入图片描述
将SQL及参数分别传递到MySQL服务端,会先进行SQL语义检查
能够规避SQL注入问题,建议使用prepareStatement来处理JDBC连接数据库问题

JDBC处理事务

            /**
             * 事务操作
             * 在COnnection中也提供相应方法
             */
            connection.setAutoCommit(false); //true  自动提交  false:手动提交  首先要取消自动提交
            connection.commit();  //事务提交
            connection.rollback();//事务回滚
            /**
             *  int TRANSACTION_NONE             = 0;  不提供事务
             *int TRANSACTION_READ_UNCOMMITTED = 1;  未提交事务
             *int TRANSACTION_READ_COMMITTED = 2;   读已提交事务
             *int TRANSACTION_REPEATABLE_READ = 4;   可重复事务
             *int TRANSACTION_SERIALIZABLE = 8;      串行化事务
             * 
             * 
             * 
             * 
             * try {
             *  connection.setAutoCommit(false);
             *    sql操作
             *    
             *    connection.commit();
             *     
             * } execption(e){
             *     
             *     connection.rollback();
             * }
             * 
             */
  大数据 最新文章
实现Kafka至少消费一次
亚马逊云科技:还在苦于ETL?Zero ETL的时代
初探MapReduce
【SpringBoot框架篇】32.基于注解+redis实现
Elasticsearch:如何减少 Elasticsearch 集
Go redis操作
Redis面试题
专题五 Redis高并发场景
基于GBase8s和Calcite的多数据源查询
Redis——底层数据结构原理
上一篇文章      下一篇文章      查看所有文章
加:2021-10-15 11:51:47  更:2021-10-15 11:52:23 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/24 0:47:59-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码