Spring中操作JDBC主要有以下三种方式:
- 使用JdbcTemplate或NamedParameterJdbcTemplate
- 实现JdbcOperations接口
- 使用SimpleJdbcInsert或SimpleJdbcCall
下面对每种方式进行详细的讲解。
1. 使用JdbcTemplate或NamedParameterJdbcTemplate
JdbcTemplate是Spring提供的一个JDBC操作类,用于简化JDBC的使用,并提供了批处理和分页查询等功能。和原生的JDBC相比,使用JdbcTemplate可以减少代码量,降低出错率,并且提高了代码的可维护性。
使用JdbcTemplate的步骤如下:
- 创建数据源
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;
}
- 创建JdbcTemplate对象
```java
@Autowired
private DataSource dataSource;
@Bean
public JdbcTemplate jdbcTemplate() {
return new JdbcTemplate(dataSource());
}
```
- 执行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());
}
```
- 使用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.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接口的步骤如下:
- 创建数据源
同使用JdbcTemplate。
- 创建JdbcOperations对象
```java
@Autowired
private DataSource dataSource;
@Bean
public JdbcOperations jdbcOperations() {
return new JdbcTemplate(dataSource());
}
```
- 实现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的步骤如下:
- 创建数据源
同使用JdbcTemplate。
- 创建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");
}
```
- 执行SQL语句
```java
@Autowired
private SimpleJdbcInsert simpleJdbcInsert;
public void saveUser(User user) {
Map
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.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技术站