背景:
- JDBC 已经能够满足大部分用户最基本的需求,但是在使用 JDBC 时,必须自己来管理数据库资源,例如:
- 获取 PreparedStatement、设置 SQL 语句参数、关闭连接等步骤。
定义:
JdbcTemplate
是 Spring 框架中用于简化数据库访问的类。它封装了 JDBC 的细节,并提供了便捷的方法来执行 SQL 语句和处理结果。JdbcTemplate 是 Spring 的一部分,它处理了资源的建立和释放,帮助我们避免一些常见的错误,比如:忘记关闭连接等。它运行核心的 JDBC 工作流,如 Statement 的建立和执行,而我们只需要提供 SQL 语句和提取结果。
以下是一个简单的例子,展示了如何使用 JdbcTemplate
来操作数据库中的用户信息。
首先,确保你的项目中包含了 Spring JDBC 的依赖。如果你使用 Maven,可以在 pom.xml 文件中添加以下依赖:
<dependency>
<groupId>org.springframework.bootgroupId>
<artifactId>spring-boot-starter-data-jdbcartifactId>
dependency>
<dependency>
<groupId>org.springframework.bootgroupId>
<artifactId>spring-boot-starter-jdbcartifactId>
dependency>
<dependency>
<groupId>mysqlgroupId>
<artifactId>mysql-connector-javaartifactId>
<scope>runtimescope>
dependency>
然后,配置你的数据源。在 Spring Boot 项目中,通常使用 application.properties
或 application.yml
文件完成:
# application.properties 示例
spring.datasource.url=jdbc:mysql://localhost:3306/your_database?useSSL=false&serverTimezone=UTC
spring.datasource.username=your_username
spring.datasource.password=your_password
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
现在,你可以在你的服务类或 DAO 类中注入 JdbcTemplate
并使用它。
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.stereotype.Service;
@Service
public class UserService {
private final JdbcTemplate jdbcTemplate;
@Autowired
public UserService(JdbcTemplate jdbcTemplate) {
this.jdbcTemplate = jdbcTemplate;
}
// ...
}
在 JdbcTemplate 中执行 SQL 语句的方法大致分为 3 大类:
execute()
:可以执行所有 SQL 语句,一般用于执行 DDL 语句。update()
:用于执行 INSERT、UPDATE、DELET 等 DML 语句。queryXxx()
:用于 DQL 数据查询语句。execute()
方法是 JdbcTemplate 中最通用的方法,可以用于执行任何 SQL 语句。这个方法通常用于执行 DDL(数据定义语言)语句,比如:创建表、修改表结构等,但它也可以用于执行其他类型的 SQL 语句。
用法一:无返回结果的示例(DDL语句)
import org.springframework.jdbc.core.JdbcTemplate;
// ... 其他代码,比如数据源的配置、JdbcTemplate 的实例化 ...
public void createTable() {
String sql = "CREATE TABLE t_user (id INT PRIMARY KEY, name VARCHAR(50))";
jdbcTemplate.execute(sql);
}
用法二:有返回结果的示例(使用 ConnectionCallback)
虽然 execute()
方法本身不直接返回查询结果,但你可以通过传递一个 ConnectionCallback
来处理查询结果。这通常不是 execute() 方法的典型用法,因为对于查询来说,更推荐使用 queryXxx()
方法。然而,为了说明可以通过 execute() 方法处理结果,这里提供一个 非典型用法的示例:
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.jdbc.core.ConnectionCallback;
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.Statement;
// ... 其它代码 ...
public void executeWithResult() {
String sql = "SELECT COUNT(*) FROM t_user";
jdbcTemplate.execute(new ConnectionCallback<Integer>() {
@Override
public Integer doInConnection(Connection con) throws SQLException {
Statement stmt = con.createStatement();
ResultSet rs = stat.executeQuery(sql);
if (rs.next()) {
return rs.getInt(1); // 返回查询结果的第一列值
}
return 0; // 如果没有结果,返回0
}
});
}
注意: 上面的示例中,我们实际上绕过了 JdbcTemplate
的大部分功能(比如异常处理和资源管理)。在实际应用中,应该尽量避免这样的用法,而是使用 JdbcTemplate 提供的更高级别的查询方法。
update()
方法用于执行 INSERT、UPDATE 和 DELETE 等 DML(数据操纵语言)语句。这些方法通常返回一个整数,表示受影响的行数。
import org.springframework.jdbc.core.JdbcTemplate;
// ... 其它代码 ...
/** 插入用户 */
public void insertUser(int id, String name) {
String sql = "INSERT INTO t_user (id, name) VALUES (?, ?)";
jdbcTemplate.update(sql, id, name);
}
/** 根据id更新姓名 */
public void updateUserName(int id, String newName) {
String sql = "UPDATE t_user SET name = ? WHERE id = ?";
jdbcTemplate.update(sql, newName, id);
}
/** 根据id删除用户 */
public void deleteUser(int id) {
String sql = "DELETE FROM t_user WHERE id = ?";
jdbcTemplate.update(sql, id);
}
queryXxx()
方法用于执行 DQL(数据查询语言)语句,并返回查询结果。这些方法有很多变体,可以根据查询结果的类型选择不同的方法。
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.jdbc.core.RowMapper;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.List;
// ... 其它代码 ...
public List<User> getAllUsers() {
String sql = "SELECT id, name FROM t_user";
return jdbcTemplate.query(sql, new RowMapper<User>() {
@Override
public User mapRow(ResultSet rs, int rowNum) throws SQLException {
User user = new User(); // 假设有一个 User 类
user.setId(rs.getInt("id"));
user.setName(rs.getString("name"));
return user;
}
});
}
/** 假设有一个 User 类,其定义可能如下:*/
class User {
private int id;
private String name;
// getter、setter 方法省略...
}
整理完毕,完结撒花~
参考地址:
1.JdbcTemplate基本使用,https://blog.csdn.net/weixin_40001125/article/details/88538576