org.springframework.jdbc.core.JdbcTemplate
提供了一组方便的方法来执行 SQL 语句,并处理数据库的结果。以下是一些常用的方法及其用法:
-
execute:
-
描述:用于执行任意的 SQL 语句,如 DDL 语句。
-
用法:
jdbcTemplate.execute("CREATE TABLE users (id INT, name VARCHAR(100))");
-
-
update:
-
描述:用于执行插入(INSERT)、更新(UPDATE)或删除(DELETE)操作。
-
用法:
String sql = "INSERT INTO users (id, name) VALUES (?, ?)"; jdbcTemplate.update(sql, 1, "John Doe");
-
-
queryForObject:
-
描述:用于执行查询并返回单个对象。通常用于查询单行单列的值。
-
用法:
String sql = "SELECT name FROM users WHERE id = ?"; String name = jdbcTemplate.queryForObject(sql, new Object[]{1}, String.class);
-
-
queryForList:
-
描述:用于执行查询并返回对象的列表,通常用于查询多行单列的值。
-
用法:
String sql = "SELECT name FROM users"; List<String> names = jdbcTemplate.queryForList(sql, String.class);
-
-
query:
-
描述:用于执行查询并返回结果集。可以使用 RowMapper 将结果集映射到对象。
-
用法:
String sql = "SELECT id, name FROM users"; List<User> users = jdbcTemplate.query(sql, new RowMapper<User>() { public User mapRow(ResultSet rs, int rowNum) throws SQLException { User user = new User(); user.setId(rs.getInt("id")); user.setName(rs.getString("name")); return user; } });
-
-
batchUpdate:
-
描述:用于批量执行更新操作。
-
用法:
String sql = "INSERT INTO users (id, name) VALUES (?, ?)"; List<Object[]> batchArgs = new ArrayList<>(); batchArgs.add(new Object[]{1, "John"}); batchArgs.add(new Object[]{2, "Jane"}); jdbcTemplate.batchUpdate(sql, batchArgs);
-
-
queryForMap:
-
描述:用于执行查询并返回单行结果,以 Map 形式表示列名和列值。
-
用法:
String sql = "SELECT id, name FROM users WHERE id = ?"; Map<String, Object> result = jdbcTemplate.queryForMap(sql, 1);
-
-
queryForRowSet:
-
描述:用于执行查询并返回 SqlRowSet 对象。
-
用法:
String sql = "SELECT id, name FROM users"; SqlRowSet rowSet = jdbcTemplate.queryForRowSet(sql);
-
这些方法提供了对数据库操作的全面支持,使得 Spring 中的 JDBC 操作更加简洁和易于维护。
==============================================================================================
JdbcTemplate
不支持直接传入以分号(;)分隔的多个 SQL 语句。每次调用 JdbcTemplate
的方法时,只能执行一条 SQL 语句。这是为了避免 SQL 注入风险和执行复杂的多语句事务时出现的不确定性。
如果需要执行多个 SQL 语句,可以将它们分成单独的调用,或者使用事务管理器在一个事务中执行多个操作。以下是如何使用事务管理器的示例:
import org.springframework.transaction.annotation.Transactional;
@Transactional
public void executeMultipleStatements(JdbcTemplate jdbcTemplate) {
jdbcTemplate.update("INSERT INTO users (id, name) VALUES (1, 'John')");
jdbcTemplate.update("INSERT INTO users (id, name) VALUES (2, 'Jane')");
// 可以添加更多的 SQL 语句
}
在这个示例中,@Transactional
注解确保了所有的 SQL 语句在同一个事务中执行。如果其中任何一个语句失败,整个事务将回滚。
总之,JdbcTemplate
不支持直接传入多个以分号分隔的 SQL 语句。应当将每个语句分开执行,或者使用事务管理器来确保多个操作在同一个事务中执行。
=====================================================================================================
jdbcTemplate.queryForObject(sql, args, cls)
JdbcTemplate
是 org.springframework.jdbc.core.JdbcTemplate
。在 jdbcTemplate.queryForObject(sql, args, cls)
方法中,第二个参数 args
是一个数组,包含了 SQL 查询中需要的参数。它用于为预编译的 SQL 语句中的占位符(例如 ?
)提供具体的值。
例如:
String sql = "SELECT name FROM users WHERE id = ?";
Object[] args = {1};
String name = jdbcTemplate.queryForObject(sql, args, String.class);
在这个例子中,args
数组包含了一个值 1
,它将被用来替换 SQL 查询中的第一个 ?
占位符。
这里经过了预编译,所以不能进行SQL注入。JdbcTemplate
使用了预编译的SQL语句,并通过参数化查询来避免SQL注入攻击。