欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

Java之JDBC快速入门

程序员文章站 2022-06-23 12:50:10
...

1、JDBC概述

JDBC代表Java数据库连接(Java Database Connectivity),它是用于Java编程语言和数据库之间的数据库无关连接的标准Java API,换句话说:JDBC是用于在Java语言编程中与数据库连接的API,而与具体连接细节无关。

为啥要弄这些API呢?因为数据库厂商有很多家,早期每个数据库的连接方法都不一样,这样显然不利于开发。你想想,每换一个数据库,都得重新写一份带有细节的连接代码。
这时Java就说,我提供一组API,无论你是什么数据库,你只要实现这些接口,具体的实现细节由各大数据库厂商你们自己决定。
Java开发者也不用关系细节,只要调用对应的API即可访问数据库,大大提高了开发效率。

2、JDBC架构

JDBC API支持用于数据库访问的两层和三层处理模型,但通常,JDBC体系结构由两层组成:

JDBC API:提供应用程序到JDBC管理器连接。JDBC驱动程序API:支持JDBC管理器到驱动程序连接。
JDBC API使用驱动程序管理器并指定数据库的驱动程序来提供与异构数据库的透明连接。

JDBC驱动程序管理器确保使用正确的驱动程序来访问每个数据源。 驱动程序管理器能够支持连接到多个异构数据库的多个并发驱动程序。
以下是架构图,它显示了驱动程序管理器相对于JDBC驱动程序和Java应用程序的位置
Java之JDBC快速入门

3、常见的JDBC组件

DriverManager:此类管理数据库驱动程序列表。 使用通信子协议将来自java应用程序的连接请求与适当的数据库驱动程序进行匹配。在JDBC下识别某个子协议的第一个驱动程序将用于建立数据库连接。

Driver:此接口处理与数据库服务器的通信。我们很少会直接与Driver对象进行交互。 但会使用DriverManager对象来管理这种类型的对象。 它还提取与使用Driver对象相关的信息。

Connection:此接口具有用于联系数据库的所有方法。 连接(Connection)对象表示通信上下文,即,与数据库的所有通信仅通过连接对象。

Statement:使用从此接口创建的对象将SQL语句提交到数据库。 除了执行存储过程之外,一些派生接口还接受参数。

ResultSet:在使用Statement对象执行SQL查询后,这些对象保存从数据库检索的数据。 它作为一个迭代器并可移动ResultSet对象查询的数据。

SQLException:此类处理数据库应用程序中发生的任何错误。

4、JDBC操作数据的一般步骤

第1步:注冊驱动 (仅仅做一次)
第2步:建立连接(Connection)
第3步:创建运行SQL的语句(Statement、PrepareStatement)
第4步:运行语句
第5步:处理运行结果(ResultSet)
第6步:释放资源

5、以MySQL为例进行演示

首先需要下载MySQL的JDBC的jar包,并且导入到项目中。
MySQL官网jar包下载地址:https://dev.mysql.com/downloads/connector/j/

Java之JDBC快速入门
Java之JDBC快速入门
Java之JDBC快速入门
sql脚本文件

#创建数据库
CREATE DATABASE IF NOT EXISTS jdbc_test;
#选中刚刚创建的数据库
use jdbc_test;
#创建users表
CREATE TABLE IF NOT EXISTS users(
	userName VARCHAR(20) PRIMARY KEY,
	password VARCHAR(20),
	gender CHAR(1),
	emailAddr VARCHAR(20)
);

项目目录结构:
Java之JDBC快速入门
User.java文件

package cn.hestyle.bean;

public class User {
	private String userName;
	private String password;
	private String gender;
	private String emailAddr;
	
	public User() {
		super();
		// TODO Auto-generated constructor stub
	}
	
	public User(String userName, String password, String gender, String emailAddr) {
		super();
		this.userName = userName;
		this.password = password;
		this.gender = gender;
		this.emailAddr = emailAddr;
	}

	public String getUserName() {
		return userName;
	}

	public void setUserName(String userName) {
		this.userName = userName;
	}

	public String getPassword() {
		return password;
	}

	public void setPassword(String password) {
		this.password = password;
	}

	public String getGender() {
		return gender;
	}

	public void setGender(String gender) {
		this.gender = gender;
	}

	public String getEmailAddr() {
		return emailAddr;
	}

	public void setEmailAddr(String emailAddr) {
		this.emailAddr = emailAddr;
	}

	@Override
	public String toString() {
		return "[userName=" + userName + ", password=" + password + ", gender=" + gender + ", emailAddr="
				+ emailAddr + "]";
	}
	
	
}

UserDaoImpl.java文件

package cn.hestyle.dao.impl;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.Statement;
import java.util.ArrayList;
import java.util.List;

import cn.hestyle.bean.User;
import cn.hestyle.dao.UserDao;
import cn.hestyle.utils.DBUtil;

public class UserDaoImpl implements UserDao{
	@Override
	public boolean insert(User user) {
		Connection conn = null;
		PreparedStatement preStatement = null;
		try {
			//第1步:建立连接(Connection)
			conn = DBUtil.getConnection();
			//第2步:构建sql语句
			String sql = "INSERT INTO users VALUES(?, ?, ?, ?);";
			preStatement = conn.prepareStatement(sql);
			preStatement.setString(1, user.getUserName());
			preStatement.setString(2, user.getPassword());
			preStatement.setString(3, user.getGender());
			preStatement.setString(4, user.getEmailAddr());
			//第3步:执行sql语句
			int resCnt = preStatement.executeUpdate();
			if (resCnt == 1) {
				return true;
			}
		} catch (Exception e) {
			e.printStackTrace();
		} finally {
			//第4步:关闭资源
			DBUtil.closeAll(conn, preStatement, null);
		}
		return false;
	}

	@Override
	public User findUser(String userName, String password) {
		User user = null;
		Connection conn = null;
		PreparedStatement preStatement = null;
		ResultSet resultSet = null;
		try {
			//第1步:建立连接(Connection)
			conn = DBUtil.getConnection();
			//第2步:构建sql语句
			String sql = "SELECT * FROM users where userName = ? AND password = ?;";
			preStatement = conn.prepareStatement(sql);
			preStatement.setString(1, userName);
			preStatement.setString(2, password);
			//第3步:执行sql语句
			resultSet = preStatement.executeQuery();
			while (resultSet.next()) {
				user = new User();
				user.setUserName(resultSet.getString(1));
				user.setPassword(resultSet.getString(2));
				user.setGender(resultSet.getString(3));
				user.setEmailAddr(resultSet.getString(4));
			}
		} catch (Exception e) {
			e.printStackTrace();
		} finally {
			//第4步:关闭资源
			DBUtil.closeAll(conn, preStatement, resultSet);
		}
		return user;
	}

	@Override
	public User findUser(String userName) {
		User user = null;
		Connection conn = null;
		PreparedStatement preStatement = null;
		ResultSet resultSet = null;
		try {
			//第1步:建立连接(Connection)
			conn = DBUtil.getConnection();
			//第2步:构建sql语句
			String sql = "SELECT * FROM users where userName = ?;";
			preStatement = conn.prepareStatement(sql);
			preStatement.setString(1, userName);
			//第3步:执行sql语句
			resultSet = preStatement.executeQuery();
			while (resultSet.next()) {
				user = new User();
				user.setUserName(resultSet.getString(1));
				user.setPassword(resultSet.getString(2));
				user.setGender(resultSet.getString(3));
				user.setEmailAddr(resultSet.getString(4));
			}
		} catch (Exception e) {
			e.printStackTrace();
		} finally {
			//第4步:关闭资源
			DBUtil.closeAll(conn, preStatement, resultSet);
		}
		return user;
	}

	@Override
	public boolean delUser(String userName) {
		Connection conn = null;
		PreparedStatement preStatement = null;
		try {
			//第1步:建立连接(Connection)
			conn = DBUtil.getConnection();
			//第2步:构建sql语句
			String sql = "DELETE FROM users WHERE userName = ?;";
			preStatement = conn.prepareStatement(sql);
			preStatement.setString(1, userName);
			//第3步:执行sql语句
			int resCnt = preStatement.executeUpdate();
			if (resCnt == 1) {
				return true;
			}
		} catch (Exception e) {
			e.printStackTrace();
		} finally {
			//第4步:关闭资源
			DBUtil.closeAll(conn, preStatement, null);
		}
		return false;
	}

	@Override
	public List<User> getAllUsers() {
		List<User> usersList = null;
		Connection conn = null;
		Statement statement = null;
		ResultSet resultSet = null;
		try {
			//第1步:建立连接(Connection)
			conn = DBUtil.getConnection();
			//第2步:构建sql语句
			String sql = "SELECT * FROM users;";
			statement = conn.createStatement();
			//第3步:执行sql语句
			//第3步:执行sql语句
			resultSet = statement.executeQuery(sql);
			usersList = new ArrayList<User>();
			while (resultSet.next()) {
				User user = new User();
				user.setUserName(resultSet.getString(1));
				user.setPassword(resultSet.getString(2));
				user.setGender(resultSet.getString(3));
				user.setEmailAddr(resultSet.getString(4));
				usersList.add(user);
			}

		} catch (Exception e) {
			e.printStackTrace();
		} finally {
			//第4步:关闭资源
			DBUtil.closeAll(conn, statement, resultSet);
		}
		return usersList;
	}

}

UserDao.java文件

package cn.hestyle.dao;

import java.util.List;

import cn.hestyle.bean.User;

public interface UserDao {
	/**
	 * 添加user到数据库
	 * @param user
	 * @return
	 */
	public boolean insert(User user);
	
	/**
	 * 依据userName、password查找用户
	 * @param userName
	 * @param password
	 * @return
	 */
	public User findUser(String userName, String password);
	
	/**
	 * 依据userName查找用户
	 * @param username
	 * @return
	 */
	public User findUser(String userName);
	
	/**
	 * 依据userName删除user
	 * @param userName
	 * @return
	 */
	public boolean delUser(String userName);
	
	/**
	 * 获取所有users
	 * @return
	 */
	public List<User> getAllUsers();
}

MainTest.java文件

package cn.hestyle.test;

import java.util.List;

import cn.hestyle.bean.User;
import cn.hestyle.dao.UserDao;
import cn.hestyle.dao.impl.UserDaoImpl;

public class MainTest {

	public static void main(String[] args) {
		UserDao userDao = new UserDaoImpl();
		User user = new User();
		user.setUserName("hestyle_01");
		user.setPassword("123456");
		user.setGender("男");
		user.setEmailAddr("aaa@qq.com");
		//插入user对象
		if (userDao.insert(user)) {
			System.out.println(user.getUserName() + "插入成功!");
		} else {
			System.out.println(user.getUserName() + "插入失败!");
		}
		
		user.setUserName("hestyle_02");
		user.setPassword("abcdef");
		user.setGender("男");
		user.setEmailAddr("aaa@qq.com");
		//插入user对象
		if (userDao.insert(user)) {
			System.out.println(user.getUserName() + "插入成功!");
		} else {
			System.out.println(user.getUserName() + "插入失败!");
		}
		
		user.setUserName("hestyle_03");
		user.setPassword("123456789");
		user.setGender("男");
		user.setEmailAddr("aaa@qq.com");
		//插入user对象
		if (userDao.insert(user)) {
			System.out.println(user.getUserName() + "插入成功!");
		} else {
			System.out.println(user.getUserName() + "插入失败!");
		}
		//寻找hestyle_02
		user = userDao.findUser("hestyle_02");
		if (user != null) {
			System.out.println("hestyle_02:" + user.toString());
		} else {
			System.out.println("hestyle_02:查无此人!");
		}
		//寻找hestyle_03
		user = userDao.findUser("hestyle_03", "123456789");
		if (user != null) {
			System.out.println("hestyle_03:" + user.toString());
		} else {
			System.out.println("hestyle_03:查无此人!");
		}
		//删除hestyle_02
		if (userDao.delUser("hestyle_02")) {
			System.out.println("hestyle_02:删除成功!");
		} else {
			System.out.println("hestyle_02:删除失败!");
		}
		//查询所有users
		int index = 1;
		List<User> usersList = userDao.getAllUsers();
		System.out.println("当前User列表:");
		if (usersList.size() != 0) {
			for (User tmpUser : usersList) {
				System.out.println(index + "、" + tmpUser.toString());
				index += 1;
			}
		} else {
			System.out.println("空!");
		}
		
	}

}

DBUtil.java文件

package cn.hestyle.utils;

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

public class DBUtil {
	//连接数据库的用户名、密码
	private static String url = "jdbc:mysql://localhost/jdbc_test";
	private static String user = "root";
	private static String password = "123456";
	private static String driverClass = "com.mysql.cj.jdbc.Driver";
	
	static{
		//静态代码块,在加载该类的时候加载
		try {
			Class.forName(driverClass);
		} catch (ClassNotFoundException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}
	
	/**
	 * 获取Connection
	 * @return
	 * @throws Exception
	 */
	public static Connection getConnection() throws Exception{
		return DriverManager.getConnection(url, user, password);
	}
	
	/**
	 * 关闭三个资源,因为dao层有多个方法会用到关闭资源的操作,所以进行封装
	 * @param conn
	 * @param statement
	 * @param resultSet
	 */
	public static void closeAll(Connection conn, Statement statement, ResultSet resultSet){
		//三个资源的关闭顺序不能修改!!!
		if(resultSet != null){
			try {
				resultSet.close();
			} catch (SQLException e) {
				e.printStackTrace();
			}
		}
		
		if(statement != null){
			try {
				statement.close();
			} catch (SQLException e) {
				e.printStackTrace();
			}
		}
		
		if(conn != null){
			try {
				conn.close();
			} catch (SQLException e) {
				e.printStackTrace();
			}
		}
	}
}

运行结果:
Java之JDBC快速入门