7.1. JDBC简介

机器学
• 阅读 414

1. 什么是JDBC?

JDBC(Java Database Connectivity)是一个Java API,用于连接和执行SQL语句与关系型数据库进行交互。JDBC提供了一组接口和类,使Java程序能够与各种数据库通信,如MySQL、Oracle、PostgreSQL等。

2. JDBC的主要组件

JDBC主要由以下几个组件组成:

  • DriverManager:负责加载数据库驱动,并建立与数据库的连接。
  • Connection:表示与数据库的连接。
  • Statement:用于执行SQL语句。
  • PreparedStatement:用于执行预编译的SQL语句。
  • ResultSet:表示查询结果集。

3. 连接数据库

在连接数据库之前,需要确保已经安装了相应的数据库驱动并将其添加到项目中。以下是一个简单示例,演示如何使用JDBC连接到MySQL数据库:

java

Copy

import java.sql.Connection;
import java.sql.DriverManager;

public class JdbcConnectExample {
    public static void main(String[] args) {
        try {
            // 加载数据库驱动
            Class.forName("com.mysql.cj.jdbc.Driver");

            // 连接到数据库
            String url = "jdbc:mysql://localhost:3306/mydb?useUnicode=true&characterEncoding=utf-8&useSSL=false&allowPublicKeyRetrieval=true";
            String username = "root";
            String password = "mypassword";
            Connection connection = DriverManager.getConnection(url, username, password);

            System.out.println("Connected to database!");

            // 关闭连接
            connection.close();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

4. 执行SQL查询

要使用JDBC执行SQL查询,可以创建一个Statement对象,然后调用其executeQuery()方法。以下是一个简单示例,演示如何查询数据库中的数据:

java

Copy

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

public class JdbcQueryExample {
    public static void main(String[] args) {
        try {
            // 加载数据库驱动并连接到数据库
            Class.forName("com.mysql.cj.jdbc.Driver");
            String url = "jdbc:mysql://localhost:3306/mydb?useUnicode=true&characterEncoding=utf-8&useSSL=false&allowPublicKeyRetrieval=true";
            String username = "root";
            String password = "mypassword";
            Connection connection = DriverManager.getConnection(url, username, password);

            // 创建Statement对象并执行SQL查询
            Statement statement = connection.createStatement();
            String sql = "SELECT id, name FROM users";
            ResultSet resultSet = statement.executeQuery(sql);

            // 处理结果集
            while (resultSet.next()) {
                int id = resultSet.getInt("id");
                String name = resultSet.getString("name");
                System.out.println("ID: " + id + ", Name: " + name);
            }

            // 关闭资源
            resultSet.close();
            statement.close();
            connection.close();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

5. 执行SQL更新

要使用JDBC执行SQL更新(如插入、更新或删除),可以创建一个Statement对象,然后调用其executeUpdate()方法。以下是一个简单示例,演示如何向数据库中插入数据:

java

Copy

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

public class JdbcUpdateExample {
    public static void main(String[] args) {
        try {
            // 加载数据库驱动并连接到数据库
            Class.forName("com.mysql.cj.jdbc.Driver");
            String url = "jdbc:mysql://localhost:3306/mydb?useUnicode=true&characterEncoding=utf-8&useSSL=false&allowPublicKeyRetrieval=true";
            String username = "root";
            String password = "mypassword";
            Connection connection = DriverManager.getConnection(url, username, password);

            // 创建Statement对象并执行SQL更新
            Statement statement = connection.createStatement();
            String sql = "INSERT INTO users (name, age) VALUES ('John Doe', 30)";
            int rowsAffected = statement.executeUpdate(sql);

            System.out.println("Rows affected: " + rowsAffected);

            // 关闭资源
            statement.close();
            connection.close();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

**6. 使用PreparedStatement**

`PreparedStatement`是一个预编译的`Statement`对象,可以提高SQL语句的执行效率。它还可以防止SQL注入攻击。以下是一个简单示例,演示如何使用`PreparedStatement`插入数据:

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

public class JdbcPreparedStatementExample {
    public static void main(String[] args) {
        try {
            // 加载数据库驱动并连接到数据库
            Class.forName("com.mysql.cj.jdbc.Driver");
            String url = "jdbc:mysql://localhost:3306/mydb?useUnicode=true&characterEncoding=utf-8&useSSL=false&allowPublicKeyRetrieval=true";
            String username = "root";
            String password = "mypassword";
            Connection connection = DriverManager.getConnection(url, username, password);

            // 创建PreparedStatement对象并执行SQL更新
            String sql = "INSERT INTO users (name, age) VALUES (?, ?)";
            PreparedStatement preparedStatement = connection.prepareStatement(sql);
            preparedStatement.setString(1, "Jane Doe");
            preparedStatement.setInt(2, 28);
            int rowsAffected = preparedStatement.executeUpdate();

            System.out.println("Rows affected: " + rowsAffected);

            // 关闭资源
            preparedStatement.close();
            connection.close();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

7. 事务处理

事务是一组逻辑操作单元,执行这些操作要么全部成功,要么全部失败。在JDBC中,可以使用Connection对象的commit()rollback()方法进行事务处理。以下是一个简单示例,演示如何使用事务处理:

java

Copy

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

public class JdbcTransactionExample {
    public static void main(String[] args) {
        Connection connection = null;
        PreparedStatement preparedStatement = null;

        try {
            // 加载数据库驱动并连接到数据库
            Class.forName("com.mysql.cj.jdbc.Driver");
            String url = "jdbc:mysql://localhost:3306/mydb?useUnicode=true&characterEncoding=utf-8&useSSL=false&allowPublicKeyRetrieval=true";
            String username = "root";
            String password = "mypassword";
            connection = DriverManager.getConnection(url, username, password);

            // 关闭自动提交(开启事务)
            connection.setAutoCommit(false);

            // 执行SQL更新
            String sql = "UPDATE users SET age = age + 1 WHERE id = ?";
            preparedStatement = connection.prepareStatement(sql);
            preparedStatement.setInt(1, 1);
            preparedStatement.executeUpdate();

            // 提交事务
            connection.commit();
            System.out.println("Transaction committed.");
        } catch (Exception e) {
            // 回滚事务
            try {
                if (connection != null) {
                    connection.rollback();
                    System.out.println("Transaction rolled back.");
                }
            } catch (Exception ex) {
                ex.printStackTrace();
            }
            e.printStackTrace();
        } finally {
            // 关闭资源
            try {
                if (preparedStatement != null) {
                    preparedStatement.close();
                }
                if (connection != null) {
                    connection.close();
                }
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    }
}

8. 关闭资源

在JDBC中,需要确保及时关闭资源,如ConnectionStatementResultSet等。可以使用close()方法或者Java 7中引入的try-with-resources语句进行资源关闭。以下是一个简单示例,演示如何使用try-with-resources关闭资源:

java

Copy

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

public class JdbcCloseResourceExample {
    public static void main(String[] args) {
        try {
            // 加载数据库驱动
            Class.forName("com.mysql.cj.jdbc.Driver");

            // 连接到数据库
            String url = "jdbc:mysql://localhost:3306/mydb?useUnicode=true&characterEncoding=utf-8&useSSL=false&allowPublicKeyRetrieval=true";
            String username = "root";
            String password = "mypassword";

            try (Connection connection = DriverManager.getConnection(url, username, password);
                 Statement statement = connection.createStatement()) {

                // 执行SQL查询并处理结果集

推荐阅读:

https://mp.weixin.qq.com/s/dV2JzXfgjDdCmWRmE0glDA

https://mp.weixin.qq.com/s/an83QZOWXHqll3SGPYTL5g

7.1. JDBC简介

点赞
收藏
评论区
推荐文章
Wesley13 Wesley13
3年前
jdbc、jpa、spring data jpa、hibernate、mybatis之间的关系及区别
基础概念jdbc(JavaDataBaseConnectivity)是java连接数据库操作的原生接口。JDBC对Java程序员而言是API,对实现与数据库连接的服务提供商而言是接口模型。作为API,JDBC为程序开发提供标准的接口,并为各个数据库厂商及第三方中间件厂商实现与数据库的连接提供了标准方法。一句话概括:jdbc是所有
Wesley13 Wesley13
3年前
jdbc学习笔记
这里说的是如何正确使用jdbc编程接口,以获得更好的性能.jdbc主要优化有:1.选择正确的jdbc驱动程序2.Connention的优化使用连接池来管理Connection对象3.Statement的优化使用批量更新等4.Result的优化正确的从数据库中get数据等(1)选择正确的jdbc驱动程序:1jdbc
Wesley13 Wesley13
3年前
java的数据库相关操作
通过JDBC方式连接数据库1.准备工作在系统上安装mysql以及java开发环境,IDE等。检查:1.eclipse可以编译运行程序2.MySQL用户名密码正确3.查询表存在,查询语句可以执行2.下载
Wesley13 Wesley13
3年前
java数据库
1.jdbc JDBC(JavaDataBaseConnectivity,java数据库连接)是一种用于执行SQL语句的JavaAPI,可以为多种关系数据库提供统一访问,它由一组用Java语言(https://www.oschina.net/action/GoToLink?urlhttps%3A%2F%2Fbaike.baidu.com%2
Wesley13 Wesley13
3年前
java8_api_jdbc
jdbc1   jdbc的概念   驱动的分类   连接oracle数据库      与任何表格数据源交互      代码编写步骤      加载驱动         Class.forName         DriverManager.registerDriver
Wesley13 Wesley13
3年前
JavaEE之Hibernate(开放源代码的对象关系映射框架)
Hibernate(开放源代码的对象关系映射框架)1.简介Hibernate是一个开放源代码的对象关系映射框架,它对JDBC进行了非常轻量级的对象封装,它将POJO与数据库表建立映射关系,是一个全自动的orm框架,hibernate可以自动生成SQL语句,自动执行,使得Java程序员可以随
Wesley13 Wesley13
3年前
JDBC完美连接方法
jdbc:mysql://localhost:3306:test这句里面分如下解析:jdbc:mysql://是指JDBC连接方式;localhost:是指你的本机地址;3306SQL数据库的端口号;test就是你要连接的数据库的地址。结果集(ResultSet)是数据中查询结果返回的
Wesley13 Wesley13
3年前
JDBC
JDBCJDBC(JavaDatabaseConnectivity):1\.是一个独立于特定数据库管理系统、通用的SQL数据库存取和操作的公共接口(一组API)2.JDBC为访问不同的数据库提供了一种统一的途径,3.JDBC的目标是使Java程序员使用JDBC可以连接任何提供了JDBC驱动程序的数据库系统4.JDBC接
Stella981 Stella981
3年前
ShardingSphere学习:03
JDBC规范与ShardingSphereShardingSphere是一种典型的客户端分片解决方案,而客户端分片的实现方式之一就是重写JDBC规范。JDBC规范简介JDBC(JavaDatabaseConnectivity)的设计初衷是提供一套用于各种数据库的统一标准,而不同
Wesley13 Wesley13
3年前
JDBC详细说明+使用
JDBC详解(https://www.oschina.net/action/GoToLink?urlhttps%3A%2F%2Fwww.cnblogs.com%2Ferbing%2Fp%2F5805727.html)一、相关概念1.什么是JDBC  JDBC(JavaDataBaseConnectivity,java数据库连接
Stella981 Stella981
3年前
PreparedStatement的用法以及与Statement的区别
jdbc(javadatabaseconnectivity,java数据库连接)的api中的主要的四个类之一的java.sql.statement要求开发者付出大量的时间和精力。在使用statement获取jdbc访问时所具有的一个共通的问题是输入适当格式的日期和时间戳:2002020520:56或者02/05/028:56pm。通过使