Java JDBC操作MySQL数据库(增删改查,附带实例)
Java 代码能够实现将数据保存在变量、数组、集合等内存空间中,但这只是暂时保存,如果想要长期保存该怎么办呢?方法一,借助 IO 流将数据写入文件,不足之处是不方便管理数据以及维护数据的关系。方法二,借助数据库管理软件,比如 MySQL,相对来说它可以更方便地管理数据。
既然如此,我们是否可以集二者之所长,将其结合起来呢?即 Java 程序操作 MySQL,实现数据的存储和处理。也就是使用 JDBC 技术实现数据持久化,后期可以使用 MyBatis 等持久层框架,其底层仍然使用了 JDBC 技术。
Java 程序调用 JDBC 技术,然后通过 JDBC 技术调用数据库实现数据持久化的全过程,如下图所示:

图 1 借助 JDBC 实现数据持久化
通过 Java 程序对 MySQL 进行操作,主要分为两部分:
接下来为大家介绍如何借助 Java 程序连接 MySQL 数据库。
chapter07_JdbcTest 项目的目录结构,如下图所示:

图 2 chapter07_JdbcTest项目的目录结构
创建 JdbcTest 类,编写如下代码连接 atguigu 数据库,示例代码如下:
运行上述代码查看控制台,如下图所示,表示连接成功:

图 3 查看控制台是否成功连接数据库
首先,在 atguigu 数据库中创建一个表,命名为 users,users 表结构如下表所示:
下面编写 Java 代码,借助 JDBC 技术实现对该表的数据进行增删改查操作。

图 4 成功新增数据
查看数据库的 users 表,发现表中多了一条记录,如下图所示:

图 5 users表中新增一条数据

图 6 成功修改数据
查看数据库 users 表,发现用户名由“cyuyan”修改为“Cyuyan”,如下图所示:

图 7 修改用户名“cyuyan”为“Cyuyan”

图 8 成功查询数据
成功查询到 users 表中的数据。

图 9 成功删除数据
查看数据库 users 表,发现表中的数据被删除了。再次启动 QueryTest 类进行查询,查看控制台,如下图所示,结果为空。

图 10 再次查询数据,结果为空
既然如此,我们是否可以集二者之所长,将其结合起来呢?即 Java 程序操作 MySQL,实现数据的存储和处理。也就是使用 JDBC 技术实现数据持久化,后期可以使用 MyBatis 等持久层框架,其底层仍然使用了 JDBC 技术。
JDBC是什么
JDBC 代表一组独立于任何数据库管理系统(DBMS)的 API,声明在 java.sql 与 javax.sql 包中,是 Sun (现 Oracle)公司提供的一组接口规范。它由各个数据库厂商来提供实现类,这些实现类的集合构成了数据库驱动 jar 包。Java 程序调用 JDBC 技术,然后通过 JDBC 技术调用数据库实现数据持久化的全过程,如下图所示:

图 1 借助 JDBC 实现数据持久化
通过 Java 程序对 MySQL 进行操作,主要分为两部分:
- 一是创建 Java 程序,并建立与 MySQL 数据库的连接;
- 二是通过 JDBC 对 MySQL 数据库进行增删改查的操作。
接下来为大家介绍如何借助 Java 程序连接 MySQL 数据库。
Java程序连接MySQL数据库
借助 Java 程序连接 MySQL 数据库,具体步骤如下:- 新建一个 Java 模块,例如命名为 chapter07_JdbcTest;
- 在该模块路径下新建一个名称为 lib 的目录;
- 将 MySQL 的驱动包“commons-dbutils-1.4.jar”复制、粘贴到 lib 目录下,并在驱动包上右键选择“Add as Library”引入该依赖;
- 在 MySQL 内创建 atguigu 数据库,通过编写 Java 代码实现与该数据库的连接。
chapter07_JdbcTest 项目的目录结构,如下图所示:

图 2 chapter07_JdbcTest项目的目录结构
创建 JdbcTest 类,编写如下代码连接 atguigu 数据库,示例代码如下:
package com.atguigu; import java.sql.Connection; import java.sql.DriverManager; public class JdbcTest { public static void main(String[] args) throws Exception { // 1. 加载驱动 Class.forName("com.mysql.cj.jdbc.Driver"); // 2. 设置连接数据库的参数 String url = "jdbc:mysql://localhost:3306/atguigu"; // 用户名,采用 root 用户登录 String username = "root"; // 密码,root 用户的密码(安装数据库时设置的密码) String password = "root"; // 3. 获得数据库连接 Connection connection = DriverManager.getConnection(url, username, password); // 4. 输出验证结果是否成功 System.out.println("connection = " + connection); } }综上可知,连接数据库具体分为三步,首先加载驱动,然后设置参数,即指明 url、用户名和密码。其中 url 包括需要连接的数据库的类型“mysql”、对应的 IP 地址“localhost”、端口号 3306,以及数据库名字“atguigu”。最后传递上述参数进行连接即可。
运行上述代码查看控制台,如下图所示,表示连接成功:

图 3 查看控制台是否成功连接数据库
JDBC进行增删改查
成功连接数据库并获取数据库连接对象后,下面继续介绍如何实现对 MySQL 数据库的增删改查操作。首先,在 atguigu 数据库中创建一个表,命名为 users,users 表结构如下表所示:
字段名称 | 数据类型 | Key | |
---|---|---|---|
用户编号 | id | INT | PRI |
用户名 | username | VARCHAR(20) | |
密码 | password | VARCHAR(50) | |
邮箱 | VARCHAR(50) |
下面编写 Java 代码,借助 JDBC 技术实现对该表的数据进行增删改查操作。
1) 新增数据
创建 InsertTest 类,实现新增数据的操作,示例代码如下:package com.atguigu; //省略 import 语句 public class InsertTest { public static void main(String[] args) throws Exception { //省略获取数据库连接代码... //将数据添加到 users 表格内 //准备带有占位符的 sql 语句(后期可以避免 sql 语句的拼接和 sql 注入问题) String sql = "insert into users(username,password,email) values(?,?,?)"; //获得 PreparedStatement 对象 PreparedStatement preparedStatement = connection.prepareStatement(sql); //为 sql 语句绑定参数(也就是占位符?位置的数据) /* * 值得注意的是 setObject 方法可以绑定任意类型的参数,第一个参数的含义是第几个问号,第二个参数就是参数值, * 参数的个数一定要和问号的个数保持一致,否则会出现错误 */ preparedStatement.setObject(1, "cyuyan"); preparedStatement.setObject(2, "12345"); preparedStatement.setObject(3, "cyuyan@qq.com"); } }运行代码查看控制台,如下图所示:

图 4 成功新增数据
查看数据库的 users 表,发现表中多了一条记录,如下图所示:

图 5 users表中新增一条数据
2) 更新数据
创建 UpdateTest 类,实现修改数据的操作,示例代码如下:package com.atguigu; //省略 import 语句 public class UpdateTest { public static void main(String[] args) throws Exception { //省略获取数据库连接代码... //对 users 表内的数据进行修改 //准备带有占位符的 sql 语句 String sql = "update users set username=?, password=?, email=? where id=?"; //获得 PreparedStatement 对象 PreparedStatement preparedStatement = connection.prepareStatement(sql); //为 sql 语句绑定参数 preparedStatement.setObject(1, "Cyuyan"); preparedStatement.setObject(2, "12345"); preparedStatement.setObject(3, "cyuyan@qq.com"); preparedStatement.setObject(4, 1); //执行,返回值为 sql 语句影响的行数 int len = preparedStatement.executeUpdate(); System.out.println(len > 0 ? "修改成功" : "修改失败"); //关闭资源 preparedStatement.close(); connection.close(); } }运行代码查看控制台,如下图所示:

图 6 成功修改数据
查看数据库 users 表,发现用户名由“cyuyan”修改为“Cyuyan”,如下图所示:

图 7 修改用户名“cyuyan”为“Cyuyan”
3) 查询数据
创建 QueryTest 类实现查询数据的操作,示例代码如下:package com.atguigu; //省略 import 语句 public class QueryTest { public static void main(String[] args) throws Exception { //省略获取数据库连接代码... //对 users 表内的数据进行查询 //准备带有占位符的 sql 语句 String sql = "select * from users where id=?"; //获得 PreparedStatement 对象 PreparedStatement preparedStatement = connection.prepareStatement(sql); //为 sql 语句绑定参数 preparedStatement.setObject(1, 1); //执行,返回值为 sql 语句的查询结果 ResultSet resultSet = preparedStatement.executeQuery(); //处理结果集 //如果 sql 语句的查询结果是多条的话,将 if 换成 while 即可 if(resultSet.next()){ int id = resultSet.getInt("id");//获取 id 列的数据 System.out.println("id = " + id); String username = resultSet.getString("username"); System.out.println("username1 = " + username); String password1 = resultSet.getString("password"); System.out.println("password1 = " + password1); String email = resultSet.getString("email"); System.out.println("email = " + email); } //关闭资源 preparedStatement.close(); connection.close(); } }运行代码查看控制台,如下图所示:

图 8 成功查询数据
成功查询到 users 表中的数据。
4) 删除数据
创建 DeleteTest 类,实现删除数据的操作,示例代码如下:package com.atguigu; //省略 import 语句 public class DeleteTest { public static void main(String[] args) throws Exception { //省略获取数据库连接代码... //对 users 表内的数据进行删除操作 //准备带有占位符的 sql 语句 String sql = "delete from users where id=?"; //获得 PreparedStatement 对象 PreparedStatement preparedStatement = connection.prepareStatement(sql); //为 sql 语句绑定参数 preparedStatement.setObject(1, 1); //执行,返回值为 sql 语句影响的行数 int len = preparedStatement.executeUpdate(); System.out.println(len > 0 ? "删除成功" : "删除失败"); //关闭资源 preparedStatement.close(); connection.close(); } }运行代码,查看控制台,如下图所示:

图 9 成功删除数据
查看数据库 users 表,发现表中的数据被删除了。再次启动 QueryTest 类进行查询,查看控制台,如下图所示,结果为空。

图 10 再次查询数据,结果为空