[TOC]
### 使用方法:
~~~
@Test
public void testGet() {
String sql = "SELECT id, name, email, birth "
+ "FROM customers WHERE id = ?";
// System.out.println(sql);
Customer customer = get(Customer.class, sql, 5);
System.out.println(customer);
sql = "SELECT flow_id flowId, type, id_card idCard, "
+ "exam_card examCard, student_name studentName, "
+ "location, grade " + "FROM examstudent WHERE flow_id = ?";
// System.out.println(sql);
Student stu = get(Student.class, sql, 5);
System.out.println(stu);
}
~~~
### 通用的查詢方法 返回一個對象
~~~
/**
* 通用的查詢方法:可以根據傳入的 SQL、Class 對象返回 SQL 對應的記錄的對象
* @param clazz: 描述對象的類型
* @param sql: SQL 語句。可能帶占位符
* @param args: 填充占位符的可變參數。
* @return
*/
public <T> T get(Class<T> clazz, String sql, Object... args) {
T entity = null;
Connection connection = null;
PreparedStatement preparedStatement = null;
ResultSet resultSet = null;
try {
//1. 得到 ResultSet 對象
connection = JDBCTools.getConnection();
preparedStatement = connection.prepareStatement(sql);
for (int i = 0; i < args.length; i++) {
preparedStatement.setObject(i + 1, args[i]);
}
resultSet = preparedStatement.executeQuery();
//2. 得到 ResultSetMetaData 對象
ResultSetMetaData rsmd = resultSet.getMetaData();
//3. 創建一個 Map<String, Object> 對象, 鍵: SQL 查詢的列的別名,
//值: 列的值
Map<String, Object> values = new HashMap<String, Object>();
//4. 處理結果集. 利用 ResultSetMetaData 填充 3 對應的 Map 對象
if(resultSet.next()){
for(int i = 0; i < rsmd.getColumnCount(); i++){
String columnLabel = rsmd.getColumnLabel(i + 1);
Object columnValue = resultSet.getObject(i + 1);
values.put(columnLabel, columnValue);
}
}
//5. 若 Map 不為空集, 利用反射創建 clazz 對應的對象
if(values.size() > 0){
entity = clazz.newInstance();
//5. 遍歷 Map 對象, 利用反射為 Class 對象的對應的屬性賦值.
for(Map.Entry<String, Object> entry: values.entrySet()){
String fieldName = entry.getKey();
Object value = entry.getValue();
ReflectionUtils.setFieldValue(entity, fieldName, value);
}
}
} catch (Exception e) {
e.printStackTrace();
} finally {
JDBCTools.releaseDB(resultSet, preparedStatement, connection);
}
return entity;
}
~~~
### 分開寫代碼展示
~~~
public Customer getCustomer(String sql, Object... args) {
Customer customer = null;
Connection connection = null;
PreparedStatement preparedStatement = null;
ResultSet resultSet = null;
try {
connection = JDBCTools.getConnection();
preparedStatement = connection.prepareStatement(sql);
for (int i = 0; i < args.length; i++) {
preparedStatement.setObject(i + 1, args[i]);
}
resultSet = preparedStatement.executeQuery();
if (resultSet.next()) {
// stu = new Student();
// stu.setFlowId(resultSet.getInt(1));
// stu.setType(resultSet.getInt(2));
// stu.setIdCard(resultSet.getString(3));
customer = new Customer();
customer.setId(resultSet.getInt(1));
customer.setName(resultSet.getString(2));
customer.setEmail(resultSet.getString(3));
customer.setBirth(resultSet.getDate(4));
}
} catch (Exception e) {
e.printStackTrace();
} finally {
JDBCTools.releaseDB(resultSet, preparedStatement, connection);
}
return customer;
}
public Student getStudent(String sql, Object... args) {
Student stu = null;
Connection connection = null;
PreparedStatement preparedStatement = null;
ResultSet resultSet = null;
try {
connection = JDBCTools.getConnection();
preparedStatement = connection.prepareStatement(sql);
for (int i = 0; i < args.length; i++) {
preparedStatement.setObject(i + 1, args[i]);
}
resultSet = preparedStatement.executeQuery();
if (resultSet.next()) {
stu = new Student();
stu.setFlowId(resultSet.getInt(1));
stu.setType(resultSet.getInt(2));
stu.setIdCard(resultSet.getString(3));
// ...
}
} catch (Exception e) {
e.printStackTrace();
} finally {
JDBCTools.releaseDB(resultSet, preparedStatement, connection);
}
return stu;
}
~~~
### 整體展示









