思路:
① 获取连接
② 预编译SQL返回PreparedStatement实例
③ 处理占位符
④ 执行操作返回ResultSet并处理结果集
⑤ 关闭资源
/**
* 针对不同表的通用查询操作,返回多条数据
* @param c 泛型为对应表的实体类的Class实例
* @param sql 执行的SQL语句
* @param args 占位符参数
* @param <T> 对应表的实体类
* @return 返回对应表的实体类对象集合
*/
public <T> List<T> getForList(Class<T> c, String sql, Object... args) {
List<T> list = new ArrayList<>();
Connection conn = null;
PreparedStatement ps = null;
ResultSet rs = null;
try {
//1.获取连接
conn = JDBCUtils.getConnection();
//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();
ResultSetMetaData rsmd = rs.getMetaData();
int columnCount = rsmd.getColumnCount();
//判断结果集是否有数据
while (rs.next()) {
T t = c.newInstance();
//处理结果集中的一行数据:给t的指定属性赋值
for (int i = 0; i < columnCount; i++) {
String columnLabel = rsmd.getColumnLabel(i + 1);
Object colValue = rs.getObject(i + 1);
Field field = c.getDeclaredField(columnLabel);
field.setAccessible(true);
field.set(t, colValue);
}
//将一行数据封装到T的实例中,并将其添加到list
list.add(t);
}
return list;
} catch (Exception e) {
e.printStackTrace();
} finally {
//5.关闭资源
JDBCUtils.closeResource(conn, ps, rs);
}
return null;
}
操作数据库的工具类
/**
* 操作数据库的工具类
* @author ObitoSnn
*/
public class JDBCUtils {
/**
* 获取数据库连接
* @author ObitoSnn
* @return 返回Connection实例
* @throws Exception :
*/
public static Connection getConnection() throws Exception {
//1.加载并读取配置文件中的4个基本信息
//配置文件默认识别为当前module的src下
InputStream is = ClassLoader.getSystemClassLoader().getResourceAsStream("jdbc.properties");
Properties pr = new Properties();
pr.load(is);
String user = pr.getProperty("user");
String password = pr.getProperty("password");
String url = pr.getProperty("url");
String driverClass = pr.getProperty("driverClass");
//2.注册驱动
Class.forName(driverClass);
//3.通过DriverManager获取连接
return DriverManager.getConnection(url, user, password);
}
/**
* 关闭Connection和Statement操作
* @author ObitoSnn
* @param conn 需要关闭的Connection实例
* @param s 需要关闭的Statement实例
*/
public static void closeResource(Connection conn, Statement s) {
try {
if (conn != null)
conn.close();
} catch (SQLException e) {
e.printStackTrace();
}
try {
if (s != null)
s.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
public static void closeResource(Connection conn, Statement s, ResultSet rs) {
try {
if (conn != null)
conn.close();
} catch (SQLException e) {
e.printStackTrace();
}
try {
if (s != null)
s.close();
} catch (SQLException e) {
e.printStackTrace();
}
try {
if (rs != null)
rs.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
}