我有一個數據庫設計問題,我面臨着我的一個項目。我正在嘗試實現一項服務,並且該服務的一部分是一個db層。它的設置使我擁有執行數據庫獲取/更新方法的幫助類以及作爲看門人的頂層圖層。對於前:數據庫設計沒有通過jdbc
public class GetStudentDBHelper {
public List<Student> get(List<Integer> ids) {
Conn getConnection...
// run sql query and construct returning Student objects
}
public List<Student> get(List<Classroom> byClassroom) {
// get all students in passed in classrooms
// run sql query and construct returning Student objects
}
}
public class StudentJanitor {
public GetStudentDBHelper getStudentDBHelper;
public UpdateStudentDBHelper updateStudentDBHelper;
public UpdateClassroomDBHelper updateClassroomDBHelper;
public List<Student> getStudents(List<Integer> ids) {
return getStudentDBHelper.get(ids);
}
public void saveStudents(List<Students> students, int classRoomid) {
Connection conn = Pool.getConnection(); // assume this gives a jdbc
conn.autocommit(false);
try {
try
{
updateStudentDBHelper.saveForClassroom(students, classRoomid, conn);
updateClassroomDBHelper.markUpdated(classRoomid, conn);
conn.commit();
}
catch
{
throw new MyCustomException(ErrorCode.Student);
}
}
catch (SQLException c)
{
conn.rollback();
}
finally {
conn.close();
}
}
public class ClassroomJanitor{
public void saveClassRoon(List<Classrooms> classrooms) {
Connection conn = Pool.getConnection()// assume this gives a jdbc
conn.autocommit(false);
try {
try {
updateClassroomDBHelper.save(classrooms, conn);
updateStudentDBHelper.save(classrooms.stream().map(Classroom::getStudents).collect(Collections.toList()), conn);
conn.commit();
}
catch {
throw new MyCustomException(ErrorCode.ClassRoom);
}
}
catch (SQLException c)
{
conn.rollback();
}
finally {
conn.close();
}
}...
public class GetClassroomDBHelper{}...
public class UpdateClassroomDBHelper{}...
更新DB類的所有構成的情況下,他們需要更新其它表(值即節省了學生意味着我必須觸摸其中一個學生屬於更新教室表中的多個其他updators。它的最後更新時間)。
我遇到的問題是更新db類,我必須從我的Janitor類傳遞一個連接,如果我觸摸多個表以獲得事務及其回滾功能。請參閱上文,瞭解我的意思。有一個更好的方法嗎?這種類型的try,catch,將conn傳遞給db helper,必須在我的管理員中進行任何多事務操作。
總之,你可以看到,代碼通常是這樣的跨多種方法複製:目前你所面對
Connection conn = Pool.getConnection()// assume this gives a jdbc
conn.autocommit(false);
try {
try {
//do some business logic requiring Connection conn
}
catch {
throw new MyCustomException(ErrorCode);
}
}
catch (SQLException c)
{
conn.rollback();
}
finally {
conn.close();
}
好了,你可以有一個方法,做在try-catch回滾提交事情,並且你傳遞一個'Runnable'或類似的函數接口,它調用任何需要連接的方法。但是,爲什麼不使用Hibernate來管理數據庫和邏輯呢? – RealSkeptic
@RealSkeptic我在我的數據庫基本上只有原始連接(只是一個要求)有限。你能舉出一個如何實現的例子代碼嗎? –
我認爲使用模板設計模式可以提高代碼的可讀性並避免使用樣板 – Koitoer