栏目分类:
子分类:
返回
终身学习网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
终身学习网 > IT > 软件开发 > 后端开发 > Java

十七 - JDBC

Java 更新时间:发布时间: 百科书网 趣学号

十七 - JDBC
  • java操作数据库
    • 实现目标
    • 将驱动文件引入到当前工程
    • 创建连接(没有指定数据库)
    • 指定数据库,并完成添加操作
    • 使用预编译方式实现添加
    • 查询的基本操作
    • 从结果集中获得特征

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 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 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)
           

           // 每当游标向前滚动,并得到数据行之后
           

           // 如果游标没有滚动, 就报错: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 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();
                }
            }
        }
    }
}

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

转载请注明:文章转载自 www.051e.com
本文地址:http://www.051e.com/it/295723.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 ©2023-2025 051e.com

ICP备案号:京ICP备12030808号