使用 Java 执行 SQL 语句和存储过程

使用 Java 执行 SQL 语句和存储过程,通常有两种主要的方式:使用 JDBC(Java Database Connectivity)或者通过框架如 Spring Data JPA、MyBatis 等。

1. 使用 JDBC 执行 SQL 语句

JDBC 是 Java 操作数据库的标准 API。以下是通过 JDBC 执行 SQL 语句的基本步骤:

  1. 加载数据库驱动程序。
  2. 获取数据库连接。
  3. 创建 StatementPreparedStatement 对象。
  4. 执行 SQL 语句。
  5. 处理查询结果(如果有)。
  6. 关闭资源。

示例代码:执行普通的 SQL 查询

java 复制代码
import java.sql.*;

public class JdbcExample {
    public static void main(String[] args) {
        String url = "jdbc:mysql://localhost:3306/your_database";
        String user = "root";
        String password = "your_password";
        
        Connection conn = null;
        Statement stmt = null;
        ResultSet rs = null;

        try {
            // 1. 加载 JDBC 驱动程序
            Class.forName("com.mysql.cj.jdbc.Driver");

            // 2. 获取数据库连接
            conn = DriverManager.getConnection(url, user, password);

            // 3. 创建 Statement 对象
            stmt = conn.createStatement();

            // 4. 执行 SQL 查询
            String sql = "SELECT * FROM your_table";
            rs = stmt.executeQuery(sql);

            // 5. 处理查询结果
            while (rs.next()) {
                int id = rs.getInt("id");
                String name = rs.getString("name");
                System.out.println("ID: " + id + ", Name: " + name);
            }
        } catch (SQLException | ClassNotFoundException e) {
            e.printStackTrace();
        } finally {
            // 6. 关闭资源
            try {
                if (rs != null) rs.close();
                if (stmt != null) stmt.close();
                if (conn != null) conn.close();
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }
    }
}

2. 使用 JDBC 执行存储过程

存储过程是预编译的 SQL 代码,可以被数据库直接调用。通过 JDBC 调用存储过程的步骤和执行普通 SQL 类似,但需要使用 CallableStatement 对象。

步骤:

  1. 加载数据库驱动程序。
  2. 获取数据库连接。
  3. 创建 CallableStatement 对象,传入存储过程的 SQL 语句。
  4. 设置存储过程的参数。
  5. 执行存储过程。
  6. 获取存储过程的输出结果。
  7. 关闭资源。

示例代码:调用存储过程

假设有一个存储过程如下:

sql 复制代码
CREATE PROCEDURE getEmployeeInfo(IN emp_id INT)
BEGIN
    SELECT * FROM employees WHERE id = emp_id;
END

Java 代码如下:

java 复制代码
import java.sql.*;

public class JdbcStoredProcedureExample {
    public static void main(String[] args) {
        String url = "jdbc:mysql://localhost:3306/your_database";
        String user = "root";
        String password = "your_password";
        
        Connection conn = null;
        CallableStatement stmt = null;
        ResultSet rs = null;

        try {
            // 1. 加载 JDBC 驱动程序
            Class.forName("com.mysql.cj.jdbc.Driver");

            // 2. 获取数据库连接
            conn = DriverManager.getConnection(url, user, password);

            // 3. 创建 CallableStatement 对象,调用存储过程
            String sql = "{CALL getEmployeeInfo(?)}";
            stmt = conn.prepareCall(sql);

            // 4. 设置存储过程的输入参数
            stmt.setInt(1, 123);  // 假设查询员工 ID 为 123 的员工信息

            // 5. 执行存储过程
            rs = stmt.executeQuery();

            // 6. 获取存储过程的结果
            while (rs.next()) {
                int id = rs.getInt("id");
                String name = rs.getString("name");
                System.out.println("ID: " + id + ", Name: " + name);
            }
        } catch (SQLException | ClassNotFoundException e) {
            e.printStackTrace();
        } finally {
            // 7. 关闭资源
            try {
                if (rs != null) rs.close();
                if (stmt != null) stmt.close();
                if (conn != null) conn.close();
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }
    }
}

3. 使用 Spring JDBC 执行 SQL 语句

如果你使用 Spring 框架,可以通过 Spring 的 JDBC 模板简化操作。Spring JDBC 模板提供了更高级的封装,使得执行 SQL 操作更加简洁。

示例代码:使用 Spring JDBC 模板执行 SQL 查询

java 复制代码
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.jdbc.datasource.DriverManagerDataSource;

public class SpringJdbcExample {
    public static void main(String[] args) {
        // 设置数据源
        DriverManagerDataSource dataSource = new DriverManagerDataSource();
        dataSource.setDriverClassName("com.mysql.cj.jdbc.Driver");
        dataSource.setUrl("jdbc:mysql://localhost:3306/your_database");
        dataSource.setUsername("root");
        dataSource.setPassword("your_password");

        // 创建 JdbcTemplate 对象
        JdbcTemplate jdbcTemplate = new JdbcTemplate(dataSource);

        // 执行查询
        String sql = "SELECT * FROM your_table";
        jdbcTemplate.query(sql, (rs, rowNum) -> {
            int id = rs.getInt("id");
            String name = rs.getString("name");
            System.out.println("ID: " + id + ", Name: " + name);
            return null;
        });
    }
}

4. 使用 Spring JDBC 执行存储过程

Spring 也支持执行存储过程,可以通过 JdbcTemplateSimpleJdbcCall 类来实现。

示例代码:使用 Spring 执行存储过程

java 复制代码
import org.springframework.jdbc.core.SqlParameter;
import org.springframework.jdbc.core.simple.SimpleJdbcCall;
import org.springframework.jdbc.datasource.DriverManagerDataSource;

import java.sql.Types;

public class SpringStoredProcedureExample {
    public static void main(String[] args) {
        // 设置数据源
        DriverManagerDataSource dataSource = new DriverManagerDataSource();
        dataSource.setDriverClassName("com.mysql.cj.jdbc.Driver");
        dataSource.setUrl("jdbc:mysql://localhost:3306/your_database");
        dataSource.setUsername("root");
        dataSource.setPassword("your_password");

        // 创建 SimpleJdbcCall 对象
        SimpleJdbcCall jdbcCall = new SimpleJdbcCall(dataSource)
            .withProcedureName("getEmployeeInfo")  // 存储过程名
            .declareParameters(new SqlParameter("emp_id", Types.INTEGER));

        // 执行存储过程
        jdbcCall.execute(123);  // 假设查询员工 ID 为 123 的信息
    }
}

总结

  • JDBC:最基础的数据库操作方法,适合不使用任何框架时。
  • Spring JDBC:适合在 Spring 框架下使用,简化了数据库操作并处理了许多细节。
  • 存储过程:可以通过 CallableStatement 执行存储过程,存储过程本身由数据库管理,能够提高性能。
相关推荐
emma羊羊3 分钟前
【 SQL注入漏洞靶场】第二关文件读写
sql·网络安全·靶场·sql注入
叶落阁主9 分钟前
Neovim 插件 i18n.nvim 介绍
java·vue.js·vim
渣哥10 分钟前
让集合线程安全的几种靠谱方法
java
dylan_QAQ12 分钟前
Java转Go全过程06-工程管理
java·后端·go
鲸屿19523 分钟前
python之socket网络编程
开发语言·网络·python
没有梦想的咸鱼185-1037-16631 小时前
基于R语言机器学习方法在生态经济学领域中的实践技术应用
开发语言·机器学习·数据分析·r语言
a587691 小时前
消息队列(MQ)初级入门:详解RabbitMQ与Kafka
java·分布式·microsoft·面试·kafka·rabbitmq
千里码aicood1 小时前
【springboot+vue】党员党建活动管理平台(源码+文档+调试+基础修改+答疑)
java·数据库·spring boot
Chan161 小时前
【智能协同云图库】基于统一接口架构构建多维度分析功能、结合 ECharts 可视化与权限校验实现用户 / 管理员图库统计、通过 SQL 优化与流式处理提升数据
java·spring boot·后端·sql·spring·intellij-idea·echarts
先做个垃圾出来………1 小时前
差分数组(Difference Array)
java·数据结构·算法