JDBC使用详解

一、概念

1、JDBC(Java Data Base Connectivity,Java数据库连接)
  是一种用于执行SQL语句的Java API,可以为多种关系数据库提供统一访问,它由一组用Java语言编写的类和接口组成。JDBC提供了一种基准,据此可以构建更高级的工具和接口,使数据库开发人员能够编写数据库应用程序。
2、数据库驱动
  我们安装好数据库之后,我们的应用程序也是不能直接使用数据库的,必须要通过相应的数据库驱动程序,通过驱动程序去和数据库打交道。其实也就是数据库厂商的JDBC接口实现,即对Connection等接口的实现类的jar文件。

二、JDBC由两层构成

三、步骤

  • ①加载JDBC驱动程序
  • ②建立数据库连接Connection
  • ③创建执行SQL的语句Statement
  • ④处理执行结果ResultSet
  • ⑤释放资源

使用后依次关闭对象及连接:ResultSet → Statement → Connection

四、常用接口

1、Driver接口

  • Driver接口由数据库厂家提供,对于Java开发者而言,只需要使用Driver接口就可以了。 在编程中要连接数据库,必须先装载特定厂商的数据库驱动程序。不同的数据库有不同的装载方法。

  • 驱动:就是各个厂商实现Sun公司提出的JDBC接口。即对Connection等接口的实现类的jar文件。

  • 装载mysql驱动:Class.forName(“com.mysql.jdbc.Driver”);

  • 装载oracle驱动:Class.forName(“com.jdbc.driver.OracleDriver”);

查阅API文档:
在这里插入图片描述

2、Connection接口

  • Connection与特定数据库的连接(会话),在连接上下文中执行sql语句并返回结果。DriverManager.getConnection(url, user, password)方法建立在JDBC URL中定义的数据库Connection连接上。

  • 连接MySql数据库:Connection conn = DriverManager.getConnection(“jdbc:mysql://host:port/database”, “user”, “password”);

  • 连接Oracle数据库:Connection conn = DriverManager.getConnection(“jdbc:oracle:thin:@host:port:database”, “user”, “password”);

  • 连接SqlServer数据库:Connection conn = DriverManager.getConnection(“jdbc:microsoft:sqlserver://host:port; DatabaseName=database”, “user”, “password”);

  • 常用方法:
    close()----- 关闭该数据库连接
    commit()------ 提交所有更改内容(事务)并释放该Connection对象锁定的资源
    createStatement()-----基于本Connection对象,创建Statement对象
    getAutoCommit()-----获取当前是否是自动提交模式
    getMetaData()---- 获取本连接相关的数据库元数据
    isClosed()----- 返回当前连接对象是否已经被关闭
    preparedStatement()------ 基于本连接对象,创建PreparedStatement对象
    rollback()----- 取消本轮事务中前面已经提交的更改(回滚)
    setAutoCommmit(boolean autoCommit)------- 设置事务是否自动提交
    prepareCall(sql)--------创建执行存储过程的callableStatement对象。

3.Statement接口

  • 用于执行静态SQL语句并返回它所生成结果的对象。

  • 三种Statement类:
    ①Statement:由createStatement创建,用于发送简单的SQL语句(不带参数)。
    ②PreparedStatement :继承自Statement接口,由preparedStatement创建,用于发送含有一个或多个参数的SQL语句。PreparedStatement对象比Statement对象的效率更高,并且可以防止SQL注入,所以我们一般都使用PreparedStatement。
    ③CallableStatement:继承自PreparedStatement接口,由方法prepareCall创建,用于调用存储过程。

  • 常用Statement方法:
    execute(String sql):运行语句,返回是否有结果集
    executeQuery(String sql):运行select语句,返回ResultSet结果集。
    executeUpdate(String sql):运行insert/update/delete操作,返回更新的行数。
    addBatch(String sql) :把多条sql语句放到一个批处理中。
    executeBatch():向数据库发送一批sql语句执行。
    在这里插入图片描述

4.ResultSet接口

  • 表示数据库结果集的数据表,通常通过执行查询数据库的语句生成。
  • 常用方法:
    close() ---------------- 关闭ResultSet对象
    getDate(int index)、getDate(String columnName):获得在数据库里是Date类型的数据。
    getBoolean(int index)、getBoolean(String columnName):获得在数据库里是Boolean类型的数据。
    getObject(int index)、getObject(String columnName):获取在数据库里任意类型的数据。
    getlnt(int collndex) ---------------- 以int形式获取结果集当前行指定列号值
    getlnt(String colLabel) ---------------- 以int形式获取结果集当前行指定列名值
    getFloat(String collndex) ---------------- 以float形式获取结果集当前行指定列名值
    getFloat(String colLabel) ---------------- 以float形式获取结果集当前行指定列名值
    getString(int collndex) ---------------- 以String形式获取结果集当前行指定列号值
    getString(String colLable) ---------------- 以String形式获取结果集当前指定列名值
    next():移动到下一行
    Previous():移动到前一行
    absolute(int row):移动到指定行
    beforeFirst():移动resultSet的最前面。
    afterLast() :移动到resultSet的最后面。

五、细节

1、注册驱动 (只进行一次)

记得进行异常处理

Class.forName("com.MySQL.jdbc.Driver");

2、建立连接

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

URL的格式:(第三行)
MySql:jdbc:mysql://localhost:xxx/xxx
在这里插入图片描述

六、例子一

简单的顺序输出表

/**
 * 顺序查询
 */

package com.study.mysql.test;

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

public class Test1 {
	public static Connection conn;
	public static Statement sql;
	public static ResultSet rs;
	public static final String url = "jdbc:mysql://localhost:3306/ming";
	public static final String user = "root";
	public static final String password = "******";

	public Connection getConnection() {// 将连接数据库的方法放在一起
		try {
			Class.forName("com.mysql.jdbc.Driver");//注册驱动
		} catch (ClassNotFoundException e) {
			e.printStackTrace();
		}

		try {
			conn = DriverManager.getConnection(url, user, password);

		} catch (SQLException e) {
			e.printStackTrace();
		}
		return conn;// 返回Connection对象
	}

	public static void main(String[] args) {
		Test1 t = new Test1();
		t.getConnection();// 连接数据库
		try {
			sql = conn.createStatement();//实例化Statement对象
			
			//执行sql语句
			rs = sql.executeQuery("select * from test_02;");
			
			while(rs.next()) {//如果当前语句不是最后一条,则进行循环(最后一条则返回false)
				String id = rs.getString("id");//获取列名是id的字段值
				String name = rs.getString("name");//获取列名是name的字段值
				String sex = rs.getString("sex");//获取列名是sex的字段值
				String birthday = rs.getString("birthday");//获取列名是birthday的字段值
				System.out.print( "  |  " + "编号:" + id + "  |  ");
				System.out.print("    姓名:" + name+ "  |  ");
				System.out.print("   性别:" + sex+ "  |  ");
				System.out.println("   出生日期:" + birthday+ "  |  ");
				
				
			}
		}catch(Exception e) {
			e.printStackTrace();
		}
	}
}

在这里插入图片描述

七、例子二

CURD(增删改查)操作

/**
 * 简单的CURD
 */

package com.study.mysql.test;

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

public class Test5 {
	public static Connection conn;
	public static PreparedStatement sql;// 声明预处理对象
	public static java.sql.ResultSet rs;// 声明结果集对象
	public static final String url = "jdbc:mysql://localhost:3306/ming";
	public static final String user = "root";
	public static final String password = "******";

	public Connection getConnection() {// 连接数据库
		try {
			Class.forName("com.mysql.jdbc.Driver");
		} catch (ClassNotFoundException e) {
			e.printStackTrace();
		}

		try {
			conn = DriverManager.getConnection(url, user, password);

		} catch (SQLException e) {
			e.printStackTrace();
		}
		return conn;// 返回Connection对象
	}

	public void shutConn() {// 关闭连接
		// 关闭连接,释放资源
		if (rs != null) {// 查询结果集
			try {
				rs.close();
			} catch (Exception e) {
				e.printStackTrace();
			}
			rs = null;
		}
		if (sql != null) {// sql语句
			try {
				sql.close();
			} catch (Exception e) {
				e.printStackTrace();
			}
		}
		if (conn != null) {// 连接
			try {
				conn.close();
			} catch (Exception e) {
				e.printStackTrace();
			}
		}
	}

	public static void main(String[] args) {
		Test5 t = new Test5();
		t.getConnection();// 获取连接
		try {
			sql = conn.prepareStatement("select * from test_02");
			rs = sql.executeQuery();
			System.out.println("------------------执行CURD前的数据------------------");
			while (rs.next()) {
				String id = rs.getString("id");// 获取列名是id的字段值
				String name = rs.getString("name");// 获取列名是name的字段值
				String sex = rs.getString("sex");// 获取列名是sex的字段值
				String birthday = rs.getString("birthday");// 获取列名是birthday的字段值
				System.out.print("  |  " + "编号:" + id + "  |  ");
				System.out.print("    姓名:" + name + "  |  ");
				System.out.print("   性别:" + sex + "  |  ");
				System.out.println("   出生日期:" + birthday + "  |  ");
			}

			// 预处理添加数据
			sql = conn.prepareStatement("insert into test_02 values(?,?,?,?)");
			sql.setInt(1, 5);
			sql.setString(2, "张一");
			sql.setString(3, "女");
			sql.setString(4, "2012-08-08");
			sql.executeUpdate();

			// 预处理更新数据
			sql = conn.prepareStatement("update test_02 set birthday = ? where id  = ?");
			sql.setString(1, "2018-8-27");
			sql.setInt(2, 3);
			sql.executeUpdate();

			// 预处理删除数据
			sql = conn.prepareStatement("delete from test_02 where id = ? ");
			sql.setInt(1, 1);
			sql.executeUpdate();

			System.out.println("------------------执行CURD后的数据------------------");
			// 查询修改后的数据
			sql = conn.prepareStatement("select * from test_02");
			rs = sql.executeQuery();
			while (rs.next()) {
				String id = rs.getString("id");// 获取列名是id的字段值
				String name = rs.getString("name");// 获取列名是name的字段值
				String sex = rs.getString("sex");// 获取列名是sex的字段值
				String birthday = rs.getString("birthday");// 获取列名是birthday的字段值
				System.out.print("  |  " + "编号:" + id + "  |  ");
				System.out.print("    姓名:" + name + "  |  ");
				System.out.print("   性别:" + sex + "  |  ");
				System.out.println("   出生日期:" + birthday + "  |  ");
			}

		} catch (Exception e) {
			e.printStackTrace();
		}

		t.shutConn();// 关闭连接
	}

}

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

猜你喜欢

转载自blog.csdn.net/Geekst/article/details/90579066