ResultSet özelleştirmesi

Modern JDBC API, nesneleri büyük ölçüde özelleştirmenize olanak tanır.İfadeVesonuç kümesi. Örneğin, kullanaraksonuç kümesiveritabanındaki satırları değiştirebilirsiniz.

Bir ifade nesnesi oluştururken, ona bir takım dileklerimizi iletebiliriz. Bu dilekler üç gruba ayrılabilir:

  • Temel bağlantı türü
  • Eşzamanlı erişim kontrolü
  • Kalıcılık ve işlemler

Bu parametreler, bir nesne oluşturulurken iletilebilir.İfadeveyaHazırlananBildirim. Örnek:

Statement statement = connection.createStatement(
    ResultSet.TYPE_FORWARD_ONLY,
    ResultSet.CONCUR_READ_ONLY,
    ResultSet.CLOSE_CURSORS_OVER_COMMIT );

PreparedStatement statement = connection.prepareStatement(sql,
    ResultSet.TYPE_FORWARD_ONLY,
    ResultSet.CONCUR_READ_ONLY,
    ResultSet.CLOSE_CURSORS_OVER_COMMIT);

Bunları derinlemesine incelemeyeceğiz, ancak başka birinin kodunda benzer bir şeye rastlarsanız bunun mümkün olduğunu bilmenizi isterim.

Sonuç Kümesi türleri

ResultSet belirli bir türde olabilir. Tür, ResultSet'in bazı özelliklerini ve yeteneklerini tanımlar.

Tüm türler, tüm veritabanları ve JDBC sürücüleri tarafından desteklenmez. Kullanmak istediğiniz türü destekleyip desteklemediğini görmek için veritabanınızı ve JDBC sürücünüzü kontrol etmeniz gerekecektir. DatabaseMetaData.supportsResultSetType(int type) yöntemi, verilen türün desteklenip desteklenmediğine bağlı olarak true veya false döndürür .

Yazma sırasında, üç tür ResultSet vardır:

  • ResultSet.TYPE_FORWARD_ONLY
  • ResultSet.TYPE_SCROLL_INSENSITIVE
  • ResultSet.TYPE_SCROLL_SENSITIVE

Varsayılan tür TYPE_FORWARD_ONLY'dir.

TYPE_FORWARD_ONLY , ResultSet'in yalnızca ileriye taşınabileceği anlamına gelir. Yani, yalnızca 1. satırdan, 2. satırdan, 3. satırdan vb. hareket edebilirsiniz. Bir ResultSet'te geriye doğru hareket edemezsiniz: onuncu satırı okuduktan sonra 9. satırdaki verileri okuyamazsınız.

TYPE_SCROLL_INSENSITIVE , ResultSet'in ileri veya geri hareket ettirilebileceği (kaydırılabileceği) anlamına gelir. Ayrıca geçerli konuma göre bir konuma veya mutlak bir konuma hareket edebilirsiniz.

Bu tür bir ResultSet, ResultSet açıkken temel alınan veri kaynağındaki değişikliklere duyarsızdır . Yani, ResultSet'teki bir giriş, veritabanında başka bir iş parçacığı veya işlem tarafından değiştirilirse, zaten açılmış olana yansıtılmayacaktır.sonuç kümesibu türden

TYPE_SCROLL_SENSITIVE , ResultSet'in ileri veya geri hareket ettirilebileceği (kaydırılabileceği) anlamına gelir. Ayrıca geçerli konuma göre bir konuma veya mutlak bir konuma hareket edebilirsiniz.

Bu tür bir ResultSet, ResultSet açıkken temel alınan veri kaynağındaki değişikliklere duyarlıdır . Yani, ResultSet'teki bir giriş, veritabanında başka bir iş parçacığı veya işlem tarafından değiştirilirse, zaten açık olana yansıtılacaktır.sonuç kümesibu türden

eşzamanlılık

Bir ResultSet'in eşzamanlılığı, ResultSet'in güncellenip güncellenemeyeceğini veya yalnızca okunabileceğini belirler.

Bazı veritabanları ve JDBC sürücüleri bir ResultSet'in güncellenmesini destekler, ancak tümü değil. DatabaseMetaData.supportsResultSetConcurrency(int concurrency) yöntemi, verilen eşzamanlılık modunun desteklenip desteklenmediğine bağlı olarak true veya false döndürür .

ResultSet iki eşzamanlılık seviyesinden birine sahip olabilir:

  • ResultSet.CONCUR_READ_ONLY
  • ResultSet.CONCUR_UPDATABLE

CONCUR_READ_ONLY , ResultSet'in yalnızca okunabileceği anlamına gelir.

CONCUR_UPDATABLE, ResultSet'in okunabileceği ve değiştirilebileceği anlamına gelir.

Veritabanındaki verileri değiştirmeye bir örnek

Bu parametrelerle, oluşturulan İfadeyi ve onun ResultSet'ini kontrol edebilirsiniz.

Örneğin, güncellenebilir bir ResultSet oluşturabilir ve bunu veritabanını değiştirmek için kullanabilirsiniz. Bir Bildirim oluştururken, aşağıdaki koşullara uymak önemlidir:

  • sadece bir tablo belirtildi
  • birleştirme veya gruplandırma yan tümceleri içermez
  • sorgu sütunları birincil anahtar içermelidir

Yukarıdaki koşullar karşılandığında, veritabanındaki bir tabloyu güncellemek için güncellenen ResultSet kullanılabilir. Bir Beyan nesnesi oluştururken, aşağıdaki parametreleri belirtmeniz gerekir:

Statement st = createStatement(Result.TYPE_SCROLL_INSENSITIVE, Result.CONCUR_UPDATABLE)

Böyle bir ifadeyi yürütmenin sonucu, güncellenebilir bir sonuç kümesidir. Güncelleme yöntemi, ResultSet imlecini güncellemek istediğiniz satıra taşımak ve ardından updateXXX () yöntemini çağırmaktır .

updateXXX yöntemi, getXXX() yöntemine benzer şekilde çalışır . updateXXX() yönteminin iki parametresi vardır. İlki, güncellenmekte olan sütunun numarasıdır; bu, bir sütun adı veya bir seri numarası olabilir. İkincisi güncellenmesi gereken verilerdir ve bu veri türü XXX ile aynı olmalıdır.

Veritabanındaki satırı gerçekten güncellemek için, ResultSet imleci değiştirilen satırdan ayrılmadan önce updateRow() yöntemini çağırmanız gerekir , aksi takdirde değişiklikler veritabanına girmez.

Tabloya yeni satırlar da ekleyebilirsiniz:

İlk önce imleci boş bir satıra taşımanız gerekir. Bunu yapmak için moveToInsertRow() yöntemini çağırın .

Ardından , updateXXX() yöntemini kullanarak bu satırı verilerle doldurmanız gerekir .

Ardından, satırı tabana eklemek için inserterRow() yöntemini çağırmanız gerekir .

Ve son olarak, moveToCurrentRow() yöntemini çağırarak imleci geri döndürmeniz gerekir .

Önemli! Genişletilmiş Bildirim için tüm DBMS'ler bu seçenekleri desteklemez. Sorun olması durumunda, belirli bir DBMS'nin resmi belgelerine bakın.