1.关于DAO<T>
1)接口DAO一般具有insert、update、query、queryForList、getSingleValue、batch等方法
2)其实现类BaseDAO<T>一般通过QueryRunner实现其所有方法,在这个实现类中会有clazz私有属性,为的是获取泛型参数类型
》public BaseDao() {
Type type = getClass().getGenericSuperclass(); //Dao
if (type instanceof ParameterizedType) { //判断是否是类Parameterized的实例,ParameterizedType就是代表是否是带泛型参数的类
Type[] types = ((ParameterizedType) type).getActualTypeArguments(); //返回Dao的泛型参数数组
if (types != null && types.length > 0) {
clazz = (Class) types[0]; //需要实例化的clazz就是第一个参数类型
}
}
}
》其insert方法会有返回值,返回类型为Long型,因为使用queryRunner的方法不能得到返回值,所以只能使用传统的方法
try {
connection = DBUtils.getConnection();
preparedStatement = connection.prepareStatement(sql,
Statement.RETURN_GENERATED_KEYS);//设置返回主键
if (args != null && args.length > 0) {
for (int i = 0; i < args.length; i++) {
preparedStatement.setObject(i + 1 , args[i]);
}
}
preparedStatement.executeUpdate();
resultSet = preparedStatement.getGeneratedKeys();//返回主键
if(resultSet.next()){
id = resultSet.getLong(1);
}
》更新方法使用queryRunner.update(connection, sql);
》查询方法使用queryRunner.query(connection, sql, new BeanHandler<T>(clazz), args);
》查询返回List使用queryRunner.query(connection, sql, new BeanListHandler<T>(clazz), args);
》批量操作使用queryRunner.batch(connection, sql, params);
》得到单个值使用(V) queryRunner.query(connection, sql, new ScalarHandler(), args);
3)具体对象的接口一般会有操作对象的所有方法
4)具体的类需要继承BaseDAO实现其对应的接口,通过BaseDAO里的方法实现其对应接口里的方法
2.关于分页
1)具有第几页pageNo、这一页显示几条记录pageSize、这一页显示哪些信息pageList、全部页数的信息量totalItemNumber
2)其构造方法需要利用其pageNo的属性进行初始化
3)得到pageNo的方法时需要判断其是否符合实际情况,最小值不能小于1,最大值不能超过getTotalPageNumber
4)getTotalPageNumber由totalItemNumber/pageSize获得,还要注意不能除净的情况,如果不能除净。需要把totalPageNumber++;
5)通过是否大于1判断是否是首页,通过判断是否小于totalPageNumber判断是否是最后一页,还需得到下一页、上一页(需要通过是否是首页或者末页进行判断)
3.关于条件查询
1)根据需要条件查询,设置一个Criteria类
2)其属性为其需要进行条件查询的属性,如果需要和分页结合起来,就还需要定义一个pageNo(页码)的属性(特别需要注意pageNo的值是否符合实际情况)
3)查询条件:如果是属于范围类型,则可以设定默认值,最小为0,最大为Integer.MAX_VALUE。为的是当把查询条件的类作为参数进行查询时,可以不用判断是否输入了条件。
通过数据库实现其分页
// limit 4,3代表从5开始,数三个就是5,6,7
@Override
public List<Book> getPageList(CriteriaBook cb, int pageSize) {
String sql = "select * from books where price>= ? and price <= ? limit ? ,? ";
return queryForList(sql, cb.getMinPrice(),cb.getMaxPrice(),(cb.getPageNo()-1)*pageSize,pageSize);
}
1)接口DAO一般具有insert、update、query、queryForList、getSingleValue、batch等方法
2)其实现类BaseDAO<T>一般通过QueryRunner实现其所有方法,在这个实现类中会有clazz私有属性,为的是获取泛型参数类型
》public BaseDao() {
Type type = getClass().getGenericSuperclass(); //Dao
if (type instanceof ParameterizedType) { //判断是否是类Parameterized的实例,ParameterizedType就是代表是否是带泛型参数的类
Type[] types = ((ParameterizedType) type).getActualTypeArguments(); //返回Dao的泛型参数数组
if (types != null && types.length > 0) {
clazz = (Class) types[0]; //需要实例化的clazz就是第一个参数类型
}
}
}
》其insert方法会有返回值,返回类型为Long型,因为使用queryRunner的方法不能得到返回值,所以只能使用传统的方法
try {
connection = DBUtils.getConnection();
preparedStatement = connection.prepareStatement(sql,
Statement.RETURN_GENERATED_KEYS);//设置返回主键
if (args != null && args.length > 0) {
for (int i = 0; i < args.length; i++) {
preparedStatement.setObject(i + 1 , args[i]);
}
}
preparedStatement.executeUpdate();
resultSet = preparedStatement.getGeneratedKeys();//返回主键
if(resultSet.next()){
id = resultSet.getLong(1);
}
》更新方法使用queryRunner.update(connection, sql);
》查询方法使用queryRunner.query(connection, sql, new BeanHandler<T>(clazz), args);
》查询返回List使用queryRunner.query(connection, sql, new BeanListHandler<T>(clazz), args);
》批量操作使用queryRunner.batch(connection, sql, params);
》得到单个值使用(V) queryRunner.query(connection, sql, new ScalarHandler(), args);
3)具体对象的接口一般会有操作对象的所有方法
4)具体的类需要继承BaseDAO实现其对应的接口,通过BaseDAO里的方法实现其对应接口里的方法
2.关于分页
1)具有第几页pageNo、这一页显示几条记录pageSize、这一页显示哪些信息pageList、全部页数的信息量totalItemNumber
2)其构造方法需要利用其pageNo的属性进行初始化
3)得到pageNo的方法时需要判断其是否符合实际情况,最小值不能小于1,最大值不能超过getTotalPageNumber
4)getTotalPageNumber由totalItemNumber/pageSize获得,还要注意不能除净的情况,如果不能除净。需要把totalPageNumber++;
5)通过是否大于1判断是否是首页,通过判断是否小于totalPageNumber判断是否是最后一页,还需得到下一页、上一页(需要通过是否是首页或者末页进行判断)
3.关于条件查询
1)根据需要条件查询,设置一个Criteria类
2)其属性为其需要进行条件查询的属性,如果需要和分页结合起来,就还需要定义一个pageNo(页码)的属性(特别需要注意pageNo的值是否符合实际情况)
3)查询条件:如果是属于范围类型,则可以设定默认值,最小为0,最大为Integer.MAX_VALUE。为的是当把查询条件的类作为参数进行查询时,可以不用判断是否输入了条件。
通过数据库实现其分页
// limit 4,3代表从5开始,数三个就是5,6,7
@Override
public List<Book> getPageList(CriteriaBook cb, int pageSize) {
String sql = "select * from books where price>= ? and price <= ? limit ? ,? ";
return queryForList(sql, cb.getMinPrice(),cb.getMaxPrice(),(cb.getPageNo()-1)*pageSize,pageSize);
}