DBUtils工具类(会用)
1.必须会用
2.先感叹,再导入jar包。
* commons-dbutils-1.4.jar
3.核心的类和方法
* QueryRunner类(完成增删改查的功能)
* QueryRunner() -- 没有帮咱们管理连接
* QueryRunner(DataSource ds) -- 传入连接池进来(自己已经帮咱们去管理连接了)
* int update(String sql, Object... params)
* int update(Connection conn, String sql, Object... params)
* <T> T query(String sql, ResultSetHandler<T> rsh, Object... params)
* <T> T query(Connection conn, String sql, ResultSetHandler<T> rsh, Object... params)
* 总结
* 如果不使用事务
* QueryRunner(DataSource ds)
* int update(String sql, Object... params)
* <T> T query(String sql, ResultSetHandler<T> rsh, Object... params)
* 如果使用事务
* QueryRunner()
* int update(Connection conn, String sql, Object... params)
* <T> T query(Connection conn, String sql, ResultSetHandler<T> rsh, Object... params)
* 为什么有用?
* 事务加在业务层,在业务层中开启事务,把conn传递到DAO层。
* 在DAO层编写JDBC的代码(可以使用DBUtils来完成的),
* ResultSetHandler接口,用户使用查询的功能,必须要提供该接口的实现类,提供了9个实现类。
* ArrayHandler, ArrayListHandler, BeanHandler, BeanListHandler, ColumnListHandler, KeyedHandler, MapHandler, MapListHandler, ScalarHandler
* DbUtils
* 和释放资源和管理事务相关的类
* static void commitAndClose(Connection conn)
* static void rollbackAndClose(Connection conn)
* static void rollback(Connection conn)
* static void close(Statement stmt)
修改我的工具类(自己修改工具类)
1.代码
/**
* 获取C3P0的连接池
* @return
*/
public static DataSource getDataSource(){
return dataSource;
}
2.代码(测试QueryRunner类)
import java.sql.ResultSet;
import java.sql.SQLException;
import org.apache.commons.dbutils.QueryRunner;
import org.apache.commons.dbutils.ResultSetHandler;
import org.junit.Test;
import cn.itcast.utils.MyJdbcUtil2;
import cn.itcast.vo.Account;
public class DbutilsDemo {
@Test
public void run1(){
QueryRunner runner = new QueryRunner(MyJdbcUtil2.getDataSource());
String sql = "insert into t_account values (null,?,?)";
// 如果做增删改的操作
try {
runner.update(sql, "冠西",100);
} catch (SQLException e) {
e.printStackTrace();
}
}
@Test
public void run2(){
QueryRunner runner = new QueryRunner(MyJdbcUtil2.getDataSource());
String sql = "select * from t_account where id = ?";
try {
Account ac = runner.query(sql, new BeanHandler(), 4);
System.out.println(ac);
} catch (SQLException e) {
e.printStackTrace();
}
}
}
class BeanHandler implements ResultSetHandler<Account>{
public Account handle(ResultSet rs) throws SQLException {
Account ac = new Account();
// 自己封装
if(rs.next()){
ac.setId(rs.getInt("id"));
ac.setUsername(rs.getString("username"));
ac.setMoney(rs.getDouble("money"));
}
return ac;
}
}
ResultSetHandler接口的实现类(重点的要掌握)
1.不想使用实现类,没有任何问题,自己定义实现类。
2.使用实现类,编写代码更简单。
* (掌握)BeanHandler -- 将一条记录,封装到一个Java对象。Account
* (掌握)BeanListHandler -- 将一条记录,封装到一个Java对象中,把这些对象封装到一个List集合中。List<Account>
* ArrayHandler -- 将一条记录,封装到一个数组中。
* ArrayListHandler -- 将已经记录封装到数组中,把这些数组封装到List集合中。
* MapHandler -- 将一条记录,封装到一个Map集合中
* MapListHandler -- 将一条记录封装到一个Map集合中,在把map集合封装到List集合中
* (掌握)ScalarHandler -- 编写聚集函数。(分页)
* ColumnListHandler -- 有可能查询只有某一列数据。(select money from t_account)
* (掌握)KeyedHandler -- 把一条记录封装到一个Map集合中,再把Map集合封装到一个大的Map集合。