JDBC详解学习文档

Posted 流楚丶格念

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了JDBC详解学习文档相关的知识,希望对你有一定的参考价值。


官方参考文档:https://docs.oracle.com/javase/tutorial/jdbc/basics/index.html
以下代码案例链接:
https://download.csdn.net/download/weixin_45525272/19571149


1. JDBC 入门

1.1 客户端操作 mysql 数据库的方式:

使用第三方客户端来访问 MySQL:SQLyog、Navicat、SQLWave、MyDB Studio、EMS SQL Manager for MySQL
在这里插入图片描述

使用 MySQL 自带的命令行方式、通过 Java 来访问 MySQL 数据库

1.1.1什么是 JDBC

JDBC 规范定义接口,具体的实现由各大数据库厂商来实现。

JDBC 是 Java 访问数据库的标准规范,真正怎么操作数据库还需要具体的实现类,也就是数据库驱动。每个数据库厂商根据自家数据库的通信格式编写好自己数据库的驱动。所以我们只需要会调用 JDBC 接口中的方法即可,数据库驱动由数据库厂商提供

使用 JDBC 的好处:

  1. 程序员如果要开发访问数据库的程序,只需要会调用 JDBC 接口中的方法即可,不用关注类是如何实现的。
  2. 使用同一套 Java 代码,进行少量的修改就可以访问其他 JDBC 支持的数据库

在这里插入图片描述

1.1.2 使用 JDBC 开发使用到的包:

会使用到的包说明
java.sql所有与 JDBC 访问数据库相关的接口和类
javax.sql数据库扩展包,提供数据库额外的功能。如:连接池
数据库的驱动由各大数据库厂商提供,需要额外去下载,是对 JDBC 接口实现的类

1.2 JDBC 的核心 API

接口或类作用
DriverManager1. 管理和注册数据库驱动 2. 得到数据库连接对象
Connection 接口一个连接对象,可用于创建 Statement 和 PreparedStatement 对象
Statement接口一个 SQL 语句对象,用于将 SQL 语句发送给数据库服务器。
PreparedStatemen接口一个 SQL 语句对象,是 Statement 的子接口
ResultSet接口用于封装数据库查询的结果集,返回给客户端 Java 程序

1.3导入驱动 Jar 包

在这里插入图片描述
在这里插入图片描述

1.4加载和注册驱动

加载和注册驱动的方法描述
Class.forName(数据库驱动实现类)加载和注册数据库驱动,数据库驱动由 mysql 厂商 ——“com.mysql.jdbc.Driver”

注册驱动代码:

public class Demo1  {
	public static void main(String[] args) throws ClassNotFoundException {
		//抛出类找不到的异常,注册数据库驱动
		Class.forName("com.mysql.jdbc.Driver");
	}
}

com.mysql.jdbc.Driver 源代码:

// Driver 接口,所有数据库厂商必须实现的接口,表示这是一个驱动类。
public class Driver implements java.sql.Driver { 
	public Driver() throws SQLException {
	}

	static { 
		try {
			DriverManager.registerDriver(new Driver());   
			//注册数据库驱动
		} 
		catch (SQLException var1) {
			throw new RuntimeException("Can't register driver!"); 
			}
		}
	
}

注:从 JDBC3 开始,目前已经普遍使用的版本。可以不用注册驱动而直接使用。Class.forName这句话可以省略。

2. DriverManager 类

2.1DriverManager 作用:

1)管理和注册驱动
2)创建数据库的连接

2.2类中的方法:

DriverManager 类中的静态方法描述
Connection getConnection (String url, String user, String password)通过连接字符串,用户名,密码来得到数据库的连接对象
Connection getConnection (String url, Properties info)通过连接字符串,属性对象来得到连接对象

2.3 使用 JDBC 连接数据库的四个参数:

JDBC 连接数据库的四个参数说明
用户名登录的用户名
密码登录的密码
连接字符串 URL不同的数据库 URL 是不同的,mysql 的写法:jdbc:mysql://localhost:3306/数据库[?参数名=参数值]
驱动类的字符串名com.mysql.jdbc.Driver

2.4 连接数据库的 URL 地址格式:

协议名:子协议://服务器名或 IP 地址:端口号/数据库名?参数=参数值

2.4.1MySQL 写法:

在这里插入图片描述

2.4.2MySQL 中可以简写:

前提:必须是本地服务器,端口号是 3306

jdbc:mysql:///数据库名

2.4.3乱码的处理

如果数据库出现乱码,可以指定参数: ?characterEncoding=utf8,表示让数据库以 UTF-8 编码来处理数据。

jdbc:mysql://localhost:3306/数据库?characterEncoding=utf8

2.5 案例:得到 MySQL 的数据库连接对象

2.5.1 使用用户名、密码、URL 得到连接对象

package com.sqltest; 
import java.sql.Connection;
import java.sql.DriverManager; 
import java.sql.SQLException;

/**
 * 得到连接对象*/
public class Demo2 {
    public static void main(String[] args) throws SQLException 
    { 
	    String url = "jdbc:mysql://localhost:3306/day24";
		//1)	使用用户名、密码、URL 得到连接对象
        Connection connection = DriverManager.getConnection(url, "root", "root");
		//com.mysql.jdbc.JDBC4Connection@68de145
        System.out.println(connection); 
	}
}

2.5.2 使用属性文件和 url 得到连接对象

package com.sqltest;

import java.sql.Connection; 
import java.sql.DriverManager; 
import java.sql.SQLException;
import java.util.Properties;

public class Demo3 {
    public static void main(String[] args) throws SQLException {
		//url 连接字符串
        String url = "jdbc:mysql://localhost:3306/day24";
		//属性对象
        Properties info = new Properties();
		//把用户名和密码放在 info 对象中

        info.setProperty("user","root"); 	
        info.setProperty("password","root");
        Connection connection = DriverManager.getConnection(url, info);
		//com.mysql.jdbc.JDBC4Connection@68de145 System.out.println(connection);
    }
}

3. Connection 接口:

3.1 Connection 作用:

Connection 接口,具体的实现类由数据库的厂商实现,代表一个连接对象。

3.2 Connection 方法:

Connection 接口中的方法描述
Statement createStatement()创建一条 SQL 语句对象

4. Statement 接口

4.1JDBC 访问数据库的步骤

在这里插入图片描述

  1. 注册和加载驱动(可以省略)
  2. 获取连接
  3. Connection 获取 Statement 对象
  4. 使用 Statement 对象执行 SQL 语句
  5. 返回结果集
  6. 释放资源

4.2 Statement 作用:

代表一条语句对象,用于发送 SQL 语句给服务器,用于执行静态 SQL 语句并返回它所生成结果的对象。

4.3Statement 中的方法:

Statement 接口中的方法描述
int executeUpdate(String sql)用于发送 DML 语句,增删改的操作,insert、update、delete
参数:SQL 语句:
返回值:返回对数据库影响的行数
ResultSet executeQuery(String sql)用于发送 DQL 语句,执行查询的操作。select
参数:SQL 语句
返回值:查询的结果集

4.4释放资源

  1. 需要释放的对象:ResultSet 结果集,Statement 语句,Connection 连接
  2. 释放原则:先开的后关,后开的先关。ResultSet  Statement  Connection
  3. 放在哪个代码块中:finally 块

4.5执行 DDL 操作

4.5.1需求:使用 JDBC 在 MySQL 的数据库中创建一张学生表

在这里插入图片描述

4.5.2代码:


package com.itheima;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.sql.Statement;

/**
 * 创建一张学生表*/
public class Demo4DDL {

    public static void main(String[] args) {
        //1. 创建连接
        Connection conn = null; Statement statement = null;
        try {
            conn = DriverManager.getConnection("jdbc:mysql:///day24", "root", "root");
            //2. 通过连接对象得到语句对象
            statement = conn.createStatement();
            //3. 通过语句对象发送 SQL 语句给服务器
//4. 执行 SQL
            statement.executeUpdate("create table student (id int PRIMARY key auto_increment, " + "name varchar(20) not null, gender boolean, birthday date)");
//5. 返回影响行数(DDL 没有返回值) 
		System.out.println("创建表成功");
        } catch (SQLException e) {
            e.printStackTrace();
        }
//6. 释放资源
        finally {
    //关闭之前要先判断
            if (statement != null) {
                try {
                    statement.close();
                } catch (SQLException e) {
                    e.printStackTrace();
                }
    
            }
            if (conn != null) { 
                try {
                    conn.close();
                } catch (SQLException e) {
                    e.printStackTrace();
                }
            }
        }
    }
}

4.6执行 DML 操作

需求:向学生表中添加 4 条记录,主键是自动增长

在这里插入图片描述

步骤:

  1. 创建连接对象
  2. 创建 Statement 语句对象
  3. 执行 SQL 语句:executeUpdate(sql)
  4. 返回影响的行数
  5. 释放资源

代码:

package com.sqltest;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.sql.Statement;


/**
 * 向学生表中添加 4 条记录,主键是自动增长*/
public class Demo5DML {

    public static void main(String[] args) throws SQLException {
//	1) 创建连接对象
        Connection connection = DriverManager.getConnection("jdbc:mysql:///day24", "root", "root");
//	2) 创建 Statement 语句对象
        Statement statement = connection.createStatement();
//	3) 执行 SQL 语句:
		executeUpdate(sql) ;
		int count = 0;
//	4) 返回影响的行数
        count += statement.executeUpdate("insert into student values(null, '孙悟空', 1, '1993-03- 24')");
        count += statement.executeUpdate("insert into student values(null, '白骨精', 0, '1995-03- 24')");
        count += statement.executeUpdate("insert into student values(null, '猪八戒', 1, '1903-03- 24')");
        count += statement.executeUpdate("insert into student values(null, '嫦娥', 0, '1993-03- 11')");
        System.out.println("插入了" + count + "条记录");
//	5) 释放资源
        statement.close();
        connection.close();
    }

}

4.7执行 DQL 操作

4.7.1ResultSet 接口:

作用:封装数据库查询的结果集,对结果集进行遍历,取出每一条记录。

在这里插入图片描述

接口中的方法:

ResultSet 接口中的方法描述
boolean next()1) 游标向下移动 1 行
2) 返回 boolean 类型,如果还有下一条记录,返回 true,否则返回 false
数据类型 getXxx()1) 通过字段名,参数是 String 类型。返回不同的类型
2) 通过列号,参数是整数,从 1 开始。返回不同的类型

4.7.2常用数据类型转换表

SQL 类型Jdbc 对应方法返回类型
BIT(1) bit(n)getBoolean()boolean
TINYINTgetByte()byte
SMALLINTgetShort()short
INTgetInt()int
BIGINTgetLong()long
CHAR,VARCHARgetString()String
Text(Clob) BlobgetClob()``getBlob()Clob Blob
DATEgetDate()java.sql.Date 只代表日期
TIMEgetTime()java.sql.Time 只表示时间
TIMESTAMPgetTimestamp()java.sql.Timestamp 同时有日期和时间

注意:java.sql.Date、Time、Timestamp(时间戳),三个共同父类是:java.util.Date

4.7.3需求:确保数据库中有 3 条以上的记录,查询所有的学员信息

步骤:

  1. 得到连接对象
  2. 得到语句对象
  3. 执行 SQL 语句得到结果集 ResultSet 对象
  4. 循环遍历取出每一条记录
  5. 输出的控制台上
  6. 释放资源结果:

代码:

在这里插入图片描述

package com.sqltest;

import java.sql.*;

/**
 * 查询所有的学生信息*/
public class Demo6DQL {

    public static void main(String[] args) throws SQLException {
//1) 得到连接对象
	Connection connection =DriverManager.getConnection("jdbc:mysql://localhost:3306/day24","root","root");
//2) 得到语句对象
        Statement statement = connection.createStatement();
//3) 执行 SQL 语句得到结果集 ResultSet 对象
        ResultSet rs = statement.executeQuery("select * from student");
//4)  循环遍历取出每一条记录
        while(rs.next()) {
            int id = rs.getInt("id");
            String name = rs.getString("name"); boolean gender = rs.getBoolean("gender"); Date birthday = rs.getDate("birthday");
    //5) 输出的控制台上
            System.out.println("编号:" + id + ", 姓名:" + name + ", 性别:" + gender + ", 生日:" + birthday);
        }
	    //6) 释放资源
	    rs.close(); 
	    statement.close(); 
	    connection.close();
    }
}

4.7.4关于 ResultSet 接口中的注意事项:

  1. 如果光标在第一行之前,使用 rs.getXX()获取列值,报错:Before start of result set
  2. 如果光标在最后一行之后,使用 rs.getXX()获取列值,报错:After end of result set
  3. 使用完毕以后要关闭结果集 ResultSet,再关闭 Statement,再关闭 Connection

5. 数据库工具类 JdbcUtils

什么时候自己创建工具类?

如果一个功能经常要用到,我们建议把这个功能做成一个工具类,可以在不同的地方重用。

5.1需求:

上面写的代码中出现了很多重复的代码,可以把这些公共代码抽取出来。

5.2创建类 JdbcUtil 包含 3 个方法:

  1. 可以把几个字符串定义成常量:用户名,密码,URL,驱动类
  2. 得到数据库的连接:getConnection()
  3. 关闭所有打开的资源:
    close(Connection conn, Statement stmt)close(Connection conn, Statement stmt, ResultSet rs)

JdbcUtil.java 代码:


package com.sqltest.utils; 
import java.sql.*;
/**


 * 访问数据库的工具类*/
public class JdbcUtils {

    //可以把几个字符串定义成常量:用户名,密码,URL,驱动类
    private static final String USER = "root"; 
    private static final String PWD = "root";
    private static final String URL = "jdbc:mysql://localhost:3306/day24";
    private static final String DRIVER= "com.mysql.jdbc.Driver";

    /**
     * 注册驱动*/
    static {
        try {
            Class.forName(DRIVER);
        } catch (ClassNotFoundException e) { e.printStackTrace();
        }
    }

    /**
     * 得到数据库的连接*/
    public static Connection getConnection() throws SQLException {
        return DriverManager.getConnection(URL,USER,PWD);
    }

    /**
     * 关闭所有打开的资源*/
    public static void  close(Connection conn, Statement stmt) {
        if (stmt!=null) {
            try {
                stmt.close();
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }
        if (conn!=null) {
            try {
                conn.close();
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }
    }

    /**
     * 关闭所有打开的资源*/
    public static void close(Connection conn, Statement stmt, ResultSet rs) {
        if (rs!=null) {
            try {
                rs.close();
            } catch (SQLException e) {
                e.printStackTrace();

            }
        }
        close(conn, stmt);
    }

}

5.3案例:用户登陆

5.3.1需求:

  1. 有一张用户表

  2. 添加几条用户记录

    create table user (
    id int primary key auto_increment, 
    name varchar(20),
    password varchar(20) 
    )
    
    insert into user values (null,'jack','123'),(null,'rose','456');
    
    -- 登录,  SQL 中大小写不敏感
    select * from user where name='JACK' and password='123';
    
    -- 登录失败
    select * from user where name='JACK' and password='333';
    
  3. 使用 Statement 字符串拼接的方式实现用户的登录, 用户在控制台上输入用户名和密码。

5.3.2步骤:

  1. 得到用户从控制台上输入的用户名和密码来查询数据库
  2. 写一个登录的方法
    a. 通过工具类得到连接
    b. 创建语句对象,使用拼接字符串的方式生成 SQL 语句
    c. 查询数据库,如果有记录则表示登录成功,否则登录失败
    d. 释放资源

5.3.3代码


package com.sqltest;

import com.itheima.utils.JdbcUtils; 
import javax.xml.transform.Result;
import java.sql.Connection; 
import java.sql.ResultSet; 
import java.sql.SQLException; 
import java.sql.Statement; 
import java.util.Scanner;

public 以上是关于JDBC详解学习文档的主要内容,如果未能解决你的问题,请参考以下文章

DOM探索之基础详解——学习笔记

部分代码片段

Java Jdbc的详解

JDBC的学习 3-1

关于mysql驱动版本报错解决,Cause: com.mysql.jdbc.exceptions.jdbc4Unknown system variable ‘query_cache_size(代码片段

Java JDBC程序中对于数据库事务的处理详解