DBUtils
1、QueryRunner 框架核心类 ,所有数据库操作都是必须通过 QueryRunner 进行的
2、ResultSetHandler 结果集封装接口,完成将ResultSet 结果集 封装为一个Java对象
3、DbUtils 工具类 提供驱动管理、事务管理、释放资源等一系列公共方法
QueryRunner 与 ResultSetHandler 一起使用,完成数据表增删改查
构造器:
QueryRunner() -------- 没有传递连接池给DBUtils 框架,框架不能获得数据库连接,接下来每个操作,必须将数据库连接传给框架 (手动管理事务)
QueryRunner(DataSource ds) ---- 将连接池给DBUtils框架,以后每个操作,都会从连接池中获取一个新的连接 (每条SQL 一个单独的事务)
更新操作 insert update delete
public int update(Connection conn, String sql, Object... params) ---- 手动管理事务,没有将连接池提供框架,传入连接
public int update(String sql, Object... params) ----- 将连接池交给框架,由框架管理事务,不需要传入连接
查询操作 select
public Object query(Connection conn, String sql, ResultSetHandler<T> rsh, Object... params)
public Object query(String sql, ResultSetHandler<T> rsh, Object... params)
1、需要手动管理事务
QueryRunner()
public int update(Connection conn, String sql, Object... params)
query(Connection conn, String sql, ResultSetHandler<T> rsh, Object... params)
2、由框架管理事务 (每条SQL都是一个单独事务)
QueryRunner(DataSource ds)
public int update(String sql, Object... params)
public Object query(String sql, ResultSetHandler<T> rsh, Object... params)
DBUtils 工具的 `增删改` 实例:
@Test
public void test_insert() throws SQLException {
// 1. 创建 QueryRunner 对象, 同时将 `数据库` 对象传入
QueryRunner queryRunner = new QueryRunner(JDBCUtils.getDataSource());
// 2. 执行 update 方法
String sql = "insert into user values(?,?,?,?);";
Object[] params = {5, "小七", "123", "xiaoqi@itcast.cn"};
queryRunner.update(sql, params);
}
@Test
public void test_delete() throws SQLException {
// 1. 创建 QueryRunner 对象, 同时将 `数据库` 对象传入
QueryRunner queryRunner = new QueryRunner(JDBCUtils.getDataSource());
// 2. 执行 update 方法
String sql = "delete from user where id=?;";
queryRunner.update(sql, 5);
}
@Test
public void test_update() throws SQLException {
// 1. 创建 QueryRunner 对象, 同时将 `数据库` 对象传入
QueryRunner queryRunner = new QueryRunner(JDBCUtils.getDataSource());
// 2. 执行 update 方法
String sql = "update user set username=?, password=? where id=?;";
Object[] params = {"李四", "888", 2};
queryRunner.update(sql, params);
}
@Test
public void test_query() throws SQLException {
// 1. 创建 QueryRunner 对象, 同时将 `数据库` 对象传入
QueryRunner queryRunner = new QueryRunner(JDBCUtils.getDataSource());
// 2. 执行 query 方法
String sql = "select * from user where id = ?;";
User user = queryRunner.query(sql, new ResultSetHandler<User>(){
@Override
public User handle(ResultSet rs) throws SQLException {
if (rs.next()) {
int id = rs.getInt("id");
String username = rs.getString("username");
String password = rs.getString("password");
String email = rs.getString("email");
User user = new User();
user.setId(id);
user.setUsername(username);
user.setPassword(password);
user.setEmail(email);
return user;
}
return null;
}
}, 3);
System.out.println(user);
}
@Test
public void test_query() throws SQLException {
// 1. 创建 QueryRunner 对象, 同时将 `数据库` 对象传入
QueryRunner queryRunner = new QueryRunner(JDBCUtils.getDataSource());
// 2. 执行 query 方法
String sql = "select * from user;";
List<User> list = queryRunner.query(sql, new ResultSetHandler<List<User>>(){
@Override
public List<User> handle(ResultSet rs) throws SQLException {
List<User> list = new ArrayList<User>();
User user = null;
while (rs.next()) {
user = new User();
int id = rs.getInt("id");
String username = rs.getString("username");
String password = rs.getString("password");
String email = rs.getString("email");
user.setId(id);
user.setUsername(username);
user.setPassword(password);
user.setEmail(email);
list.add(user);
}
return list;
}
});
for (User user : list) {
System.out.println(user);
}
}