【Java 进阶篇】使用 JDBCTemplate 执行 DML 语句详解

news2024/11/20 14:31:09

在这里插入图片描述

JDBCTemplate 是 Spring 框架中的一个核心模块,用于简化 JDBC 编程,使数据库操作更加便捷和高效。在本文中,我们将重点介绍如何使用 JDBCTemplate 执行 DML(Data Manipulation Language)语句,包括插入、更新和删除操作。我们将提供详细的步骤和示例代码,以帮助基础小白更好地理解和使用这一功能。

1. 引入依赖

首先,您需要在项目中引入 Spring 的相关依赖,包括 Spring Core 和 Spring JDBC。您可以使用 Maven 或 Gradle 等构建工具来管理依赖。

如果使用 Maven,可以在 pom.xml 文件中添加以下依赖:

<dependencies>
    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-core</artifactId>
        <version>5.3.10</version> <!-- 使用最新版本 -->
    </dependency>
    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-jdbc</artifactId>
        <version>5.3.10</version> <!-- 使用最新版本 -->
    </dependency>
    <!-- 其他依赖 -->
</dependencies>

2. 配置数据源和 JDBCTemplate

在 Spring 应用程序中,通常使用数据源(DataSource)来管理数据库连接。您需要配置数据源并将其注入到 JDBCTemplate 中。以下是一个简单的配置示例:

<bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
    <property name="driverClassName" value="com.mysql.cj.jdbc.Driver" />
    <property name="url" value="jdbc:mysql://localhost:3306/mydatabase" />
    <property name="username" value="root" />
    <property name="password" value="password" />
</bean>

<bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate">
    <property name="dataSource" ref="dataSource" />
</bean>

上述配置示例中,我们使用 DriverManagerDataSource 创建了一个数据源,并将其注入到了 JdbcTemplate 中。

3. 执行插入操作

插入单条记录

要执行插入操作,首先创建一个 SQL 插入语句,然后使用 JDBCTemplate 的 update 方法执行它。以下是一个插入单条记录的示例:

import org.springframework.jdbc.core.JdbcTemplate;

public class EmployeeDao {

    private JdbcTemplate jdbcTemplate;

    // 构造函数注入 JdbcTemplate
    public EmployeeDao(JdbcTemplate jdbcTemplate) {
        this.jdbcTemplate = jdbcTemplate;
    }

    public void insertEmployee(Employee employee) {
        String sql = "INSERT INTO employees (first_name, last_name, email) VALUES (?, ?, ?)";
        jdbcTemplate.update(sql, employee.getFirstName(), employee.getLastName(), employee.getEmail());
    }
}

在上述示例中,我们创建了一个名为 EmployeeDao 的数据访问对象(DAO),它包含一个 insertEmployee 方法,用于插入单条记录。我们使用 ? 占位符来代替实际的参数值,并将参数值传递给 update 方法。这可以防止 SQL 注入攻击,提高了安全性。

插入多条记录

如果要插入多条记录,可以使用 JDBCTemplate 的批处理功能。以下是一个示例:

import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.jdbc.core.BatchPreparedStatementSetter;

import java.sql.PreparedStatement;
import java.sql.SQLException;
import java.util.List;

public class EmployeeDao {

    private JdbcTemplate jdbcTemplate;

    // 构造函数注入 JdbcTemplate
    public EmployeeDao(JdbcTemplate jdbcTemplate) {
        this.jdbcTemplate = jdbcTemplate;
    }

    public void insertEmployees(List<Employee> employees) {
        String sql = "INSERT INTO employees (first_name, last_name, email) VALUES (?, ?, ?)";
        
        // 使用 BatchPreparedStatementSetter 来设置参数
        BatchPreparedStatementSetter setter = new BatchPreparedStatementSetter() {
            @Override
            public void setValues(PreparedStatement ps, int i) throws SQLException {
                Employee employee = employees.get(i);
                ps.setString(1, employee.getFirstName());
                ps.setString(2, employee.getLastName());
                ps.setString(3, employee.getEmail());
            }
            
            @Override
            public int getBatchSize() {
                return employees.size();
            }
        };
        
        jdbcTemplate.batchUpdate(sql, setter);
    }
}

在上述示例中,我们使用 batchUpdate 方法来执行批处理插入操作。

4. 执行更新操作

更新操作用于修改数据库中已存在的记录。您可以使用 JDBCTemplate 的 update 方法执行更新操作。以下是一个更新操作的示例:

import org.springframework.jdbc.core.JdbcTemplate;

public class EmployeeDao {

    private JdbcTemplate jdbcTemplate;

    // 构造函数注入 JdbcTemplate
    public EmployeeDao(JdbcTemplate jdbcTemplate) {
        this.jdbcTemplate = jdbcTemplate;
    }

    public void updateEmployee(Employee employee) {
        String sql = "UPDATE employees SET first_name = ?, last_name = ?, email = ? WHERE id = ?";
        jdbcTemplate.update(sql, employee.getFirstName(), employee.getLastName(), employee.getEmail(), employee.getId());
    }
}

在上述示例中,我们创建了一个名为 updateEmployee 的方法,用于更新员工记录。我们使用 SQL 更新语句,并传递员工对象的属性值作为参数。

5. 执行删除操作

删除操作用于从数据库中删除记录。您可以使用 JDBCTemplate 的 update 方法执行删除操作。以下是一个删除操作的示例:

import org.springframework.jdbc.core.JdbcTemplate;

public class EmployeeDao {

    private JdbcTemplate jdbcTemplate;

    // 构造函数注入 JdbcTemplate
    public EmployeeDao(JdbcTemplate jdbcTemplate) {
        this.jdbcTemplate = jdbcTemplate;
    }

    public void deleteEmployee(int employeeId) {
        String sql = "DELETE FROM employees WHERE id = ?";
        jdbcTemplate.update(sql, employeeId);
    }
}

在上述示例中,我们创建了一个名为 deleteEmployee 的方法,用于删除员工记录。我们使用 SQL 删除语句,并传递员工的唯一标识(通常是 ID)作为参数。

6. 错误处理

在实际应用中,执行 DML 操作时可能会出现各种错误和异常,例如数据库连接失败、SQL 语法错误、数据完整性约束等。为了保证代码的健壮性,应该捕获并处理这些错误和异常。以下是一个简单的错误处理示例:

import org.springframework.dao.DataAccessException;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.jdbc.core.SQLExceptionTranslator;

public class EmployeeDao {

    private JdbcTemplate jdbcTemplate;

    // 构造函数注入 JdbcTemplate
    public EmployeeDao(JdbcTemplate jdbcTemplate) {
        this.jdbcTemplate = jdbcTemplate;
    }

    public void insertEmployee(Employee employee) {
        String sql = "INSERT INTO employees (first_name, last_name, email) VALUES (?, ?, ?)";
        try {
            jdbcTemplate.update(sql, employee.getFirstName(), employee.getLastName(), employee.getEmail());
        } catch (DataAccessException e) {
            // 数据访问异常处理
            SQLExceptionTranslator translator = jdbcTemplate.getExceptionTranslator();
            if (translator != null) {
                throw translator.translate("Insert employee failed", sql, e);
            } else {
                throw new RuntimeException("Insert employee failed", e);
            }
        }
    }
}

在上述示例中,我们使用了 Spring 的异常翻译器(SQLExceptionTranslator)来将数据库异常转换为 Spring 的通用数据访问异常(DataAccessException)。这有助于提供更加友好的错误信息和异常处理。

7. 总结

通过 JDBCTemplate,我们可以方便地执行 DML(插入、更新、删除)操作,使数据库访问更加简单和安全。在实际应用中,务必注意错误处理和异常处理,以保证系统的稳定性和可靠性。希望本文能帮助您更好地理解和使用 JDBCTemplate 执行 DML 操作。

示例代码中的 Employee 类是一个简单的 POJO,用于表示员工信息。在实际应用中,您可以根据自己的业务需求定义相应的实体类。希望这篇文章对您有所帮助,谢谢阅读!

这是关于使用 JDBCTemplate 执行 DML 语句的文章的结尾部分。如果您还有其他问题或需要更多信息,请随时提出。希望这篇文章对您有所帮助,谢谢阅读!

作者信息

作者 : 繁依Fanyi
CSDN: https://techfanyi.blog.csdn.net
掘金:https://juejin.cn/user/4154386571867191

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1064406.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

面试题:你是如何计划和组织一个大型的软件测试项目的?

今天我们讲个软件测试的面试问题&#xff1a;你是如何计划和组织一个大型的软件测试项目的&#xff1f; 这种题目&#xff0c;就是看你的流程梳理&#xff0c;一定要在回答的步骤前面加上1&#xff0c;2&#xff0c;3&#xff0c;4&#xff0c;自己就能很清晰&#xff0c;面试…

程序员如何从容地面对裁员?我有6个小建议

2023年3月&#xff0c;世界银行发布了一份题为《长期下行的增长前景&#xff1a;趋势、期望和政策》的报告&#xff0c;首次全面评估了未来全球的经济发展趋势。报告描述的趋势令人担忧&#xff1a;推动过去三十年进步和繁荣的所有经济力量几乎都在消退 2022年至2030年的全球潜…

Windows系统无法激活Python虚拟环境的解决方案:无法加载文件 ,因为在此系统上禁止运行脚本。

原文链接&#xff1a;Windows系统无法激活Python虚拟环境的解决方案 我的个人博客//推广一下w 情况描述 在Windows系统终端激活Python虚拟环境时可能出现以下报错&#xff08;假设你的虚拟环境名为“.venv”&#xff09;&#xff1a; PS (yourpath\yourProj)> .\.venv\S…

CTFHUB SSRF

目录 web351 ​编辑 web352 web353 web354 sudo.cc 代表 127 web355 host长度 web356 web357 DNS 重定向 web358 bypass web359 mysql ssrf web360 web351 POST查看 flag.php即可 web352 <?php error_reporting(0); highlight_file(__FILE__); $url$_…

【德哥说库系列】-Clickhouse集群部署(3分片2副本)

&#x1f4e2;&#x1f4e2;&#x1f4e2;&#x1f4e3;&#x1f4e3;&#x1f4e3; 哈喽&#xff01;大家好&#xff0c;我是【IT邦德】&#xff0c;江湖人称jeames007&#xff0c;10余年DBA及大数据工作经验 一位上进心十足的【大数据领域博主】&#xff01;&#x1f61c;&am…

【网络安全-信息收集】网络安全之信息收集和信息收集工具讲解(提供工具)

工具下载百度网盘链接(包含所有用到的工具&#xff09;&#xff1a; 百度网盘 请输入提取码百度网盘为您提供文件的网络备份、同步和分享服务。空间大、速度快、安全稳固&#xff0c;支持教育网加速&#xff0c;支持手机端。注册使用百度网盘即可享受免费存储空间https://pan.…

Cocos Creator3.8 项目实战(六)Combobox控件的实现和使用

在cocoscreator 中&#xff0c;没有Combobox控件&#xff0c;无奈之下只能自己动手写一个。 ⚠️ 文末附 ComboBox.ts 、ComboBoxItem.ts 完整源码&#xff0c; 可直接拿去使用。 实现原理&#xff1a; 1、Combobox 背景图background 是一个sprite 控件&#xff0c;上面放了一…

Python基本功

任何工作&#xff0c;没别的&#xff0c;就是苦练基本功&#xff0c;在篮球场上&#xff0c;我常用非常简单的基本功就可以克敌制胜&#xff0c;工作中也是如此 字符串 1&#xff1a;字符串拼接 a"人民" b123 print("我是"a""str(b))2&#x…

c语言 任意进制数的转换

/* 函数trans将无符号整数n翻译成d&#xff08;2<&#xff1d;d<&#xff1d;16&#xff09;进制表示的字符串s */ #define M sizeof(unsigned int)*8 int trans(unsigned n, int d, char s[]) {static char digits[] "0123456789ABCDEF"; /* 十六进制数字的字…

数据中台实战(06)-数据模型无法复用,归根结底还是设计问题

指标比喻成一棵树的果实&#xff0c;模型就是这棵大树的躯干&#xff0c;想果实好&#xff0c;须让树干粗壮。 1 痛点 分析师一般结合业务做数分&#xff08;需用大量数据&#xff09;&#xff0c;通过报表服务于业务部门运营。但数据中台构建前&#xff0c;分析师经常发现自…

SNP Glue:SAP数据导入到其他系统的多种方式

SAP是一款功能强大的企业资源计划&#xff08;ERP&#xff09;软件&#xff0c;许多企业依赖SAP来管理和处理其核心业务数据。然而&#xff0c;有时候企业需要将SAP中的数据导入到其他系统中&#xff0c;以实现更广泛的数据共享和集成&#xff0c;便于企业实现数据智能。本文将…

IDEA添加Vue文件模板

代码模板&#xff1a; <!-- *${COMPONENT_NAME} *author niemengshi *date ${DATE} ${TIME} --> <template> #[[$END$]]# </template> <script> export default { name: "${COMPONENT_NAME}", props: { }, components: {}, mounted: {}, d…

战火使命ssr排名,战火使命角色强度排行

在战火使命中&#xff0c;很多玩家都在关注SSR角色的强度排行&#xff0c;那么&#xff0c;下面就为大家分享一下小编整理的最新战火使命ssr排名&#xff0c;一起来看看吧。 关注【娱乐天梯】&#xff0c;获取内部福利号 一、SSR角色排名榜&#xff1a; 1. 克拉拉、艾蕾娜、杰西…

C++深入学习part_1

Linux下编译C程序 安装g命令&#xff1a;sudo apt install g 编译命令&#xff1a;$ g *.cc 或者 *.cpp -o fileName; hellworld 编译程序可以看到&#xff1a; namespace命名空间 首先&#xff0c;命名空间的提出是为了防止变量重名冲突而设置的。 浅浅试一下&#xff1…

2023年【高处安装、维护、拆除】考试题及高处安装、维护、拆除最新解析

题库来源&#xff1a;安全生产模拟考试一点通公众号小程序 高处安装、维护、拆除考试题考前必练&#xff01;安全生产模拟考试一点通每个月更新高处安装、维护、拆除最新解析题目及答案&#xff01;多做几遍&#xff0c;其实通过高处安装、维护、拆除考试资料很简单。 1、【单…

OpenCV C++ Look Up Table(查找表)

OpenCV C Look Up Table&#xff08;查找表&#xff09; 引言 在图像处理和计算机视觉中&#xff0c;查找表&#xff08;Look Up Table, LUT&#xff09;是一种非常高效和实用的方法&#xff0c;用于快速地映射或更改图像的颜色和像素值。LUT 能够极大地提高图像处理算法的执…

XSS CSRF

XSS & CSRF xss&#xff1a;跨站脚本攻击&#xff1a;注入一些非法的脚本 csrf&#xff1a;冒充身份 XSS 反射型 /welcome&#xff1a;res.send(req.query.type) 输入什么就输出什么&#xff08;httpOnly:false&#xff0c;但不是解决方案&#xff09; 比如&#xff1a;?&…

【C语言|关键字】C语言32个关键字详解

&#x1f601;博客主页&#x1f601;&#xff1a;&#x1f680;https://blog.csdn.net/wkd_007&#x1f680; &#x1f911;博客内容&#x1f911;&#xff1a;&#x1f36d;嵌入式开发、Linux、C语言、C、数据结构、音视频&#x1f36d; &#x1f923;本文内容&#x1f923;&a…

不断优化的素数算法

前言&#xff1a;素数判断是算法中重要的一环&#xff0c;掌握优秀的素数判断方法是算法player的必修课。本文介绍的是由简到繁的素数算法&#xff0c;便于初学者从入门到精通。 素数&#xff08;质数&#xff09;&#xff1a;只能被 1 和它本身整除的数称作素数&#xff0c;如…

【Linux学习】05-2Linux上部署项目

Linux&#xff08;B站黑马&#xff09;学习笔记 01Linux初识与安装 02Linux基础命令 03Linux用户和权限 04Linux实用操作 05-1Linux上安装部署各类软件 05-2Linux上部署项目 文章目录 Linux&#xff08;B站黑马&#xff09;学习笔记前言05-2Linux上部署项目部署Springboot项目…