📜  Spring JDBC-创建查询(1)

📅  最后修改于: 2023-12-03 15:20:13.188000             🧑  作者: Mango

Spring JDBC-创建查询

Spring JDBC是Spring框架提供的用于数据库访问的一套工具,它提供了许多简化和优化JDBC使用的功能,使得我们可以更加容易地操作数据库。

在使用Spring JDBC时,最常用的就是创建查询。Spring JDBC提供了两种创建查询的方式,分别是使用JdbcTemplate和NamedParameterJdbcTemplate。

JdbcTemplate

JdbcTemplate是Spring JDBC中最基础的一个查询工具,它是Spring封装的JDBC API,可以简化JDBC使用的过程,提高开发效率。

创建JdbcTemplate

使用JdbcTemplate需要先创建一个JdbcTemplate对象,可以通过构造方法或者注入方式来创建。

import javax.sql.DataSource;
import org.springframework.jdbc.core.JdbcTemplate;

public class ExampleDAO {
  
  private JdbcTemplate jdbcTemplate;
  
  public void setDataSource(DataSource dataSource) {
    this.jdbcTemplate = new JdbcTemplate(dataSource);
  }
  
  // ...
}
查询操作

查询操作可以通过JdbcTemplate中提供的query和queryForObject方法来实现,其中query方法用于查询多条记录,而queryForObject方法用于查询一条记录。

import java.util.List;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.jdbc.core.RowMapper;

public class ExampleDAO {
  
  private JdbcTemplate jdbcTemplate;

  public void setJdbcTemplate(JdbcTemplate jdbcTemplate) {
    this.jdbcTemplate = jdbcTemplate;
  }
  
  public List<Example> findAll() {
    String sql = "SELECT * FROM example";
    RowMapper<Example> rowMapper = new ExampleRowMapper();
    return jdbcTemplate.query(sql, rowMapper);
  }
  
  public Example findById(Long id) {
    String sql = "SELECT * FROM example WHERE id = ?";
    RowMapper<Example> rowMapper = new ExampleRowMapper();
    return jdbcTemplate.queryForObject(sql, rowMapper, id);
  }
  
  // ...
}

其中Example是一个实体类,ExampleRowMapper是一个用于将查询结果转换为Example对象的RowMapper。

参数化查询

在执行查询时,如果需要传递参数,可以将参数放入一个参数数组中,并将数组作为query或queryForObject方法中的第二个参数传递。例如:

import java.util.List;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.jdbc.core.RowMapper;

public class ExampleDAO {
  
  private JdbcTemplate jdbcTemplate;
  
  public void setJdbcTemplate(JdbcTemplate jdbcTemplate) {
    this.jdbcTemplate = jdbcTemplate;
  }
  
  public List<Example> findByType(String type) {
    String sql = "SELECT * FROM example WHERE type = ?";
    RowMapper<Example> rowMapper = new ExampleRowMapper();
    return jdbcTemplate.query(sql, rowMapper, type);
  }
  
  // ...
}
批量操作

如果需要执行批量操作,可以使用JdbcTemplate中提供的batchUpdate方法。例如:

import org.springframework.jdbc.core.JdbcTemplate;

public class ExampleDAO {
  
  private JdbcTemplate jdbcTemplate;
  
  public void setJdbcTemplate(JdbcTemplate jdbcTemplate) {
    this.jdbcTemplate = jdbcTemplate;
  }
  
  public void save(List<Example> examples) {
    String sql = "INSERT INTO example (name, type) VALUES (?, ?)";
    jdbcTemplate.batchUpdate(sql, new ExampleBatchPreparedStatementSetter(examples));
  }
  
  // ...
}

其中ExampleBatchPreparedStatementSetter是一个实现了PreparedStatementSetter接口的类,用于将参数设置到PreparedStatement中。

NamedParameterJdbcTemplate

NamedParameterJdbcTemplate是JdbcTemplate的升级版,它提供了一种更加直观和可读性更高的方式来处理参数化的SQL语句。

创建NamedParameterJdbcTemplate

同样,使用NamedParameterJdbcTemplate需要先创建一个NamedParameterJdbcTemplate对象,可以通过构造方法或者注入方式来创建。

import javax.sql.DataSource;
import org.springframework.jdbc.core.namedparam.NamedParameterJdbcTemplate;

public class ExampleDAO {
  
  private NamedParameterJdbcTemplate namedParameterJdbcTemplate;
  
  public void setDataSource(DataSource dataSource) {
    this.namedParameterJdbcTemplate = new NamedParameterJdbcTemplate(dataSource);
  }
  
  // ...
}
查询操作

查询操作可以通过NamedParameterJdbcTemplate中提供的query和queryForObject方法来实现,其中query方法用于查询多条记录,而queryForObject方法用于查询一条记录。

import java.util.HashMap;
import java.util.List;
import java.util.Map;
import org.springframework.jdbc.core.RowMapper;
import org.springframework.jdbc.core.namedparam.MapSqlParameterSource;
import org.springframework.jdbc.core.namedparam.NamedParameterJdbcTemplate;

public class ExampleDAO {
  
  private NamedParameterJdbcTemplate namedParameterJdbcTemplate;
  
  public void setNamedParameterJdbcTemplate(NamedParameterJdbcTemplate namedParameterJdbcTemplate) {
    this.namedParameterJdbcTemplate = namedParameterJdbcTemplate;
  }
  
  public List<Example> findByType(String type) {
    String sql = "SELECT * FROM example WHERE type = :type";
    MapSqlParameterSource params = new MapSqlParameterSource();
    params.addValue("type", type);
    RowMapper<Example> rowMapper = new ExampleRowMapper();
    return namedParameterJdbcTemplate.query(sql, params, rowMapper);
  }
  
  public Example findById(Long id) {
    String sql = "SELECT * FROM example WHERE id = :id";
    Map<String, Object> params = new HashMap<>();
    params.put("id", id);
    RowMapper<Example> rowMapper = new ExampleRowMapper();
    return namedParameterJdbcTemplate.queryForObject(sql, params, rowMapper);
  }
  
  // ...
}
批量操作

如果需要执行批量操作,同样可以使用NamedParameterJdbcTemplate中提供的batchUpdate方法来实现。例如:

import java.util.List;
import org.springframework.jdbc.core.namedparam.MapSqlParameterSource;
import org.springframework.jdbc.core.namedparam.NamedParameterJdbcTemplate;

public class ExampleDAO {
  
  private NamedParameterJdbcTemplate namedParameterJdbcTemplate;
  
  public void setNamedParameterJdbcTemplate(NamedParameterJdbcTemplate namedParameterJdbcTemplate) {
    this.namedParameterJdbcTemplate = namedParameterJdbcTemplate;
  }
  
  public void save(List<Example> examples) {
    String sql = "INSERT INTO example (name, type) VALUES (:name, :type)";
    namedParameterJdbcTemplate.batchUpdate(sql, examples.stream()
        .map(example -> new MapSqlParameterSource()
            .addValue("name", example.getName())
            .addValue("type", example.getType()))
        .toArray(MapSqlParameterSource[]::new));
  }
  
  // ...
}
总结

无论是使用JdbcTemplate还是NamedParameterJdbcTemplate,创建查询都是Spring JDBC开发中最基础、最常用的操作之一。掌握了查询的基本使用方法,就能够轻松地完成复杂的数据库操作。