JdbcUtils是JDBC的工具类,封装了JDBC连接获取、语句构造、资源释放、事务控制等操作,对外提供简洁的数据库操作接口。
通过将一个DataSource实例传入JdbcUtils的构造函数来创建一个JdbcUtils实例:
public DataSource dataSource() { // 返回一个DataSource // ... } JdbcUtils jdbcUtils = new JdbcUtils(dataSource());JdbcUtils中包含了若干形如queryXXX的查询方法,具体说明如下:
| 方法 | 说明 |
|---|---|
T query(String sql, ResultMapper<T> resultMapper, Object... params) | 查询数据库并转换结果集 |
List<T> queryList(String sql, RowMapper<T> rowMapper, Object... params) | 查询数据库,对结果集的每一行进行转换,然后将所有行封装成列表 |
List<T> queryList(String sql, Class<T> type, Object... params) | 查询数据库,将结果集的每一行转换成JavaBean,然后将所有行封装成列表 |
T querySingleValue(String sql, Class<T> type, Object... params) | 查询数据库,返回结果集中的单个值 |
T querySingleRow(String sql, RowMapper<T> rowMapper, Object... params) | 查询数据库,转换结果集中的单行数据 |
T querySingleRow(String sql, Class<T> type, Object... params) | 查询数据库,将结果集中的单行数据转换成JavaBean |
结果集转换器用于对查询结果进行转换,用户可实现自己的结果集转换器,也可使用预定义的结果集转换器,下面是所有预定义的结果集转换器:
| 结果集转换器 | 说明 |
|---|---|
ListResultMapper<T> | 将整个结果集转换成列表 |
SingleRowResultMapper<T> | 从结果集中提取单行数据 |
如果要自定义结果集转换器,则需要实现ResultMapper<T>接口:
public interface ResultMapper<T> { T map(ResultSet rs); }更多细节见下面的使用示例。
行转换器用于对结果集中的一行进行转换,用户可实现自己的行转换器,也可使用预定义的行转换器,下面是所有预定义的行转换器:
| 行转换器 | 说明 |
|---|---|
BeanRowMapper<T> | 将一行数据转换成JavaBean |
MapRowMapper | 将一行数据转换成Map |
SingleColumnRowMapper<T> | 提取行中的单独一列 |
如果要自定义行转换器,则需要实现RowMapper<T>接口:
public interface RowMapper<T> { T map(ResultSet rs); }更多细节见下面的使用示例。
下面是JdbcUtils中用于更新操作的方法:
| 方法 | 说明 |
|---|---|
int update(String sql, Object... params) | 更新数据库,返回影响行数 |
JdbcUtils提供以下方法来实现事务的开启、提交和回滚:
| 方法 | 说明 |
|---|---|
public void startTransaction() | 开启事务 |
public void commit() | 提交事务 |
public void rollback() | 回滚事务 |
// 方法1:使用预定义的ResultMapper和RowMapper List<User> users = jdbcUtils.query("SELECT * FROM users", new ListResultMapper<>(new BeanRowMapper<>(User.class))); // 方法2:使用自定义ResultMapper List<User> users = jdbcUtils.query("SELECT * FROM users", record -> { List<User> us = new ArrayList<>(); while (rs.next()) { User u = new User(); u.setId(rs.getInt("id")); u.setUsername(rs.getString("username")); u.setPassword(rs.getString("password")); us.add(u); } return us; }); // 方法3:使用自定义RowMapper List<User> users = jdbcUtils.queryList("SELECT * FROM users", row -> { User u = new User(); u.setId(row.getInt("id")); u.setUsername(row.getString("username")); u.setPassword(row.getString("password")); return u; });List<User> users = jdbcUtils.query("SELECT * FROM users WHERE id > ?", new ListResultSetMapper<>(new BeanRowMapper<>(User.class)), 5);// 方法1 User user = jdbcUtils.querySingleRow("SELECT * FROM users WHERE id = 1001", new BeanRowMapper<>(User.class)); // 方法2 User user = jdbcUtils.querySingleRow("SELECT * FROM users WHERE id = 1001", User.class);Integer count = jdbcUtils.querySingleValue("SELECT COUNT(*) FROM users", Integer.class);int count = jdbcUtils.update("INSERT INTO users(username, password) VALUES(?, ?)", "byx", "123456");int count = jdbcUtils.update("DELETE FROM users WHERE username = ? AND password = ?", "byx", "123456");jdbcUtils.startTransaction(); // 开启事务 // ... jdbcUtils.commit(); // 提交事务 // ... jdbcUtils.rollback(); // 回滚事务