【学习笔记】JDBC

JDBC

 

什么是数据库驱动

数据库驱动就是连接应用程序与数据库的

image-20221005162617436

如果没有数据库驱动,应用程序是无法直接到达数据库的,数据库驱动是由数据库厂商来做的

 

什么是JDBC

SUN公司为了简化开发人员对数据库的统一操作,提供了一个(Java操作数据库)规范,成为JDBC

这些规范的实现由具体的厂商去做

对开发人员,只需要掌握JDBC接口的操作即可

image-20221005163154492

需要导入数据库驱动包

 

JDBC程序

  1. 创建测试数据库

    CREATE DATABASE `jdbcStudy` CHARACTER SET utf8 COLLATE utf8_general_ci;
    ​
    USE `jdbcStudy`;
    ​
    CREATE TABLE `users`(
     `id` INT PRIMARY KEY,
     `NAME` VARCHAR(40),
     `PASSWORD` VARCHAR(40),
     `email` VARCHAR(60),
     birthday DATE
    );
    ​
     INSERT INTO `users`(`id`,`NAME`,`PASSWORD`,`email`,`birthday`)
    VALUES('1','zhangsan','123456','zs@sina.com','1980-12-04'),
    ('2','lisi','123456','lisi@sina.com','1981-12-04'),
    ('3','wangwu','123456','wangwu@sina.com','1979-12-04')
  1. 创建一个项目

  1. 导入数据库驱动

    需要将下载好的数据库驱动包 mysql-connector-java-5.1.47.jar 复制到项目中

    然后add as library

  2. 编写测试代码

    package com.lesson;
    ​
    import java.sql.*;
    ​
    public class JdbcTest {
        public static void main(String[] args) throws ClassNotFoundException, SQLException {
            //1.加载驱动
            Class.forName("com.mysql.jdbc.Driver");   //固定写法
    ​
            //2.用户信息和url
            //三个参数:useUnicode=true  支持中文编码
            // characterEncoding=utf8  设置字符集为utf8
            // useSSL=true    使用安全的连接
            String url = "jdbc:mysql://localhost:3306/jdbcstudy?useUnicode=true&characterEncoding=utf8&useSSL=true";
            String username = "root";
            String password = "123456";
    ​
            //3.连接数据库对象   Connection代表数据库
            Connection connection = DriverManager.getConnection(url, username, password);//驱动管理 去获得连接
    ​
            //4.执行sql对象   Statement执行sql对象
            Statement statement = connection.createStatement();
    ​
            //5.sql对象去执行sql
            String sql = "select * from users";
            //查询语句
            ResultSet resultSet = statement.executeQuery(sql);  // 返回结果集,结果集中封装了我们查询出来的全部的结果
            while(resultSet.next()){
                System.out.println("id:" + resultSet.getObject("id"));
                System.out.println("name:" + resultSet.getObject("NAME"));
                System.out.println("pwd:" + resultSet.getObject("PASSWORD"));
                System.out.println("email:" + resultSet.getObject("email"));
                System.out.println("birthday:" + resultSet.getObject("birthday"));
                System.out.println("============================");
            }
    ​
            //6.释放连接
            resultSet.close();
            statement.close();
            connection.close();
        }
    }

    image-20221005190520614

 

 

步骤:

  • 加载驱动

  • 连接数据库 DriverManager

  • 获得执行sql的对象 Statement

  • 获得返回的结果集

  • 释放连接

 

DriverManager

Class.forName("com.mysql.jdbc.Driver");   //固定写法
//之前的写法
DriverManager.registerDriver(new com.mysql.jdbc.Driver());

现在一般推荐第一种写法,不推荐之间的写法,

public class Driver extends NonRegisteringDriver implements java.sql.Driver {
    public Driver() throws SQLException {
    }
​
    static {
        try {
            DriverManager.registerDriver(new Driver());
        } catch (SQLException var1) {
            throw new RuntimeException("Can't register driver!");
        }
    }
}

原因就是在Driver类中,只有一段静态代码块,一旦执行力Class.forName(),这段代码就执行了

这段静态代码块中已经帮你注册过了,如果你在去主动注册的话,就相当于注册了两遍。

所以我们推荐使用Class.forName() 的方式去执行

 

URL

String url = "jdbc:mysql://localhost:3306/jdbcstudy?useUnicode=true&characterEncoding=utf8&useSSL=true";
​
//公式:
//协议名://主机名:端口号/数据库名?参数1&参数2;
//mysql 默认端口号为3306
//oralce 默认端口号为1521
//jdbc:oralce:thin:@localhost:1521:sid;     oralce的url写法

 

Connection

Connection connection = DriverManager.getConnection(url, username, password);

Connection代表数据库,它可以做数据库能做的事,如

connection.commit();  //事务提交
connection.rollback(); //事务回滚
connection.setAutoCommit(true); //设置事务自动提交

 

Statement 执行sql的对象 PrepareStatement 和它相同

statement.executeQuery(sql);   //执行查询,返回resultSet结果集
statement.executeUpdate(sql);  //更新、插入、删除都是用这个,返回受影响的行数
statement.execute(sql);  //可以执行任何sel

 

ResultSet 查询的结果集

封装了所有的查询结果

可以获得指定的数据类型

//如果不知道类型,就使用getObject()
resultSet.getObject();
//知道了列的类型,就使用指定的类型
resultSet.getString();
resultSet.getInt();
resultSet.getFloat();
resultSet.getDouble();
......

遍历,使用指针

resultSet.next();  //移动到下一个
resultSet.previous();  //移动到上一个
resultSet.beforeFirst();  //将光标移动到最前面
resultSet.afterLast();   //将光标移动到最后面
resultSet.absolute(row);  //移动到指定行

 

释放资源

resultSet.close();
statement.close();
connection.close();  //十分占资源,使用完要关闭
posted @ 2022-10-05 20:14  GrowthRoad  阅读(13)  评论(0编辑  收藏  举报