Java中JDBC的本质及使用详解(妹子看了都说好!!!)

前言

个人觉得JDBC在Java的学习中比较重要,实现了数据库与Java的代码的互动,所以还是写一篇文章来巩固一下

这篇文章主要解决以下几个问题
1、JDBC是什么(初识)?
2、JDBC的本质是什么?
3、JDBC怎么用(入门,方便理解)?

一、JDBC概述

为了在Java语言中提供对数据库访问的支持,Sun公司于1996年提供了一套访问数据库的标准Java类库JDBC。JDBC的全称是Java数据库连接(Java Database Connectivity)它是一套用于执行 SQL语句的Java API。应用程序可通过这套API连接到关系数据库完成对数据库中数据的査询、更新和删除等操作。

二、JDBC本质

JDBC是SUN公司制定的一套接口(interface)
目的:解耦合——>降低程序的耦合度,提高程序的扩展力

三、关于JDBC与数据库驱动的关系,请参见下图:

在这里插入图片描述

四、关于JDBC编程六步概述

1.图解

在这里插入图片描述

2.概述

第一步:加载驱动(作用为:告诉Java程序,即将连接那个品牌的数据库)

反射的方式加载数据库驱动,代码如下:

Class.forName(“com.mysql.jdbc.Driver”);

第二步: 创建连接(表示JVM的进程和数据库进程之间的通道打开)

利用java.sql.Drivermanager类中的getConnection()方法与数据库建立连接。

DriverManager.getConnection(“jdbc:mysql://数据库地址:端口号/数据库名”,”用户名”, “密码”);

第三步: 获取数据库操作对象(专门执行sql语句的对象)
利用java.sql.Connection创建用于执行SQL语句的Statement。(建议使用Statement的子类preparedStatement)

Statement statement = connection.createStatement();

第四步: 执行sql语句
利用java.sql.Statement执行SQL语句,其常用方法如下:
execute(String sql ) 该方法可以执行任意SQL语句。当且仅当执行select语句且有返回结果时该方法返回true, 其他情况下该方法返回false
executeUpdate(String sql ) 该方法常用于执行DML( INSERT、UPDATE或DELETE)和DDL语句。执行DML语句时返回受SQL语句影响的行数,执行DDL语句时返回0
executeQuery( String sql) 该方法通常执行査询语句,执行后返回代表结果集的ResultSet对象

ResultSet  resultSet = statement.executeQuery(sql);

第五步: 处理查询结果集(只有第四步执行的是查询语句时,才有处理结果集)

在从ResultSet中获取到数据库中数据后,我们就将这些数据封装到JavaBean中。在此请注意Java的数据类型与数据库的数据类型的对应关系:

数据库中的数据类型 Java的数据类型
int int
smallint short
bigint long
tityint byte
float float
double double
charvarchar String
date Date

第六步: 释放资源(使用完之后需要关闭资源。Java和数据库属于进程之间的通信,开启之后一定要关闭)
数据库资源非常宝贵,数据库允许的并发访问连接数量有限。因此,当数据库资源用完后切记释放资源。为了保证资源的释放,常在finally代码块中关闭与数据库操作相关的资源。

五、JDBC编程六步(代码演示)

请添加MySQL所需jar包(例如:mysql-connector-java-5.1.7-bin.jar)至Java项目lib文件夹中并执行Build Path,如下图所示位置:
在这里插入图片描述

1.需要处理查询结果集的JDBC实例(执行的sql语句是为查询语句时)

1.1在数据库中mydb建立student表并存入数据

sql命令如下(在数据库中mydb建立student表并存入数据):

-- 若存在数据库mydb则删除
DROP DATABASE IF EXISTS mydb;
-- 创建数据库mydb
CREATE DATABASE mydb;
-- 选择数据库mydb
USE mydb;

-- 创建学生表
CREATE TABLE student (
     studentid INT,
   studentname VARCHAR(50)
);

-- 向学生表插入数据
INSERT INTO student (studentid,studentname) VALUES (1,"张三");
INSERT INTO student (studentid,studentname) VALUES (2,"李四");
INSERT INTO student (studentid,studentname) VALUES (3,"王五");
INSERT INTO student (studentid,studentname) VALUES (4,"赵六");

DOS窗口运行结果如下:
在这里插入图片描述

1.2创建一个学生类的JavaBean(里面的元素与数据库中学生表的字段信息类型相同)

代码如下(学生类的JavaBean):

public class Student {
    
    
	private int studentID;
	private String studentName;
	public Student() {
    
    
		super();
		// TODO Auto-generated constructor stub
	}
	public Student(int studentID, String studentName) {
    
    
		super();
		this.studentID = studentID;
		this.studentName = studentName;
	}
	public int getStudentID() {
    
    
		return studentID;
	}
	public void setStudentID(int studentID) {
    
    
		this.studentID = studentID;
	}
	public String getStudentName() {
    
    
		return studentName;
	}
	public void setStudentName(String studentName) {
    
    
		this.studentName = studentName;
	}
	@Override
	public String toString() {
    
    
		return "Student [studentID=" + studentID + ", studentName=" + studentName + "]";
	}
}

1.3利用JDBC操作数据库(查询所有学生信息)

代码如下(示例):

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;

public class JDBCSelectTest {
    
    

	public static void main(String[] args) {
    
    
		JDBCSelectTest jdbcSelectTest = new JDBCSelectTest();
		jdbcSelectTest.findAllStudent();

	}

	private void findAllStudent() {
    
    
		Connection connection = null;
		PreparedStatement preparedStatement = null;
		ResultSet resultSet = null;
		try {
    
    
			// 1、启动驱动
			Class.forName("com.mysql.jdbc.Driver");
			// 2、建立连接
			connection = DriverManager.getConnection("jdbc:mysql://localhost:3306/mydb", "root", "123456");
			// 3、获取数据库操作对象
			String sql = "select * from student";
			preparedStatement = connection.prepareStatement(sql);
			// 4、执行sql语句
			resultSet = preparedStatement.executeQuery();
			// 5、处理结果集
			while (resultSet.next()) {
    
    
				Student student = new Student();
				int id = resultSet.getInt("studentid");
				String name = resultSet.getString("studentname");
				student.setStudentID(id);
				student.setStudentName(name);
				System.out.println(student);
			}
		} catch (Exception e) {
    
    
			e.printStackTrace();
		} finally {
    
    
			// 6、关闭资源
			if (resultSet != null) {
    
    
				try {
    
    
					resultSet.close();
				} catch (SQLException e) {
    
    
					e.printStackTrace();
				}
				resultSet = null;
			}

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

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

代码如下(输出):

Student [studentID=1, studentName=张三]
Student [studentID=2, studentName=李四]
Student [studentID=3, studentName=王五]
Student [studentID=4, studentName=赵六]

2.不需要处理查询结果集的JDBC实例(执行的sql语句是为增、删、改时)

JavaBean 还有数据表我继续用上面准备好的就行。
这里我只演示“增”(即向学生表中添加一条数据),其他的“删”和“改”基本过程都一样,只有sql语句和站位符位置不一样,留给大家自由探索

代码如下(示例):

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

public class JDBCAddTest {
    
    

	public static void main(String[] args) {
    
    
		JDBCAddTest jdbcAddTest = new JDBCAddTest();
		jdbcAddTest.addStudent();

	}

	private void addStudent() {
    
    
		Connection connection = null;
		PreparedStatement preparedStatement = null;
		try {
    
    
			// 1、启动驱动
			Class.forName("com.mysql.jdbc.Driver");
			// 2、建立连接
			connection = DriverManager.getConnection("jdbc:mysql://localhost:3306/mydb", "root", "123456");
			// 3、获取数据库操作对象
			Student student = new Student(5, "jack");
			String sql = "insert into student values(?,?)";
			preparedStatement = connection.prepareStatement(sql);
			preparedStatement.setString(2, student.getStudentName());
			preparedStatement.setInt(1, student.getStudentID());
			// 4、执行sql语句
			int executeUpdate = preparedStatement.executeUpdate();
			System.out.println(executeUpdate);
		} catch (Exception e) {
    
    
			e.printStackTrace();
		} finally {
    
    
			// 6、关闭资源
			if (preparedStatement != null) {
    
    
				try {
    
    
					preparedStatement.close();
				} catch (SQLException e) {
    
    
					e.printStackTrace();
				}
				preparedStatement = null;
			}

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

}

代码如下(输出):

这里输出的1代表的是数据库中有一条数据受到了影响

1

为了保险起见查看一下数据库中的学生表
在这里插入图片描述

总结

这里面需要注意的是,第五步执行sql语句的时候执行查询是preparedStatement.executeQuery(),二其他三个操作是**preparedStatement.executeUpdate()**对于刚开始学的人,特别需要注意。

关于JDBC的扩展可以参考以下文章:

1、数据库连接池——DBCP、C3P0(走过 路过 莫要错过了!!!)

2、DbUtils框架(这是一个耗时耗力的差事)

猜你喜欢

转载自blog.csdn.net/weixin_45851945/article/details/114967746