Skip to content

byx2000/jdbc-utils

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

48 Commits
 
 
 
 
 
 
 
 

Repository files navigation

JdbcUtils使用指南

JdbcUtils是JDBC的工具类,封装了JDBC连接获取、语句构造、资源释放、事务控制等操作,对外提供简洁的数据库操作接口。

创建JdbcUtils

通过将一个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. 查询所有用户

// 方法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;
});

2. 查询id大于5的所有用户

List<User> users = jdbcUtils.query("SELECT * FROM users WHERE id > ?",
                new ListResultSetMapper<>(new BeanRowMapper<>(User.class)),
                5);

3. 查询id等于1001的用户

// 方法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);

4. 查询用户总数

Integer count = jdbcUtils.querySingleValue("SELECT COUNT(*) FROM users", 
                Integer.class);

更新

1. 插入用户

int count = jdbcUtils.update("INSERT INTO users(username, password) VALUES(?, ?)",
                "byx", "123456");

2. 删除用户

int count = jdbcUtils.update("DELETE FROM users WHERE username = ? AND password = ?",
                "byx", "123456");

事务操作

jdbcUtils.startTransaction(); // 开启事务
// ...
jdbcUtils.commit(); // 提交事务
// ...
jdbcUtils.rollback(); // 回滚事务