首页 > 编程笔记 > Java笔记 阅读:40

Java JDBC操作MySQL数据库(增删改查,附带实例)

Java 代码能够实现将数据保存在变量、数组、集合等内存空间中,但这只是暂时保存,如果想要长期保存该怎么办呢?方法一,借助 IO 流将数据写入文件,不足之处是不方便管理数据以及维护数据的关系。方法二,借助数据库管理软件,比如 MySQL,相对来说它可以更方便地管理数据。

既然如此,我们是否可以集二者之所长,将其结合起来呢?即 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 数据库。

Java程序连接MySQL数据库

借助 Java 程序连接 MySQL 数据库,具体步骤如下:
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 表结构如下表所示:

表:users表结构
  字段名称 数据类型 Key
用户编号 id INT PRI
用户名 username VARCHAR(20)  
密码 password VARCHAR(50)  
邮箱 email 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 再次查询数据,结果为空

相关文章