Mga uri ng pahayag

Nakita na namin ang pinakasimpleng interface ng Statement . At kahit na ito ay lubos na angkop para sa trabaho, ito ay hindi masyadong angkop para sa mga kumplikadong query. Sa ilang mga pinagmumulan, ang opinyon ay ipinahayag na ito ay hindi kinakailangan na gumamit ng Pahayag sa lahat - mas kumplikado at mas functionally rich interface ay angkop sa halip.

  • Inihanda na Pahayag
  • CallableStatement

Isang medyo makatwirang tanong ang lumitaw - bakit kailangan ang mga interface na ito? Alamin natin ito.

Una, titingnan natin ang interface ng PreparedStatement at iba pang mga feature ng JDBC. Bumaling tayo sa interface ng CallableStatement sa ibang pagkakataon - ang paggamit nito, una, ay hindi gaanong karaniwan, at pangalawa, pagkatapos na isaalang-alang ang lahat tungkol dito, ang pag-uusap ay maaari nang maging maikli.

Gayundin, ang PreparedStatement ay isang malaking tulong mula sa sikat na diskarte sa pag-hack ng database na tinatawag na SQL Injection.

Ngunit higit pa sa na ng kaunti mamaya.

Inihanda na Pahayag

Kung susubukan mong isalin ang pangalang PreparedStatement , maaari kang makakuha ng isang bagay tulad ng "prepared statement". Ang pinakamahalagang salita dito ay "handa". Ano ang "paghahanda"?

Bago natin isaalang-alang ang isyung ito, iminumungkahi kong makita ang isang medyo mahalagang punto mula sa punto ng view ng kaginhawahan, na nangyayari nang madalas. Kaya, sa ilang aplikasyon, kailangan nating magpasok ng data ng contact sa talahanayan ng CONTACT. Upang gawin ito, kailangan nating maghanda ng query tulad nito:

INSERT INTO JC_CONTACT (FIRST_NAME, LAST_NAME, PHONE, EMAIL) VALUES (‘Harry’,'Potter','+79112345678','harry@example.com);

Sa unang tingin, tila ang lahat ay hindi napakahirap at nakakatakot. Kailangan naming magsulat ng code na magkokolekta ng string na kailangan namin mula sa mga parameter: unang pangalan, apelyido, address at numero ng telepono. Kailangan mo lang tandaan na ang lahat ng data ng string ay dapat na napapalibutan ng isang solong quote character.

Kung gagawin natin ito sa isang hiwalay na function, makakakuha tayo ng ganito:

public String buildInsert(String firstName,, String lastName, String phone, String email) {
    String sql = "INSERT INTO JC_CONTACT (FIRST_NAME, LAST_NAME, PHONE, EMAIL)+
             	”VALUES ('" + firstName + "','" + lastName + "','" + phone + "','" + email + ")";
    return sql;
}

Ipinapasa namin ang unang pangalan, apelyido, numero ng telepono, at address sa function ng parameter sa form, at mula sa kanila ay bumubuo kami ng string ng SQL query. Ang mga quote ay nakakasira ng larawan ng kaunti, ngunit sa ngayon ay hindi ito nakakatakot.

Ok, ano ang tungkol sa mga numero? Hindi nila kailangang palibutan ng mga quote. Opanki, sa isang kaso kailangan mo ng mga panipi, sa isa naman ay hindi. Ang sitwasyon ay nagiging mas kumplikado.

Ngayon magdagdag tayo ng isa pang problema - paano kung mayroong isang ordinaryong quote (at wala kahit isa) sa loob ng string? Kailangan mo munang hanapin ang mga naturang quote at iproseso ang mga ito. Mdaaa. Kahit papaano nagsisimula kaming hindi komportable.

Kung nagdaragdag kami ngayon ng pagpoproseso ng petsa, kung gayon ang gawain ay magiging ganap na mayamot - kailangan mong gumawa ng isang malaking halaga ng trabaho. Ang mga petsa ay karaniwang hindi kasiya-siya - ang iba't ibang mga SQL server ay tumatanggap ng iba't ibang mga format para sa mga petsa.

Kaya ano ang nakikita natin? Kung kailangan nating gumamit ng mga parameter sa loob ng query, kung gayon ang manu-manong pagbuo ng query ay magiging lubhang hindi kasiya-siya. At hindi lang hindi kasiya-siya - sasabihin ko pang boring. Mayroong isang malaking bilang ng mga kaso upang isaalang-alang, at ito ay isang napaka-boring trabaho. Karaniwan, ito ay para sa mga ganitong kaso na ang PreparedStatement interface ay iminungkahi .

Nagbibigay-daan sa iyo ang kahilingang ito na gawin ang dalawang bagay:

  • Maghanda ng isang kahilingan nang maaga na nagpapahiwatig ng mga lugar kung saan ang mga parameter ay papalitan
  • Magtakda ng mga parameter ng isang partikular na uri at pagkatapos ay magsagawa ng query na may mga parameter na nakatakda na

Halimbawa ng Inihanda na Pahayag

Ang istraktura para sa PreparedStatement para sa aming opsyon sa pagtatakda ng mga parameter ay magiging ganito:

// Example variables
String firstName = "Harry";
String lastName = "Potter";
String phone = "+12871112233";
String email = "harry@example.com";

// Request with indication of places for parameters in the form of "?"
String sql = "INSERT INTO JC_CONTACT (FIRST_NAME, LAST_NAME, PHONE, EMAIL) VALUES (?, ?, ?, ?)";

// Create a request. The con variable is an object of type Connection
PreparedStatement stmt = con.prepareStatement(sql);

// Set parameters
stmt.setString(1, firstName);
stmt.setString(2, lastName);
stmt.setString(3, phone);
stmt.setString(4, email);

// Execute the request
stmt.executeUpdate();

Tulad ng nakikita mo, ang lahat ay medyo simple.

Una, kapag nagsusulat ng isang SQL query, ang mga lugar kung saan ang mga parameter ay kailangang palitan ay nakasulat na may mga tandang pananong - "?".

Pangalawa, ang kahilingan ay nilikha sa pamamagitan ng pagtawag sa con.prepareStatement() .

Pangatlo, ang setting ng mga parameter ay dumadaan sa indikasyon ng numero at halaga. Pakitandaan na ang bilang ng mga parameter ay nagsisimula sa 1, hindi sa 0, gaya ng nakasanayan namin kapag nagtatrabaho sa mga array at koleksyon.

Ang interface ng PreparedStatement ay naglalaman ng mga pamamaraan para sa pagtatakda ng mga string — setString() , para sa pagtatakda ng mga numero — setInt() , setLong() , setDouble() , para sa pagtatakda ng mga petsa — setDate() . At mas kumplikadong mga uri - ito ay makikita sa dokumentasyon.

Pang-apat, ang tawag sa stmt.executeUpdate() ay naisakatuparan na nang hindi tinukoy ang string ng query.

Lubos kong inirerekomenda ang pakikipagkaibigan sa PreparedStatement - ito ay isang napakaepektibong tool.