1.这个类封装了基本的CRUD 操作,以供子类使用。
- C reate new records
- R etrieve existing records
- U pdate existing records
- D elete existing records.)
2.当前DAO直接在方法中获取数据库连接
- 整个DAO采取DBUtils解决方案
测试代码
package top.itcourse.page.dao;
import java.lang.reflect.ParameterizedType;
import java.lang.reflect.Type;
import java.sql.Connection;
import java.sql.SQLException;
import java.util.List;
import org.apache.commons.dbutils.QueryRunner;
import org.apache.commons.dbutils.handlers.BeanHandler;
import org.apache.commons.dbutils.handlers.BeanListHandler;
import org.apache.commons.dbutils.handlers.ScalarHandler;
import top.itcourse.page.utils.JDBCUtils;
/**
* 1.
* 这个类封装了基本的CRUD(
* C reate new records
* R etrieve existing records
* U pdate existing records
* D elete existing records.)
* 操作,以供子类使用。
*
* 2.
* 当前DAO直接在方法中获取数据库连接
*
*3.
*整个DAO采取DBUtils解决方案
*
* @param <T>:当前DAO处理的实体类型
*/
/*
*
*/
public class DAO<T> {
//dbutils对象
private QueryRunner queryRunner = new QueryRunner();
//对应查询的返回结果的类的class
private Class<T> clazz;
//在构造函数里初始化clazz(用的时候是子类在用)
public DAO() {
//一、getSuperclass 返回直接继承的父类(由于编译擦除,没有显示泛型参数)
//二、getGenericSuperclass 返回直接继承的父类(包含泛型参数)
Type superClass = getClass().getGenericSuperclass();
//ParameterizedType是一个接口,这个类可以用来检验泛型是否被参数化
if( superClass instanceof ParameterizedType ) { //被参数化了
ParameterizedType pt = (ParameterizedType)superClass;
//getActualTypeArguments:返回表示此类型实际类型参数的Type对象的数组,数组里放的都是对应类型的Class,因为可能有多个,所以是数组。
Type[] typeArgs = pt.getActualTypeArguments();
if( typeArgs != null && typeArgs.length > 0 ) {
if( typeArgs[0] instanceof Class ) {
clazz = (Class<T>) typeArgs[0];
}
}
}
}
/**
* 该方法包含了INSERT、DELETE、UPDATE操作。
* @param sql:执行的SQL语句
* @param args:填充SQL语句的占位符
*/
public void update(String sql,Object ... args) {
Connection con = null;
try {
con = JDBCUtils.getConnection();
//dbutils里面封装的update方法,很刺激:连接,SQL,参数
queryRunner.update(con, sql, args);
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} finally {
JDBCUtils.relase(con);
}
}
/**
*
* @param sql:执行的SQL语句
* @param args:填充SQL语句的占位符
* @return:返回查询结果的一个实体类对象
*/
public T get(String sql,Object ... args) {
Connection con = null;
try {
con = JDBCUtils.getConnection();
//dbutils中封装的方法:连接,SQL,需要返回的class(new BeanHandler<>(Class对象),占位参数
return queryRunner.query(con, sql, new BeanHandler<>(clazz), args);
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} finally {
JDBCUtils.relase(con);
}
return null;
}
/**
*
* @param sql:执行的SQL语句
* @param args:填充SQL语句的占位符
* @return:返回查询结果的多个实体类对象
*/
public List<T> getForList( String sql,Object ... args ) {
Connection con = null;
try {
con = JDBCUtils.getConnection();
//返回查询结果的List
return queryRunner.query(con, sql, new BeanListHandler<>(clazz), args);
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} finally {
JDBCUtils.relase(con);
}
return null;
}
/**
*
* @param sql:执行的SQL语句
* @param args:填充SQL语句的占位符
* @return:返回查询结果的某一个字段的值(一个类是一条完整的记录)
*/
public <E> E getForValue(String sql, Object ... args ) {
Connection con = null;
try {
con = JDBCUtils.getConnection();
//返回某个值的查询操作
return (E) queryRunner.query(con, sql,new ScalarHandler(),args);
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return null;
}
}
源码下载
关注下方的微信公众号,回复:java_div_page.code
网友评论