学习笔记:JDBC实现简单的CRUD(mysql数据库)

1. JDBC概述

JDBC(Java DataBase Connectivity, java数据库连接)是一种用于执行SQL语句的Java API,可以为多种关系数据库提供统一访问,它由一组用Java语言编写的类和接口组成。(注意:JDBC是人为制定的一种规范,而不是一种实现)

如下图所示,有了JDBC我们就可以通过JDBC去加载不同数据库厂商的驱动,实现对不同数据库的操作,而不用针对不同数据库再编写相应的程序,使程序拥有良好的可移植性。在这里插入图片描述

2. 前期准备

数据库:mysql 5.6
IDE:Eclipse IDE for Enterprise Java Developers

因为需要连接mysql数据库,这里要用到mysql-connector-java-5.1.28-bin.jar包,Maven项目可以直接添加依赖。由于是学习的缘故,这里用到的包相对会比较旧。

<!-- https://mvnrepository.com/artifact/mysql/mysql-connector-java -->
<dependency>
   	<groupId>mysql</groupId>
   	<artifactId>mysql-connector-java</artifactId>
   	<version>5.1.28</version>
</dependency> 

3. CRUD的实现

这些功能实现其实很简单,主要包含以下步骤:

  1. 注册数据库驱动
  2. 获取数据库的连接
  3. 获取传输对象
  4. 用传输对象传输sql语句到数据库中执行,获取结果集对象
  5. 遍历结果集获取需要的数据(只有查询才会返回结果集)
  6. 关闭资源

由上面的步骤可以看出其实大部分操作都是套路型的(花里胡哨),核心操作还是我们对传输sql语句到数据库中执行,本质上我们本知道知道相应操作的sql语句就可以完成。

3.2. mysql的CRUD语句

虽然知道sql语句是核心,但是如果平时不常用的话,很容易就会忘记了。现在先来复习一下mysql简单的增删查改操作。

3.2.1. 查询

SELECT column_name,column_name
FROM table_name
WHERE column_name operator value;

3.2.2. 插入:

插入操作主要有以下两种写法:

第一种形式无需指定要插入数据的列名,只需提供被插入的值即可:

INSERT INTO table_name
VALUES (value1,value2,value3,...);

第二种形式需要指定列名及被插入的值:

INSERT INTO table_name (column1,column2,column3,...)
VALUES (value1,value2,value3,...);

3.2.3. 更新:

# 更新表中已经存在的元素
UPDATE table_name
SET column1=value1,column2=value2,...
WHERE some_column=some_value;

3.2.4. 删除:

# 根据条件删除表中已经存在的元素
DELETE FROM table_name
WHERE some_column=some_value;

3.3. 操作简述

我们第一步要获取到数据库的连接:

  • 首先需要注册数据库的驱动,这里用到Class.forName()方法,参数是数据库驱动的类型,如果是mysql数据库的话传入的是"com.mysql.jdbc.Driver"。
  • 接着就是连接到数据库了,我们需要传入数据库的地址,用户名和密码。这里需要简单解释一下数据库地址的写法:
    • 一般格式:jdbc:数据库类型://ip:port/数据库名称。比如我们要连接本地一个叫做mydb1的数据库,地址就写为:jdbc:mysql://localhost:3306/mydb1
    • 当ip地址和端口号为本地地址和数据库默认端口号时,可以省略不写。例如上面的数据库地址可以简写为:jdbc:mysql://localhost:3306/mydb1
//1.注册数据库驱动
Class.forName(DriverType);
//2.获取数据库的连接
Connection conn = DriverManager.getConnection(url, user, password);

成功连接之后就可以获取传输器Statement对象,利用该对象传输sql语句对数据进行操作了。

  • Statement接口主要用于在已经建立连接的基础上向数据库发送SQL语句。
  • ResultSet接口类似于一个临时表,用来暂时存放数据库查询操作获得的结果集。
//3.获取传输器对象
Statement state = conn.createStatement();
//4.传输sql语句到数据库中执行,获取结果集对象
ResultSet res = res = state.executeQuery(sql);

3.4. 实现代码

由于操作都比较重复,这里只演示查询的操作。如果进行其他操作,只要更改相应的sql语句。下面的代码封装得也不是很好,可以考虑以下优化:

  • 由于连接和关闭资源操作都比较重复,我们可以把它们封装成一个静态的JDBCUtils。
  • 我们可以把像驱动的类型、数据库地址、用户名和密码这些信息都写入配置文件,连接的时候再从配置文件中读取。
public class JdbcCRUD {
	private static Connection conn = null;
	private static Statement state = null;
	private static ResultSet res = null;
	
	private static void find() {
		try {
			//1.注册数据库驱动
			Class.forName("com.mysql.jdbc.Driver");
			//2.获取数据库的连接
			conn = DriverManager.getConnection("jdbc:mysql:///mydb1", "root", "123456");
			//3.获取传输器对象
			state = conn.createStatement();
			//4.传输sql语句到数据库中执行,获取结果集对象
			res = state.executeQuery(" select * from user ");
			//5.遍历结果集获取需要的数据
			while (res.next()) {
				int id = res.getInt("id");
				String name = res.getString("username");
				String password = res.getString("password");
				System.out.println(id + "," + name + "," + password);
			}
		} catch (Exception e) {
			e.printStackTrace();
		} finally {
			//6.关闭资源
			if (res != null) {
				try {
					res.close();
				} catch (Exception e) {
					e.printStackTrace();
				} finally {
					res = null;
				}
			}
			if (state != null) {
				try {
					state.close();
				} catch (Exception e) {
					e.printStackTrace();
				} finally {
					state = null;
				}
			}
			if (conn != null) {
				try {
					conn.close();
				} catch (Exception e) {
					e.printStackTrace();
				} finally {
					conn = null;
				}
			}
		}		
	}
}

参考资料

  1. https://www.cnblogs.com/xujingyang/p/6477210.html
  2. https://www.runoob.com/sql/sql-tutorial.html
发布了59 篇原创文章 · 获赞 103 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/weixin_42292229/article/details/100644053