JavaWeb学习笔记整理2
Dao持久层BaseDao抽象类
在Dao持久层中,编写一个BaseDao抽象类,用作后面所有Dao实现类的父类;
后面根据功能先编写接口给定要用的方法,然后再编写实现类实现该接口,如下图所示:
实现类依功能而定,主要看BaseDao抽象类中的方法
先导入 commons.dbutils.jar工具类包
DBUtils封装了对JDBC的操作,简化了JDBC操作
DBUtils三个核心功能介绍:
QueryRunner类,提供对sql语句操作的API
ResultSetHandler接口,用于定义select操作后,怎样封装结果集
DbUtils类,它就是一个工具类,定义了关闭资源与事务处理的方法
.QueryRunner类QueryRunner(Database ds),提供了数据源(连接池),DBUtils底层自动维护connection
update(String sql, Object... params),执行更新数据。(增、删、改)
query(String sql, ResultSetHandler rsh, Object... params),执行查询
update(Connection conn, String sql, Object... params) ,用来完成表数据的增加、删除、更新操作;
query(Connection conn, String sql, ResultSetHandler<T> rsh, Object... params) ,用来完成表数据的查询操作;
DBUtils提供了一个接口ResultSetHandler,它就是用来ResultSet转换成目标类型的工具。你可以自己去实现这个接口,把ResultSet转换成你想要的类型。
DBUtils提供了很多个ResultSetHandler接口的实现。
- MapHandler:单行处理器!把结果集转换成Map,其中列名为键
- MapListHandler:多行处理器!把结果集转换成List>;
- BeanHandler:单行处理器!把结果集转换成Bean,该处理器需要Class参数,即Bean的类型;
- BeanListHandler:多行处理器!把结果集转换成List;
- ColumnListHandler:多行单列处理器!把结果集转换成List,使用ColumnListHandler时需要指定某一列的名称或编号,例如:new ColumListHandler(“name”)表示把name列的数据放到List中。
- ScalarHandler:单行单列处理器!把结果集转换成Object。一般用于聚集查询,例如select count(*) from tab_student。
public abstract class BaseDao {
//使用DBUtils
private QueryRunner queryRunner = new QueryRunner();
/**
* update()方法用来执行:Insert,Update,Delete语句
* @return 如果返回-1,说明执行失败,返回其他表示影响的行数
*/
public int update(String sql,Object...args){
Connection connection = JdbcUtils.getConnection();
try {
return queryRunner.update(connection,sql,args);
} catch (SQLException throwables) {
throwables.printStackTrace();
throw new RuntimeException(throwables);
}
}
/**
* 查询返回一个JavaBean的sql语句
* @param type 返回的对象类型
* @param sql 执行的sql语句
* @param args sql对应的参数值
* @param <T> 返回的类型的泛型
* @return
*/
public <T> T queryForone(Class<T> type,String sql,Object...args){
Connection connection = JdbcUtils.getConnection();
try {
return queryRunner.query(connection,sql,new BeanHandler<T>(type),args);
} catch (SQLException throwables) {
throwables.printStackTrace();
throw new RuntimeException(throwables);
}
}
/**
* 查询返回多个JavaBean的sql语句
* @param type 返回的对象类型
* @param sql 执行的sql语句
* @param args sql对应的参数值
* @param <T> 返回的类型的泛型
* @return
*/
public <T> List<T> queryForlist(Class<T> type, String sql, Object...args){
Connection connection = JdbcUtils.getConnection();
try {
return queryRunner.query(connection,sql,new BeanListHandler<T>(type),args);
} catch (SQLException throwables) {
throwables.printStackTrace();
throw new RuntimeException(throwables);
}
}
/**
* 执行单行单列的sql语句,一般用于聚集查询,例如select count(*) from tab_student。
* @param sql 执行的sql语句
* @param args sql对应的参数
* @return
*/
public Object queryForSingleValue(String sql, Object...args){
Connection connection = JdbcUtils.getConnection();
try {
return queryRunner.query(connection,sql,new ScalarHandler(),args);
} catch (SQLException throwables) {
throwables.printStackTrace();
throw new RuntimeException(throwables);
}
}
}