前置:事务实战 ·
pom.xml见 环境与 user 表
JdbcTemplateDemo.java
package demo.jdbc;
import org.springframework.jdbc.core.JdbcTemplate;import org.springframework.jdbc.core.RowMapper;import org.springframework.jdbc.core.simple.SimpleJdbcInsert;import org.springframework.jdbc.datasource.DataSourceTransactionManager;import org.springframework.transaction.support.TransactionTemplate;
import javax.sql.DataSource;import java.sql.ResultSet;import java.sql.SQLException;import java.util.List;import java.util.Map;
public class JdbcTemplateDemo { private static final RowMapper<User> USER_ROW_MAPPER = (rs, rowNum) -> mapRow(rs);
public static void main(String[] args) { DataSource ds = Db.dataSource(); JdbcTemplate jdbc = new JdbcTemplate(ds);
SimpleJdbcInsert insert = new SimpleJdbcInsert(jdbc) .withTableName("user") .usingGeneratedKeyColumns("id"); Number id = insert.executeAndReturnKey(Map.of( "user_name", "diana", "email", "diana@example.com", "status", 1 )); System.out.println("insert id=" + id);
User one = jdbc.queryForObject( "SELECT id, user_name, email, status, created_at FROM user WHERE id = ?", USER_ROW_MAPPER, id.longValue() ); System.out.println("query: " + one);
List<User> list = jdbc.query( "SELECT id, user_name, email, status, created_at FROM user WHERE status = ? ORDER BY id", USER_ROW_MAPPER, 1 ); System.out.println("list size=" + list.size());
TransactionTemplate tx = new TransactionTemplate(new DataSourceTransactionManager(ds)); tx.execute(status -> { jdbc.update("UPDATE user SET email = ? WHERE id = ?", "diana.tx@example.com", id.longValue()); return null; }); System.out.println("after tx: " + jdbc.queryForObject( "SELECT id, user_name, email, status, created_at FROM user WHERE id = ?", USER_ROW_MAPPER, id.longValue() ));
jdbc.update("DELETE FROM user WHERE id = ?", id.longValue()); System.out.println("deleted diana"); }
private static User mapRow(ResultSet rs) throws SQLException { User user = new User(); user.setId(rs.getLong("id")); user.setUserName(rs.getString("user_name")); user.setEmail(rs.getString("email")); user.setStatus(rs.getInt("status")); if (rs.getTimestamp("created_at") != null) { user.setCreatedAt(rs.getTimestamp("created_at").toLocalDateTime()); } return user; }}运行
mvn -q exec:java -Dexec.mainClass=demo.jdbc.JdbcTemplateDemo与原生 JDBC 对比
| 原生 JDBC | JdbcTemplate |
|---|---|
| 手写关连接 | 框架自动释放 |
UserDao.mapRow | RowMapper |
| 手写事务 | TransactionTemplate |
复杂动态 SQL 仍建议 MyBatis。