Java的JDBC理论知识的以及如何使用的详细介绍

一、什么是JDBC?

定义:JDBC(Java Database Connectivity,Java数据库连接),它是一套用于执行SQL语句的Java API。
作用:应用程序可通过这套API连接到关系型数据库,并使用SQL语句来完成对数据库中数据的查询、新增、更新和删除等操作。

说明:
不同的数据库(如MySQL、Oracle等)在其内部处理数据的方式是不同的,因此每一个数据库厂商都提供了自己数据库的访问接口。
直接使用数据库厂商提供的访问接口操作数据库,程序的可移植性变得很差。
而JDBC要求各个数据库厂商按照统一的规范来提供数据库驱动,由JDBC和具体的数据库驱动联系,这样应用程序就不必直接与底层的数据库交互,从而使得代码的通用性更强。

应用程序使用JDBC访问数据库的方式
在这里插入图片描述

说明:JDBC在应用程序与数据库之间起到了一个桥梁作用,当应用程序使用JDBC访问特定的数据库时,只需要通过不同的数据库驱动与其对应的数据库进行连接,连接后即可对该数据库进行相应的操作。

二、JDBC常用API(Application Programming Interface)

2.1 Driver接口

定义:Driver接口是所有JDBC驱动程序必须实现的接口,该接口专门提供给数据库厂商使用。
注意:在编写JDBC程序时,必须要把所使用的数据库驱动程序或类库加载到项目的classpath中(这里指数据库的驱动JAR包)。

2.2 DriverManager接口

定义:DriverManager类用于加载JDBC驱动并且创建与数据库的连接。
主要方法
在这里插入图片描述

注意:在实际开发中,通常不使用registerDriver(Driver driver) 注册驱动。因为JDBC驱动类Driver中有一段静态代码块,是向DriverManager注册一个Driver实例,当再次执行registerDriver(new Driver()),相当于实例化了两个Driver对象,因此在加载数据库驱动时通常使用Class类的静态方法forName()来实现。

2.3 Connection接口

定义:Connection接口代表Java程序和数据库的连接对象,只有获得该连接对象后,才能访问数据库,并操作数据表。
常用方法
在这里插入图片描述

2.4 Statement接口

定义:Statement是Java执行数据库操作的一个重要接口,它用于执行静态的SQL语句,并返回一个结果对象。
说明:Statement接口对象可以通过Connection实例的createStatement()方法获得,然后返回数据库的处理结果。
常用方法

在这里插入图片描述

2.5 PreparedStatement接口

PreparedStatement有什么作用?

解答:Statement接口封装了JDBC执行SQL语句的方法,虽然可以完成Java程序执行SQL语句的操作,但是在实际开发过程中往往需要将程序中的变量作为SQL语句的查询条件,而使用Statement接口操作这些SQL语句会过于繁琐,并且存在安全方面的问题。
针对这一问题,JDBC API 中提供了扩展的PreparedStatement接口。

定义:PreparedStatement是Statement的子接口,用于执行预编译的SQL语句。
说明:PreparedStatement接口扩展了带有参数SQL语句的执行操作,应用接口中的SQL语句可以使用占位符“?”来代替其参数,然后通过setXxx()方法为SQL语句的参数赋值。

常用方法
在这里插入图片描述

使用:为SQL语句参数赋值时,可以通过输入参数与SQL类型相匹配的setXxx()方法。例如字段的数据类型为int或Integer,那么应该使用setInt()方法,也可以通过setObject()方法设置多种类型的输入参数。

2.6 ResultSet接口

定义:ResultSet接口用于保存JDBC执行查询时返回的结果集,该结果集封装在一个逻辑表格中。
说明

  • 在ResultSet接口内部有一个指向表格数据行的游标(或指针),ResultSet对象初始化时,游标在表格的第一行之前,调用next()方法可将游标移动到下一行。如果下一行没有数据,则返回false。
  • 在程序中经常使用next()方法作为while循环的条件来迭代ResultSet结果集。

在这里插入图片描述

说明

  • ResultSet接口中定义了大量的getXxx()方法,而采用哪种getXxx()方法取决于字段的数据类型。
  • 程序既可以通过字段的名称来获取指定数据,也可以通过字段的索引来获取指定的数据,字段的索引是从1开始编号的。
  • 例如,假设数据表的第1列字段名为id,字段类型为int,那么既可以使用getInt(“id”)获取该列的值,也可以使用getInt(1)获取该列的值。

三、JDBC编程步骤

在这里插入图片描述

3.1 加载数据库驱动

语法:

Class.forName("DriverName");
  • DriverName就是数据库驱动类所对应的字符串

例如:

  • 加载MySQL数据库驱动:
Class.forName("com.mysql.cj.jdbc.Driver");
  • 加载Oracle数据库驱动
Class.forName("oracle.jdbc.driver.OracleDriver");

3.2 通过DriverManager获取数据库连接

语法:

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

例如:

Connection conn = DriverManager.getConnection("jdbc:mysql://localhost/dbTest?serverTimezone=GMT%2B8&useUnicode=true","root","root");

3.3 通过Connection对象获取Statement对象

创建方式:

  1. createStatement():创建基本的Statement对象。
  2. preparedStatement(String sql):根据传递的SQL语句创建PreparedStatement对象。
  3. prepareCall(String sql):根据传入的SQL语句创建CallStatement对象。

例如:

 Statement stmt = conn.createStatement();

3.4 使用Statement执行SQL语句

执行SQL方式:

  1. execute(String sql):用于执行任意的SQL语句。
  2. executeQuery(String sql):用于执行查询语句,返回ResultSet结果集对象。
  3. executeUpdate(String sql):用于执行DML(数据操作语言)和DDL((数据定义语言)语句。执行DML语言(INSERT、UPDATE或DELETE)时,会返回受SQL语言影响的行数,执行DDL(CREATE、ALTER)语句时返回0。

例如:

ResultSet rs = stmt.executeQuery(sql);

3.5 操作ResultSet结果集

说明

  • 如果执行的SQL语句是查询语句,执行结果将返回一个ResultSet对象,该对象里保存了SQL语句查询的结果。
  • 程序可以通过操作该ResultSet对象来取出查询结果。

3.6 关闭连接,释放资源

说明:每次操作数据库结束后都要关闭数据库连接,释放资源,以重复利用资源
注意:

  • 通常资源的关闭顺序与打开顺序相反,顺序是ResultSet、Statement(或PreparedStatement)和Connection。
  • 为了保证在异常情况下也能关闭资源,需要在try…catch的finally代码块中统一关闭资源。

四、实战

4.1 搭建数据库环境

创建一个名dbTest的库,建立一个tb_user的表,语句如下:

create table tb_user (
	id int PRIMARY KEY AUTO_INCREMENT,
	name VARCHAR(40),
	sex VARCHAR(2),
	email varchar(60),
	birthday date
);

insert into tb_user(name,sex,email,birthday)
	values ("Jack","男","[email protected]","1998-09-10"),
				 ("Tom","男","[email protected]","1999-10-10"),
				 ("Lily","女","[email protected]","2000-05-21"),
				 ("Lucy","女","[email protected]","1999-06-11");

4.2 新建Java项目

4.2.1 读取数据库数据

新建Java项目,名称为JDBC,在新建的Java项目中,打开src文件夹,选中src,新建一个Package包,名称为itwcn.com,接着选中新建的Package(itwcn.com)包,继续新建一个Class文件,名称为ReadSql。
选中所建立的项目,即选中JDBC,新建一个Folder(文件夹),名称为lib,将数据库连接驱动文件放在该文件夹下。选中mysql-connector-java-8.0.18.jar,鼠标右键,选择Build Path,选择Add to Path

完成后如图所示:
在这里插入图片描述
下面开始编写代码

package itwcn.com;

import java.sql.*;

public class ReadSql {
    
    
    public static void main(String[] args) throws SQLException {
    
    
        Connection conn = null;
        Statement stmt = null;
        ResultSet rs = null;
        try {
    
    
            //1.加载数据库的驱动
            Class.forName("com.mysql.cj.jdbc.Driver");
            //2.通过DriverManager获取数据库连接
//            String url = "jdbc:mysql://localhost:3306/dbTest?serverTimezone=UTC";
            //指定时区
            String url = "jdbc:mysql://localhost:3306/dbtest";
            url = url + "?serverTimezone=GMT%2B8&useUnicode=true";
            url = url + "&characterEncoding=UTF-8";
            String username = "root";
            String password = "root";
            conn = DriverManager.getConnection(url,username,password);
            //3.通过Connection对象获取Statement对象
            stmt = conn.createStatement();
            //4.使用Statement执行SQL语句
            String sql = "select * from tb_user";
            rs = stmt.executeQuery(sql);
            //5.操作ResultSet结果集
            System.out.println(" id | name     | sex    | email     |    birthday");
            while (rs.next()) {
    
    
                int id = rs.getInt("id");
                String name = rs.getString("name");
                String sex = rs.getString("sex");
                String email = rs.getString("email");
                Date birthday = rs.getDate("birthday");
                System.out.println(id+ "   |  "+name+"   |    "+sex    
                		+ "   |  " +email+"    |    "+birthday);

            }
        } catch (Exception e) {
    
    
            e.printStackTrace();
        } finally {
    
    
            //6.关闭连接,释放资源
            if (rs != null) {
    
    
                rs.close();
            }
            if (stmt != null) {
    
    
                stmt.close();
            }
            if (conn != null) {
    
    
                conn.close();
            }
        }
    }
}

4.2.2 写数据到数据库中

在itwcn.com包下,新建一个Class文件,名称为WriteSql,代码如下:

package itwcn.com;

import java.sql.*;

public class WriteSql {

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		StringBuffer sbSql = null;
		Connection cn = null;
		PreparedStatement psA = null;
		
		try {
			// 1.添加驱动类:
			Class.forName("com.mysql.cj.jdbc.Driver");
			
			// 2. 使用 DriverManag管理器获取连接对象:
			String url = "jdbc:mysql://127.0.0.1:3306/dbTest";
			url = url + "?serverTimezone=GMT%2B8&useUnicode=true";
			url = url + "&characterEncoding=UTF-8";
			
			String user = "root";
			String password = "root";
			cn = DriverManager.getConnection(url, user, password);
			
			// 3. 创建命令对象:
			sbSql = new StringBuffer();
//			sbSql.append("Insert Into studentinfo ");
			sbSql.append("Insert Into tb_user ");
			sbSql.append("values(");
//			sbSql.append("'201802','李四',20,'B1801'");
			sbSql.append("'6','王菜鸟','男','[email protected]','1998-11-12'");
			sbSql.append(")");			
			psA = cn.prepareStatement(sbSql.toString());
			
			// 4. 执行SQL命令:
			psA.execute();  
			int i = psA.getUpdateCount(); // 获取更新的记录数
			if(i>0) {
				System.out.println("插入数据成功!");
			}
		} catch (ClassNotFoundException e1) {
			e1.printStackTrace();
		} catch (SQLException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} finally {
			try {
				if(psA!=null) {				
					psA.close();
				}
				if(cn!=null) {
					cn.close();
				}
				sbSql.delete(0, sbSql.length());
				sbSql = null;
				cn = null;
				psA = null;
			}catch(SQLException e) {
				e.printStackTrace();
			}
		}	
	}

}

在这里插入图片描述

查询数据库后,可以看到:
在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/qq_44723773/article/details/110469439