public abstract class BaseDao<T> {
private Class<T> clazz = null;
{
//获取Base子类继承父类中的泛型
Type genericSuperclass = this.getClass().getGenericSuperclass();
ParameterizedType parameterizedType = (ParameterizedType) genericSuperclass;
//
Type[] actualTypeArguments = parameterizedType.getActualTypeArguments();
clazz = (Class<T>) actualTypeArguments[0];
}
/**
* 实现增删改 :考虑到事务的关系,Connection,从外面传入
*
* @param conn
* @param sql
* @param args
* @return 返回共执行了几次
*/
public int update(Connection conn, String sql, Object... args) throws Exception {
PreparedStatement ps = null;
try {
//1.获取预编译类
ps = conn.prepareStatement(sql);
//2.填充占位符
for (int i = 0; i < args.length; i++) {
ps.setObject(i + 1, args[i]);
}
//3.执行sql 返回sql执行影响的行数 增删改, 如果是ddl 返回0
return ps.executeUpdate();
//ps.execute(); 判断是否生成结果集ResultSet
} catch (SQLException e) {
e.printStackTrace();
} finally {
//4.关闭资源 注意:这里不关闭连接,因为考虑事务的关系,在方法调用中关闭
JDBCUtils.closeResource(null, ps);
}
return 0;
}
/**
* 通用查询操作, 用于返回一条记录.(考虑上事务)
*
* @param conn
* @param sql
* @param args
* @return 返回一条记录
*/
public T getInstance(Connection conn, String sql, Object... args) throws Exception {
PreparedStatement ps = null;
try {
//1.获取预编译类
ps = conn.prepareStatement(sql);
//2.填充占位符
for (int i = 0; i < args.length; i++) {
ps.setObject(i + 1, args[i]);
}
//3.执行返回结果集
ResultSet rs = ps.executeQuery();
//4.获取结果集的元数据,遍历结果集,信息存入对应类的对象中
ResultSetMetaData rsmd = rs.getMetaData();
//4.1 获取列数
int culumnCoutn = rsmd.getColumnCount();
T t = clazz.newInstance();
if (rs.next()) {
for (int i = 0; i < culumnCoutn; i++) {
Object columnValue = rs.getObject(i);
//4.2 获取列别名
String columnLabel = rsmd.getColumnLabel(i + 1);
//4.3 反射获取对应属性类,然后赋值
Field field = clazz.getDeclaredField(columnLabel);
field.setAccessible(true);
field.set(t, columnValue);
}
return t;
}
} catch (Exception e) {
e.printStackTrace();
} finally {
JDBCUtils.closeResource(null, ps);
}
return null;
}
}
/**
* 查询或许多条信息
* @param conn 考虑事务原因,Connection从外部传入,并且不会关闭
* @param sql
* @param args
* @return 返回查询多条信息
*/
public List<T> getForList(Connection conn, String sql, Object... args) {
List<T> list = new ArrayList<>();
PreparedStatement ps = null;
ResultSet rs = null;
try {
//1.获取编译类
ps = conn.prepareStatement(sql);
//2.填充占位符
for (int i = 0; i < args.length; i++) {
ps.setObject(i + 1, args[i]);
}
//3.执行返回结果集
rs = ps.executeQuery();
//4, 结果集的元数据
ResultSetMetaData rsmd = rs.getMetaData();
//4.1 列数
int columnCount = rsmd.getColumnCount();
while (rs.next()) {
T t = clazz.newInstance();
for (int i = 0; i < columnCount; i++) {
//列的数据
Object columnValue = rs.getObject(i + 1);
//列的别名
String columnLabel = rsmd.getColumnLabel(i + 1);
Field field = clazz.getDeclaredField(columnLabel);
field.setAccessible(true);
field.set(t, columnValue);
}
list.add(t);
}
return list;
} catch (Exception e) {
e.printStackTrace();
} finally {
//关闭资源 :注意不关闭连接
JDBCUtils.closeResource(null,ps,rs);
}
return null;
}
/***
* 查询特殊数据需求
* @param conn
* @param sql
* @param args
* @param <E>
* @return
* @throws Exception
*/
public<E> E getValue(Connection conn, String sql, Object... args) {
PreparedStatement ps = null;
ResultSet rs = null;
try {
ps = conn.prepareStatement(sql);
for (int i = 0; i < args.length; i++) {
ps.setObject(i + 1, args[i]);
}
rs = ps.executeQuery();
if (rs.next()) {
Object object = rs.getObject(1);
return (E) object;
}
} catch (SQLException e) {
e.printStackTrace();
} finally {
//关闭资源
JDBCUtils.closeResource(null,ps,rs);
}
return null;//没有查到返回空
}
版权声明:本文为Adam586007原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。