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


    在这里插入图片描述

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

    1. 引入依赖

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

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

    <dependencies>
        <dependency>
            <groupId>org.springframeworkgroupId>
            <artifactId>spring-coreartifactId>
            <version>5.3.10version> 
        dependency>
        <dependency>
            <groupId>org.springframeworkgroupId>
            <artifactId>spring-jdbcartifactId>
            <version>5.3.10version> 
        dependency>
        
    dependencies>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13

    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>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10

    上述配置示例中,我们使用 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());
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16

    在上述示例中,我们创建了一个名为 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);
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38

    在上述示例中,我们使用 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());
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16

    在上述示例中,我们创建了一个名为 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);
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16

    在上述示例中,我们创建了一个名为 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);
                }
            }
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28

    在上述示例中,我们使用了 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
  • 相关阅读:
    乐趣国学—品读“富润屋,德润身。”中的智慧
    C++歌曲播放管理系统
    力扣(LeetCode)313. 超级丑数(2022.11.10)
    java计算机毕业设计基于springboot 餐馆点餐订餐外卖系统
    GPU不够用:语言模型的分布式挑战
    Python 打印素数
    【BurpSuite】插件学习之Software Vulnerability Scanner
    8.springboot的自定义配置(@value注解和@ConfigurationProperties)
    前端代码统计工具cloc的安装与使用
    MySQL索引失效场景,索引优化,索引原理
  • 原文地址:https://blog.csdn.net/qq_21484461/article/details/133622926