Pag-customize ng ResultSet

Ang modernong JDBC API ay nagbibigay-daan sa iyo upang lubos na i-customize ang mga bagay.PahayagAtset ng resulta. Halimbawa, ang paggamitset ng resultamaaari mong baguhin ang mga hilera sa database.

Kapag gumagawa ng isang statement object, maaari naming ipasa ang isang bungkos ng aming mga kagustuhan dito. Ang mga kagustuhang ito ay maaaring nahahati sa tatlong grupo:

  • Uri ng base na koneksyon
  • Kasabay na kontrol sa pag-access
  • Pagtitiyaga at mga transaksyon

Ang mga parameter na ito ay maaaring maipasa kapag lumilikha ng isang bagayPahayagoInihanda na Pahayag. Halimbawa:

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);

Hindi namin pag-aaralan nang malalim ang mga bagay na ito, ngunit gusto kong malaman mo na posible ito kung may makikita kang katulad sa code ng ibang tao.

Mga uri ng ResultaSet

Ang ResultSet ay maaaring may partikular na uri. Tinutukoy ng uri ang ilan sa mga katangian at kakayahan ng ResultSet.

Hindi lahat ng uri ay sinusuportahan ng lahat ng mga database at mga driver ng JDBC. Kakailanganin mong suriin ang iyong database at JDBC driver upang makita kung sinusuportahan nito ang uri na gusto mong gamitin. Ang DatabaseMetaData.supportsResultSetType(int type) na pamamaraan ay nagbabalik ng totoo o mali depende sa kung ang ibinigay na uri ay sinusuportahan o hindi.

Sa oras ng pagsulat, mayroong tatlong uri ng ResultSet:

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

Ang default na uri ay TYPE_FORWARD_ONLY.

TYPE_FORWARD_ONLY ay nangangahulugan na ang ResultSet ay maaari lamang ilipat pasulong. Iyon ay, maaari ka lamang lumipat mula sa row 1, row 2, row 3, atbp. Sa ResultSet, hindi ka maaaring lumipat pabalik: hindi ka makakabasa ng data mula sa 9th row pagkatapos basahin ang ikasampu.

TYPE_SCROLL_INSENSITIVE ay nangangahulugan na ang ResultSet ay maaaring ilipat (i-scroll) pasulong o paatras. Maaari ka ring lumipat sa isang posisyon na nauugnay sa kasalukuyang posisyon, o lumipat sa isang ganap na posisyon.

Ang ResultSet ng ganitong uri ay hindi sensitibo sa mga pagbabago sa pinagbabatayan ng data source habang bukas ang ResultSet. Iyon ay, kung ang isang entry sa ResultSet ay binago sa database ng isa pang thread o proseso, hindi ito makikita sa nabuksan naset ng resultang ganitong uri.

TYPE_SCROLL_SENSITIVE ay nangangahulugan na ang ResultSet ay maaaring ilipat (i-scroll) pasulong o paatras. Maaari ka ring lumipat sa isang posisyon na nauugnay sa kasalukuyang posisyon, o lumipat sa isang ganap na posisyon.

Ang ResultSet ng ganitong uri ay sensitibo sa mga pagbabago sa pinagbabatayan ng data source habang bukas ang ResultSet. Iyon ay, kung ang isang entry sa ResultSet ay binago sa database ng isa pang thread o proseso, ito ay makikita sa bukas naset ng resultang ganitong uri.

Concurrency

Tinutukoy ng concurrency ng isang ResultSet kung ang ResultSet ay maaaring i-update o basahin lamang.

Sinusuportahan ng ilang database at mga driver ng JDBC ang pag-update ng ResultSet, ngunit hindi lahat. Ang DatabaseMetaData.supportsResultSetConcurrency(int concurrency) na pamamaraan ay nagbabalik ng totoo o mali depende sa kung ang ibinigay na concurrency mode ay sinusuportahan o hindi.

Ang ResultSet ay maaaring magkaroon ng isa sa dalawang antas ng concurrency:

  • ResultSet.CONCUR_READ_ONLY
  • ResultSet.CONCUR_UPDATABLE

CONCUR_READ_ONLY ay nangangahulugan na ang ResultSet ay mababasa lamang.

CONCUR_UPDATABLE ay nangangahulugan na ang ResultSet ay maaaring basahin at baguhin.

Isang halimbawa ng pagbabago ng data sa database

Gamit ang mga parameter na ito, makokontrol mo ang nabuong Statement at ang ResultSet nito.

Halimbawa, maaari kang lumikha ng isang naa-update na ResultSet at gamitin ito upang baguhin ang database. Kapag gumagawa ng isang Pahayag, mahalagang obserbahan ang mga sumusunod na kondisyon:

  • isang table lang ang tinukoy
  • ay hindi naglalaman ng pagsali o pangkat ayon sa mga sugnay
  • Ang mga column ng query ay dapat maglaman ng pangunahing key

Kapag ang mga kundisyon sa itaas ay natugunan, ang na-update na ResultSet ay maaaring gamitin upang i-update ang isang talahanayan sa database. Kapag lumilikha ng object ng Statement, kailangan mong tukuyin ang mga sumusunod na parameter:

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

Ang resulta ng pagsasagawa ng naturang pahayag ay isang naa-update na set ng resulta. Ang paraan ng pag-update ay ilipat ang ResultSet cursor sa row na gusto mong i-update at pagkatapos ay tawagan ang updateXXX() method .

Ang paraan ng updateXXX ay gumagana nang katulad ng getXXX() na pamamaraan . Ang paraan ng updateXXX() ay may dalawang parameter. Ang una ay ang numero ng column na ina-update, na maaaring pangalan ng column o serial number. Ang pangalawa ay ang data na kailangang i-update, at ang uri ng data na ito ay dapat na kapareho ng XXX.

Upang aktwal na i-update ang row sa database, kailangan mong tawagan ang updateRow() method bago umalis ang ResultSet cursor sa binagong row, kung hindi, ang mga pagbabago ay hindi makapasok sa database.

Maaari ka ring magdagdag ng mga bagong row sa talahanayan:

Una kailangan mong ilipat ang cursor sa isang walang laman na linya. Upang gawin ito, tawagan ang moveToInsertRow() method .

Pagkatapos ay kailangan mong punan ang row na ito ng data gamit ang updateXXX() method .

Pagkatapos ay kailangan mong tawagan ang inserterRow() na paraan upang idagdag ang hilera sa base.

At sa wakas, kailangan mong ibalik ang cursor sa pamamagitan ng pagtawag sa moveToCurrentRow() method .

Mahalaga! Hindi lahat ng DBMS ay sumusuporta sa mga opsyong ito para sa pinalawig na Pahayag. Sa kaso ng mga problema, tingnan ang opisyal na dokumentasyon ng isang partikular na DBMS.