使用反射和泛型手写DBUtils
仅供参考
注意:
- 本案例中使用的是c3p0连接池,其他连接池也差不多
- 实体类的属性名要与数据库表名字段一致
- dataSource 一定是静态的要不然每new一次就会创建一些连接,知道数据库连接满,数据库会拒绝连接
public class DBUtils {
private static ComboPooledDataSource dataSource = new ComboPooledDataSource();
// params 是数组
public static <T> List<T> queryMult(String sql, Class<T> clazz,Object... params) {
Connection connection = null;
PreparedStatement ps = null;
List<T> list = new ArrayList<>();
try {
connection = dataSource.getConnection();
ps = connection.prepareStatement(sql);
if (params.length != 0) {
for (int i = 0; i < params.length; i++) {
ps.setObject((i+1),params[i]);
}
}
ResultSet rs = ps.executeQuery();
// 获取元数据
ResultSetMetaData rsMetaData = rs.getMetaData();
// 获取记录
while (rs.next()) {
T obj = null;
try {
// 创建对象
obj = clazz.newInstance();
// 使用元数据获取类中属性并填充
int columnCount = rsMetaData.getColumnCount();
for (int i = 0; i < columnCount; i++) {
String columnName = rsMetaData.getColumnName(i);
Field declaredField = clazz.getDeclaredField(columnName);
declaredField.setAccessible(true);
declaredField.set(obj,rs.getObject(i));
}
} catch (Exception e) {
e.printStackTrace();
}finally {
close(connection,ps,rs);
}
list.add(obj);
}
} catch (SQLException throwables) {
throwables.printStackTrace();
}
return list;
}
}
附录:c3p0配置
配置文件名:c3p0-config.xml(必须相同,放在classpath下)
<?xml version="1.0" encoding="UTF-8" ?>
<c3p0-config>
<default-config>
<property name="driverClass">com.mysql.cj.jdbc.Driver</property>
<property name="jdbcUrl">
jdbc:mysql://localhost:3306/test
</property>
<property name="user">root</property>
<property name="password">root</property>
<property name="initialPoolSize">5</property>
<property name="maxPoolSize">20</property>
<property name="minPoolSize">5</property>
<property name="maxIdleTime">5</property>
</default-config>
</c3p0-config>