📅  最后修改于: 2023-12-03 15:20:13.188000             🧑  作者: Mango
Spring JDBC是Spring框架提供的用于数据库访问的一套工具,它提供了许多简化和优化JDBC使用的功能,使得我们可以更加容易地操作数据库。
在使用Spring JDBC时,最常用的就是创建查询。Spring JDBC提供了两种创建查询的方式,分别是使用JdbcTemplate和NamedParameterJdbcTemplate。
JdbcTemplate是Spring JDBC中最基础的一个查询工具,它是Spring封装的JDBC API,可以简化JDBC使用的过程,提高开发效率。
使用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是JdbcTemplate的升级版,它提供了一种更加直观和可读性更高的方式来处理参数化的SQL语句。
同样,使用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开发中最基础、最常用的操作之一。掌握了查询的基本使用方法,就能够轻松地完成复杂的数据库操作。