使用 DAO模式 來對數據庫做增刪改查操作
DAO模式可以大概分為三個層:1.DAO層 2.服務層 3.表現層
1)表現層 :相當于客戶端用來查看,提交信息的角色
2)服務層 :是表現層和DAO層的紐帶,其實也沒干什么事就是通知消息的角色
3)DAO :真正要做事的角色(對數據庫的某些操作)
public void update(String sql, Object...objects){
Connection conn = null;
PreparedStatement preparedStatement = null;
try {
conn = TestJDBC.getConnection();
preparedStatement = conn.prepareStatement(sql);
for(int i=0; i<objects.length; i++){
preparedStatement.setObject(i+1, objects[i]);
}
preparedStatement.executeUpdate();
} catch (Exception e){
e.printStackTrace();
} {
if (conn != null){
try {
conn.close();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}
public <T> T get(Class<T> clazz, String sql, Object...objects){
//1.建立連接
Connection conn = null;
//2.獲取PreparedStatement
PreparedStatement preparedStatement = null;
try {
conn = TestJDBC.getConnection();
preparedStatement = conn.prepareStatement(sql);
//3.賦值
for (int i = 0; i<objects.length; i++){
preparedStatement.setObject(i+1, objects[i]);
}
//4.執行,并使用ResultSet接受
ResultSet re = preparedStatement.executeQuery();
if(re.next()){
//5.創建clazz對象
T t = clazz.newInstance();
//6、獲取ResultSetMetaData,并放入對象
ResultSetMetaData rsmd = re.getMetaData();
for(int i=0; i<rsmd.getColumnCount(); i++){
String columnLable = rsmd.getColumnLabel(i+1);
Object columnValue = re.getObject(i+1);
//為對象屬性賦值
Field field = clazz.getDeclaredField(columnLable);
field.setAccessible(true);
field.set(t, columnValue);
}
return t;
} else {
return null;
}
} catch (Exception e){
e.printStackTrace();
} finally {
if (preparedStatement != null){
try {
preparedStatement.close();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
if (conn != null){
try {
conn.close();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
return null;
}
}
元數據 (DatabaseMetaData && ResultSetMetaData)
- 提供數據庫,返回結果的元數據對象
- 利用反射技術,可以寫出通用的方法
獲取自動插入時生成的主鍵值
PreparedStatement st = conn.prepareStatement(sql,Statement.RETURN_GENERATED_KEYS );
st.executeUpdate();
ResultSet rs = st.getGeneratedKeys(); //得到插入行的主鍵
if(rs.next())
System.out.println(rs.getObject(1));