jdbc 操作数据库 数据的公用方法



/*
 * 处理Sql语句的工具类
 */
public class SqlUtil {


/*
* 执行 增 改 的公用方法(支持事物)
*/
public static int executeUpdate(Connection conn ,String sql, Object... args) {

// 创建 PreparedStatement 对象
PreparedStatement ps = null;


try {
// 将sql 语句传入 数据库
ps = conn.prepareStatement(sql);


// 循环 处理占位符
for (int i = 0; i < args.length; i++) {
ps.setObject(i + 1, args[i]);
}


// 获得 处理结果(返回受影响
return ps.executeUpdate();


} catch (Exception e) {
e.printStackTrace();
return 0;
} finally {
// 关闭流
DriverUitl.close(null, ps, null);
}
}


/*
* 提取查询单条记录的公用方法 (支持事务)
*/
public static <T> T executeQuerySingle(Connection conn ,Class<T> clazz, String sql, Object... args) {
// 创建各个对象
PreparedStatement ps = null;
ResultSet rs = null;
T t = null;


try {
// 1.获取连接对象
// 2.获取PreparedStatement 对象
ps = conn.prepareStatement(sql);
// 3.填充占位符
for (int i = 0; i < args.length; i++) {
ps.setObject(i + 1, args[i]);
}
// 4.发送sql语句 获取 ResultSet 对象
rs = ps.executeQuery();


// 5.处理ResultSet对象的结果集
// 5.1获取 ResultSet 元数据 对象
ResultSetMetaData rsmd = rs.getMetaData();
// 5.2获取元数据对象的列数
int columnCount = rsmd.getColumnCount();
if (rs.next()) {
t = clazz.newInstance();
// 5.3利用循环,根据 元数据对象的列索引,获取列的名称(表头中的每一列名)
for (int i = 0; i < columnCount; i++) {
// 5.4 根据 元数据对象的列索引,获取列的名称(表头中的每一列列名)
String columnName = rsmd.getColumnLabel(i + 1);
// 5.5根据取出的列名,查询当条记录所对应的具体值 即(rs.getInt())
Object columnValue = rs.getObject(columnName);


// 5.6注意:列的别名必须与属性名保持一致!!!!!!!!
// 将数据库中查询到的每个字段的值,赋值给传入的类的每个对应字段
Field field = clazz.getDeclaredField(columnName); // 利用反射,获取属性名
field.setAccessible(true); // 修改可访问私属性权限
field.set(t, columnValue); // 为传入类对象的属性赋值
}
}
} catch (Exception e) {
e.printStackTrace();
} finally {
// 7.关闭流
DriverUitl.close(rs, ps, null);
}
return t;
}


/*
* 提取查询多条记录的公用方法  (支持事务)
*/

public static <T> List<T> executeQueryAll(Connection conn, Class<T> clazz,String sql, Object...args){
List<T> list = new ArrayList<>();

//1. 获取连接 从参数中获取
//2. 获取 PreparedStatement,用于发送 SQL
PreparedStatement ps = null;
//4. 执行 SQL,ResultSet 结果集
ResultSet rs = null;
try {
//1.获取具体的数据库连接  从参数中获取

//2.将sql语句发送给数据库,返回一个PreparedStatement对象
ps = conn.prepareStatement(sql);
//3. (利用循环根据可变参数,填充占位符
for (int i = 0; i < args.length; i++) {
ps.setObject(i+1, args[i]);
}

//4。 获取结果集(ResultSet 对象
rs = ps.executeQuery();

//5. 获取当前结果集的元数据 ResultSetMetaData
ResultSetMetaData rsmd = rs.getMetaData();

//6. 获取结果集的列数
int columnCount = rsmd.getColumnCount();

//7. 获取结果集的数据
while(rs.next()){
//利用反射,获取传入的类型的具体实例
T t = clazz.newInstance();

for (int i = 0; i < columnCount; i++) {
//7.1 获取列名,根据列名获取结果集的数据
   //7.1.1 根据列的索引,获取列名(表头列名
String columnName = rsmd.getColumnLabel(i+1);
   //7.1.2 根据获取的列名,获取对应的数据的值
Object columnValue = rs.getObject(columnName);


//8. 将数据封装进对象(t 传入的具体的对象, columnName:t类中的 属性,columnValue:需要设置的具体的值)
PropertyUtils.setProperty(t, columnName, columnValue);
}


//9. 将加入集合中
list.add(t);
}
}  catch (Exception e) {
e.printStackTrace();
} finally {
//10. 关闭连接
DriverUitl.close(rs, ps, null);
}

return list;


}


}

猜你喜欢

转载自blog.csdn.net/DoNotEatfishCat/article/details/80346387