Spring中如何操作JDBC的实现

Spring中操作JDBC主要有以下三种方式:

  1. 使用JdbcTemplate或NamedParameterJdbcTemplate
  2. 实现JdbcOperations接口
  3. 使用SimpleJdbcInsert或SimpleJdbcCall

下面对每种方式进行详细的讲解。

1. 使用JdbcTemplate或NamedParameterJdbcTemplate

JdbcTemplate是Spring提供的一个JDBC操作类,用于简化JDBC的使用,并提供了批处理和分页查询等功能。和原生的JDBC相比,使用JdbcTemplate可以减少代码量,降低出错率,并且提高了代码的可维护性。

使用JdbcTemplate的步骤如下:

  1. 创建数据源

java
@Bean
public DataSource dataSource() {
DriverManagerDataSource dataSource = new DriverManagerDataSource();
dataSource.setDriverClassName("org.h2.Driver");
dataSource.setUrl("jdbc:h2:mem:test;DB_CLOSE_DELAY=-1");
dataSource.setUsername("sa");
dataSource.setPassword("");
return dataSource;
}

  1. 创建JdbcTemplate对象

```java
@Autowired
private DataSource dataSource;

@Bean
public JdbcTemplate jdbcTemplate() {
return new JdbcTemplate(dataSource());
}
```

  1. 执行SQL语句

```java
@Autowired
private JdbcTemplate jdbcTemplate;

public void saveUser(User user) {
String sql = "INSERT INTO t_user(id, name, age) VALUES(?, ?, ?)";
jdbcTemplate.update(sql, user.getId(), user.getName(), user.getAge());
}
```

  1. 使用NamedParameterJdbcTemplate

JdbcTemplate使用问号占位符作为参数标识符,而NamedParameterJdbcTemplate使用命名参数作为参数标识符,并提供了更加灵活的参数传递方式。

```java
@Autowired
private NamedParameterJdbcTemplate namedParameterJdbcTemplate;

public void saveUser(User user) {
String sql = "INSERT INTO t_user(id, name, age) VALUES(:id, :name, :age)";
Map paramMap = new HashMap<>();
paramMap.put("id", user.getId());
paramMap.put("name", user.getName());
paramMap.put("age", user.getAge());
namedParameterJdbcTemplate.update(sql, paramMap);
}
```

2. 实现JdbcOperations接口

JdbcOperations是Spring提供的一个JDBC操作接口,它定义了JDBC操作的基本功能。我们可以通过实现这个接口来封装我们自己的JDBC操作类。

实现JdbcOperations接口的步骤如下:

  1. 创建数据源

同使用JdbcTemplate。

  1. 创建JdbcOperations对象

```java
@Autowired
private DataSource dataSource;

@Bean
public JdbcOperations jdbcOperations() {
return new JdbcTemplate(dataSource());
}
```

  1. 实现JdbcOperations接口

```java
@Autowired
private JdbcOperations jdbcOperations;

public void saveUser(User user) {
String sql = "INSERT INTO t_user(id, name, age) VALUES(?, ?, ?)";
jdbcOperations.update(sql, user.getId(), user.getName(), user.getAge());
}
```

3. 使用SimpleJdbcInsert或SimpleJdbcCall

SimpleJdbcInsert和SimpleJdbcCall是Spring提供的两个JDBC操作类,它们分别用于插入和调用存储过程。

使用SimpleJdbcInsert和SimpleJdbcCall的步骤如下:

  1. 创建数据源

同使用JdbcTemplate。

  1. 创建SimpleJdbcInsert或SimpleJdbcCall对象

```java
@Autowired
private DataSource dataSource;

@Bean
public SimpleJdbcInsert simpleJdbcInsert() {
return new SimpleJdbcInsert(dataSource())
.withTableName("t_user")
.usingGeneratedKeyColumns("id");
}

@Bean
public SimpleJdbcCall simpleJdbcCall() {
return new SimpleJdbcCall(dataSource()).withProcedureName("PROCEDURE_NAME");
}
```

  1. 执行SQL语句

```java
@Autowired
private SimpleJdbcInsert simpleJdbcInsert;

public void saveUser(User user) {
Map paramMap = new HashMap<>();
paramMap.put("id", user.getId());
paramMap.put("name", user.getName());
paramMap.put("age", user.getAge());
simpleJdbcInsert.execute(paramMap);
}

@Autowired
private SimpleJdbcCall simpleJdbcCall;

public void callProcedure(int arg1, String arg2) {
Map paramMap = new HashMap<>();
paramMap.put("arg1", arg1);
paramMap.put("arg2", arg2);
simpleJdbcCall.execute(paramMap);
}
```

以上就是Spring中操作JDBC的三种方式,分别是使用JdbcTemplate或NamedParameterJdbcTemplate、实现JdbcOperations接口、使用SimpleJdbcInsert或SimpleJdbcCall。下面来看两个示例。

示例1:使用JdbcTemplate或NamedParameterJdbcTemplate

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.jdbc.core.namedparam.NamedParameterJdbcTemplate;
import org.springframework.stereotype.Component;

import java.util.HashMap;
import java.util.Map;

@Component
public class UserDao {

    @Autowired
    private JdbcTemplate jdbcTemplate;

    @Autowired
    private NamedParameterJdbcTemplate namedParameterJdbcTemplate;

    public void save(User user) {
        String insertSql = "INSERT INTO user(id, name, age) VALUES(?, ?, ?)";
        jdbcTemplate.update(insertSql, user.getId(), user.getName(), user.getAge());

        String updateSql = "UPDATE user SET age=? WHERE id=?";
        jdbcTemplate.update(updateSql, user.getAge() + 1, user.getId());

        String deleteSql = "DELETE FROM user WHERE id=?";
        jdbcTemplate.update(deleteSql, user.getId());

        String selectSql = "SELECT * FROM user WHERE id=?";
        User queryResult = jdbcTemplate.queryForObject(selectSql, new Object[]{user.getId()},
                (rs, rowNum) -> new User(rs.getInt("id"), rs.getString("name"), rs.getInt("age")));

        String namedSql = "INSERT INTO user(id, name, age) VALUES(:id, :name, :age)";
        Map<String, Object> paramMap = new HashMap<>();
        paramMap.put("id", user.getId());
        paramMap.put("name", user.getName());
        paramMap.put("age", user.getAge());
        namedParameterJdbcTemplate.update(namedSql, paramMap);
    }
}

以上示例中使用了JdbcTemplate和NamedParameterJdbcTemplate来分别执行增、删、改、查操作,其中查询用户信息使用了lambda表达式。

示例2:使用SimpleJdbcInsert或SimpleJdbcCall

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.jdbc.core.namedparam.SqlParameterSource;
import org.springframework.jdbc.core.simple.SimpleJdbcCall;
import org.springframework.stereotype.Component;

import javax.annotation.PostConstruct;
import javax.sql.DataSource;
import java.util.HashMap;
import java.util.Map;

@Component
public class UserProcedureCaller {

    @Autowired
    private DataSource dataSource;

    private SimpleJdbcCall simpleJdbcCall;

    @PostConstruct
    public void init() {
        simpleJdbcCall = new SimpleJdbcCall(dataSource)
                .withProcedureName("USER_PROCEDURE")
                .returningResultSet("result", (rs, rowNum) -> new User(rs.getInt("id"), rs.getString("name"), rs.getInt("age")));
    }

    public User callUserProcedure(int id, String name, int age) {
        Map<String, Object> paramMap = new HashMap<>();
        paramMap.put("id", id);
        paramMap.put("name", name);
        paramMap.put("age", age);

        SqlParameterSource in = new MapSqlParameterSource(paramMap);

        Map<String, Object> out = simpleJdbcCall.execute(in);

        return (User) out.get("result");
    }
}

以上示例中使用了SimpleJdbcCall来调用存储过程,并使用了returningResultSet方法来指定返回结果类型。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Spring中如何操作JDBC的实现 - Python技术站

(0)
上一篇 2023年5月20日
下一篇 2023年5月20日

相关文章

  • 详解Spring Boot 目录文件结构

    下面是详解Spring Boot目录文件结构的攻略。 目录文件结构 作为一款快速构建Java Web应用的框架,Spring Boot提供了一套默认的目录结构,旨在帮助开发人员快速搭建应用并进行开发,其目录文件结构如下: project ├── src/main/java │ └── com/example/demo │ ├── controller │ ├…

    Java 2023年5月15日
    00
  • Java System.currentTimeMillis()时间的单位转换与计算方式案例详解

    Java System.currentTimeMillis()时间的单位转换与计算方式案例详解 什么是Java中的System.currentTimeMillis()? 在Java中,我们可以通过System.currentTimeMillis()方法来获取当前时间戳,返回的是当前时间与UTC标准时间1970年1月1日0时0分0秒之间的毫秒数,也称为时间戳或…

    Java 2023年5月20日
    00
  • SpringBoot整合Redis实现序列化存储Java对象的操作方法

    下面我来详细讲解“SpringBoot整合Redis实现序列化存储Java对象的操作方法”的完整攻略。 一、准备工作 在使用SpringBoot整合Redis以实现Java对象的存储前,我们需要先进行一些准备工作。 在pom.xml中引入Redis相关的依赖,可以使用Jedis或Lettuce两个库。这里我以Lettuce为例: <dependency…

    Java 2023年6月3日
    00
  • java简单实现数组中的逆序对

    实现思路 数组中的逆序对指的是,数组中所有的俩俩元素,如果前面的元素大于后面的元素,则它们就是一个逆序对。 具体实现思路如下: 遍历数组,对于每个元素, 在数组中找到比该元素小的所有元素,并记录其数量。可以使用嵌套循环实现。 假设当前元素为 a[i],a[i] 在数组中的位置为 index(a[i]),比 a[i] 小的元素在数组中的位置依次为 index(…

    Java 2023年5月26日
    00
  • Java 中EasyExcel的使用方式

    下面是Java中EasyExcel的使用方式的完整攻略: 1. 简介 EasyExcel是一款基于Java开发的、功能强大的Excel读写解决方案,使用起来方便快捷,支持读写Excel、CSV、HTML、JSON等文件格式,并且具有高性能,内存消耗低等优点,是目前比较流行的Excel读写工具之一。 2. 如何使用 2.1 引入依赖 在项目中引入EasyExc…

    Java 2023年6月2日
    00
  • java利用时间格式生成唯一文件名的方法

    当我们需要生成唯一的文件名时,可以使用当前时间格式化的字符串作为文件名的一部分。这种方法可以有效避免文件名重复的问题。下面就是Java利用时间格式生成唯一文件名的方法攻略。 步骤一:创建日期格式 我们可以使用java.text.DateFormat类中的方法format对当前时间进行格式化。首先需要创建一个日期格式,以便后续使用。可以使用SimpleDate…

    Java 2023年5月20日
    00
  • java中实现创建目录与创建文件的操作实例

    以下是Java中创建目录和文件的操作实例: 创建目录 在Java中,可以使用File类的mkdir()方法来创建目录。这个方法用于创建一个目录,但它只会创建最后一级目录,如果上级目录不存在,则会创建失败。 示例1:创建单层目录 import java.io.File; public class CreateDirectory { public static …

    Java 2023年5月20日
    00
  • 详解SpringBoot中的统一异常处理

    下面我将为你详细讲解“详解SpringBoot中的统一异常处理”的完整攻略。 什么是SpringBoot中的统一异常处理 在SpringBoot中,我们经常需要对抛出的异常进行统一处理。如果我们每个地方都去捕捉异常,并进行相应处理,那么代码量会非常大。此时,我们可以使用SpringBoot中的统一异常处理,将所有异常集中处理,大大减少了代码量,也方便了我们对…

    Java 2023年5月27日
    00
合作推广
合作推广
分享本页
返回顶部