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

java操作数据库

? 在这里插入图片描述
JDBC -> 持久层框架(myBatis/hibernate)

  1. 设计思想
  2. 操作(增删改/ 查询)

在这里插入图片描述

实现目标

  1. java和数据库MySQL的连接(Connection)

  2. 以参数方式实现DML操作

  3. 实现查询

将驱动文件引入到当前工程

  1. 将驱动文件文件拷贝到工程中

在这里插入图片描述

  1. 选择 Add as Library

在这里插入图片描述

  1. 在工程结构中查看添加情况:

在这里插入图片描述

连接示意图

在这里插入图片描述

创建连接(没有指定数据库)

public class ConnDemo {

    public static void main(String[] args) {
        // 连接操作, 本质就是在给Connection对象进行实例化

        // 1. 准备驱动程序(mysql-connector-java)
        //2. 引入到当前工程  Add as library
        //3. 目的: 直接在程序中可以使用jar包中的类

        // java 使用驱动(反射机制)  得到一个Connection实例
        // 通过反射方式获取驱动的实例
        // 5.1 com.mysql.jdbc.Driver
        // 8.0 com.mysql.cj.jdbc.Driver

        Connection connection = null;

        try {
            // 反射操作: 通过类的限定名在内存中加载, 并实例化
            // DriverManager会自动执行, 所以该 步骤可以省略
            Class.forName("com.mysql.jdbc.Driver");

            //创建连接
            // DriverManager : 驱动程序管理器
            // 通过配置参数和数据库建立连接的过程中,DriverManager会自己在class中寻找合适的驱动程序
            // http://www.baidu.com:80?
            // 协议:mysql:jdbc:
            // 地址:localhost/127.0,0,1
            // 端口: 3306(可以省略, 默认)
            // 参数部分: 参数之间用&连接
            // 参数1:  useSSL 是否使用SSL信任的加密连接方式
            // 参数2:连接数据库使用的字符集
            // 参数3 : 设置时区,设为CST(中国时区) UTC:国际标准
            String url = "jdbc:mysql://localhost:3306?useSSL=false&characterEncoding=UTF-8&serverTimezone=CST";
            String username="root";
            String password = "root";
            connection = DriverManager.getConnection(url,username,password);
            
            System.out.println("连接数据库成功");

        } catch (ClassNotFoundException e) {
            System.out.println("驱动程序不存在");
        } catch (SQLException e) {
            e.printStackTrace();
        }finally {
            if(connection!=null){
                try {
                    connection.close();
                } catch (SQLException e) {
                    e.printStackTrace();
                }
            }
        }

    }
}

指定数据库,并完成添加操作

public class PreparedStatDemo {

    public static void main(String[] args) {


        Connection connection = null;
        /**
         * PreparedStatement 是 Statement的子类
         * Statement 可以实现SQL操作, 但有被SQL注入的风险
         * SQL注入: 是一种黑客侵入系统的手段
         */
        PreparedStatement preparedStatement = null;

        try {
            // 连接地址中体现目标数据库
            Class.forName("com.mysql.jdbc.Driver");
            String url = "jdbc:mysql://localhost:3306/usermanager?useSSL=false&characterEncoding=UTF-8&serverTimezone=CST";
            String username="root";
            String password = "root";
            connection = DriverManager.getConnection(url,username,password);
            System.out.println("连接数据库成功");

            // 通过连接对象实例化命令对象
            String sql = "insert into manager values(NULL,'张三丰',2)";
            preparedStatement = connection.prepareStatement(sql);

            // 执行SQL操作,返回影响的行数
            int i = preparedStatement.executeUpdate();
            System.out.println("i:"+i);


        } catch (ClassNotFoundException e) {
            System.out.println("驱动程序不存在");
        } catch (SQLException e) {
            e.printStackTrace();
        }finally {

            if(preparedStatement!=null){
                try {
                    preparedStatement.close();
                } catch (SQLException e) {
                    e.printStackTrace();
                }
            }

            if(connection!=null){
                try {
                    connection.close();
                } catch (SQLException e) {
                    e.printStackTrace();
                }
            }
        }

    }
}

使用预编译方式实现添加

public class PreparedStatDemo2 {

    public static void main(String[] args) {


        Connection connection = null;
        /**
         * PreparedStatement 是 Statement的子类
         * Statement 可以实现SQL操作, 但有被SQL注入的风险
         * SQL注入: 是一种黑客侵入系统的手段
         */
        PreparedStatement preparedStatement = null;

        try {
            // 连接地址中体现目标数据库
            Class.forName("com.mysql.jdbc.Driver");
            String url = "jdbc:mysql://localhost:3306/usermanager?useSSL=false&characterEncoding=UTF-8&serverTimezone=CST";
            String username="root";
            String password = "root";
            connection = DriverManager.getConnection(url,username,password);
            System.out.println("连接数据库成功");

            Scanner scanner = new Scanner(System.in);
            System.out.println("请输入用户名");
            String name = scanner.nextLine();
            System.out.println("请选择部门 1.开发一部 2.开发二部");
            int depId = scanner.nextInt();

            // 通过连接对象实例化命令对象
            // 不能用拼接方式
           // String sql = "insert into manager values(NULL,'"+name+"',2)";

            // 正确方式:使用?占位符
            // 不需要判断数据的类型, 不能添加''
            String sql = "insert into manager values(NULL,?,?)";
            // 带着参数执行预编译
            preparedStatement = connection.prepareStatement(sql);

            // 传参
            // 根据参数类型的不同, 选择不同的setXXX方法
            // 参数的位置: 从1开始
            preparedStatement.setString(1,name);
            preparedStatement.setInt(2,depId);


            // 如果没有传参, 则抛出异常: SQLException: No value specified for parameter 1
            // 执行SQL操作,返回影响的行数
            int i = preparedStatement.executeUpdate();
            System.out.println("i:"+i);


        } catch (ClassNotFoundException e) {
            System.out.println("驱动程序不存在");
        } catch (SQLException e) {
            e.printStackTrace();
        }finally {

            if(preparedStatement!=null){
                try {
                    preparedStatement.close();
                } catch (SQLException e) {
                    e.printStackTrace();
                }
            }

            if(connection!=null){
                try {
                    connection.close();
                } catch (SQLException e) {
                    e.printStackTrace();
                }
            }
        }

    }
}

查询场景分析:

  1. 带分页全查询

  2. 带条件的查询(登录)

  3. 精确查询

  4. 模糊查询

    ? select * from tableName where phone like ?

    ? prepStat.setObject(1,"%"+input+"%")

查询的基本操作

public class ResultSetDemo1 {

    public static void main(String[] args) {


        Connection connection = null;
        PreparedStatement preparedStatement = null;
        ResultSet resultSet = null;

        try {
            // 连接地址中体现目标数据库
            Class.forName("com.mysql.jdbc.Driver");
            String url = "jdbc:mysql://localhost:3306/usermanager?useSSL=false&characterEncoding=UTF-8&serverTimezone=CST";
            String username="root";
            String password = "root";
            connection = DriverManager.getConnection(url,username,password);

            Scanner scanner = new Scanner(System.in);
            System.out.println("请选择要查询部门 1.开发一部 2.开发二部");
            int depId = scanner.nextInt();
            //查询开发二部的所有的工作人员
            String sql = "SELECT id,name 姓名,depid from manager where depid=?";
            // 带着参数执行预编译
            preparedStatement = connection.prepareStatement(sql);
            preparedStatement.setObject(1,depId);

            // 查询方法:  executeQuery()
            // 返回类型 ResultSet
            resultSet = preparedStatement.executeQuery();

            // 从结果集中获取数据
            // jdbc是通过游标(cursor)
           /* System.out.println(resultSet.next());
            System.out.println(resultSet.next());
            System.out.println(resultSet.next());
            System.out.println(resultSet.next());
            System.out.println(resultSet.next());*/

           // 每当游标向前滚动,并得到数据行之后
           /* while(resultSet.next()){
                // 通过结果集获得某一个字段的值

            }*/

           // 如果游标没有滚动, 就报错:Before start of result set
            // get操作开始之前至少要滚动一次,否则就报错
            // 当没有满足条件的数据, 结果集本身不为null, 只是没有数据
            // 空结果集执行get操作报错:Illegal operation on empty result set.
            boolean next = resultSet.next();
            System.out.println("next:"+next);
            if(next){
             //   int id = resultSet.getInt(1);
                int id = resultSet.getInt("id");
                System.out.println("id:"+id);

                // 员工的姓名
               // String name = resultSet.getString("name");
                String name = resultSet.getString("姓名");
                System.out.println("name:"+name);
            }



        } catch (ClassNotFoundException e) {
            System.out.println("驱动程序不存在");
        } catch (SQLException e) {
            e.printStackTrace();
        }finally {
            if(resultSet!=null){
                try {
                    resultSet.close();
                } catch (SQLException e) {
                    e.printStackTrace();
                }
            }

            if(preparedStatement!=null){
                try {
                    preparedStatement.close();
                } catch (SQLException e) {
                    e.printStackTrace();
                }
            }

            if(connection!=null){
                try {
                    connection.close();
                } catch (SQLException e) {
                    e.printStackTrace();
                }
            }
        }
    }
}

从结果集中获得特征

public class ResultSetDemo2 {

    public static void main(String[] args) {


        Connection connection = null;
        PreparedStatement preparedStatement = null;
        ResultSet resultSet = null;
        ResultSetMetaData metaData = null;

        try {
            // 连接地址中体现目标数据库
            Class.forName("com.mysql.jdbc.Driver");
            String url = "jdbc:mysql://localhost:3306/bj268?useSSL=false&characterEncoding=UTF-8&serverTimezone=CST";
            String username="root";
            String password = "root";
            connection = DriverManager.getConnection(url,username,password);


            String sql = "SELECT * from users";
            // 带着参数执行预编译
            preparedStatement = connection.prepareStatement(sql);


            // 查询方法:  executeQuery()
            // 返回类型 ResultSet
            resultSet = preparedStatement.executeQuery();

            // 获取结果集中的元数据类型
            metaData = resultSet.getMetaData();

            // 结果集的字段的总数
            int columnCount = metaData.getColumnCount();

            // 循环打印所有的字段名
            for (int i=1;i<=columnCount;i++){
                System.out.print(metaData.getColumnLabel(i)+"\t");
            }
            // 增加一个换行
            System.out.println();


            while(resultSet.next()){
                // 循环获得每个字段的值
                // 参考查询语句, 判断出字段的情况
                for (int i=1;i<=columnCount;i++){
                    System.out.print(resultSet.getObject(i)+"\t");
                }
                System.out.println();
            }



        } catch (ClassNotFoundException e) {
            System.out.println("驱动程序不存在");
        } catch (SQLException e) {
            e.printStackTrace();
        }finally {
            if(resultSet!=null){
                try {
                    resultSet.close();
                } catch (SQLException e) {
                    e.printStackTrace();
                }
            }

            if(preparedStatement!=null){
                try {
                    preparedStatement.close();
                } catch (SQLException e) {
                    e.printStackTrace();
                }
            }

            if(connection!=null){
                try {
                    connection.close();
                } catch (SQLException e) {
                    e.printStackTrace();
                }
            }
        }
    }
}

把查询操作和集合结合

User.java:

public class User implements Serializable {
    private Integer id;
    private String name;

    public Integer getId() {
        return id;
    }

    public void setId(Integer id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    @Override
    public String toString() {
        return "User{" +
                "id=" + id +
                ", name='" + name + '\'' +
                '}';
    }

    public User(Integer id, String name) {
        this.id = id;
        this.name = name;
    }

    public User() {

    }
}
public class ResultSetDemo3 {

    public static void main(String[] args) {


        Connection connection = null;
        PreparedStatement preparedStatement = null;
        ResultSet resultSet = null;
        ResultSetMetaData metaData = null;

        try {
            // 连接地址中体现目标数据库
            Class.forName("com.mysql.jdbc.Driver");
            String url = "jdbc:mysql://localhost:3306/bj268?useSSL=false&characterEncoding=UTF-8&serverTimezone=CST";
            String username="root";
            String password = "root";
            connection = DriverManager.getConnection(url,username,password);


            String sql = "SELECT * from users";
            // 带着参数执行预编译
            preparedStatement = connection.prepareStatement(sql);


            // 查询方法:  executeQuery()
            // 返回类型 ResultSet
            resultSet = preparedStatement.executeQuery();

            // 获取结果集中的元数据类型
            metaData = resultSet.getMetaData();

            // 结果集的字段的总数
            int columnCount = metaData.getColumnCount();

            List<User> users = new ArrayList<>();
            // 游标滚动,遍历结果集
            while(resultSet.next()){
                // 有数据, 就生成一个User对象
                User user = new User();

                // 获取目标字段的值, 注入到User对象中对应的字段
                user.setId(resultSet.getInt(1));
                user.setName(resultSet.getString(2));

                // 把对象添加到集合中
                users.add(user);
            }

            System.out.println(users);



        } catch (ClassNotFoundException e) {
            System.out.println("驱动程序不存在");
        } catch (SQLException e) {
            e.printStackTrace();
        }finally {
            if(resultSet!=null){
                try {
                    resultSet.close();
                } catch (SQLException e) {
                    e.printStackTrace();
                }
            }

            if(preparedStatement!=null){
                try {
                    preparedStatement.close();
                } catch (SQLException e) {
                    e.printStackTrace();
                }
            }

            if(connection!=null){
                try {
                    connection.close();
                } catch (SQLException e) {
                    e.printStackTrace();
                }
            }
        }
    }
}

注意:回收时要与创建相颠倒

  大数据 最新文章
实现Kafka至少消费一次
亚马逊云科技:还在苦于ETL?Zero ETL的时代
初探MapReduce
【SpringBoot框架篇】32.基于注解+redis实现
Elasticsearch:如何减少 Elasticsearch 集
Go redis操作
Redis面试题
专题五 Redis高并发场景
基于GBase8s和Calcite的多数据源查询
Redis——底层数据结构原理
上一篇文章      下一篇文章      查看所有文章
加:2021-10-06 12:17:51  更:2021-10-06 12:18:58 
 
开发: 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:44:26-

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