Pamamahala sa kasalukuyang linya

Sinulat namin ang unang programa at gumana ito nang perpekto. Sumulat kami ng isang query, pinaandar ito, at bilang isang resulta, ang executeQuery() na pamamaraan ay nagbalik ng isang bagay sa aminset ng resultaIsang na naglalaman ng lahat ng mga resulta ng query. At ngayon ay susubukan naming malaman kung paano makuha ang mga resulta mula dito.

Ang resulta ng query ay maaaring maglaman ng libu-libong mga hilera at daan-daang mga hanay ng iba't ibang uri, kaya't ito ay hindi isang maliit na gawain tulad ng iniisip mo. Halimbawa, ang mga larawan ay maaaring maimbak sa database, pagkatapos ay makakakuha ka ng isang larawan bilang isang hanay ng mga byte o isang InputStream upang i-download ito.

Ngunit magsisimula tayo sa pinakasimpleng - na may konsepto ng " kasalukuyang linya ng resulta ". Dahil ang resulta ay karaniwang may maraming mga hilera, ang bagayset ng resultaay may pointer sa kasalukuyang linya sa loob. At sunud-sunod na inililipat ang mga linya upang basahin ang mga ito gamit ang susunod na() na pamamaraan .

Ang diskarte na ito ay pangunahing ginagawa para sa pag-optimize. Ang JDBC Driver ay maaaring hindi mag-load ng mga string mula sa database hanggang sa sunod-sunod mong mabasa ang mga ito. Binabasa mo rin ang FileInputStream nang sunud-sunod mula sa simula hanggang sa katapusan. Kaya dapat na pamilyar at naiintindihan mo ang diskarteng ito.

Gayunpaman, kung talagang kailangan mo ito, maaaring basahin ang mga file kahit saan gamit ang RandomAccessFile class .

Ang ResultSet class ay nagpapahintulot din sa isang katulad na bagay at nagbibigay-daan sa iyong ilipat ang kasalukuyang hilera kasama ang resulta kahit saan. Upang gawin ito, mayroon itong mga sumusunod na pamamaraan:

Pamamaraan Paglalarawan
1 susunod() Lumipat sa susunod na linya
2 nakaraan() Lumipat sa nakaraang linya
3 isFirst() Kasalukuyang linya muna?
4 isBeforeFirst() Nasa unahan ba tayo ng unang linya?
5 isLast() Ang kasalukuyang linya ba ang huli?
6 isAfterLast() Tapos na ba tayo sa deadline?
7 ganap (int n) Ginagawang kasalukuyang ang Nth line
8 kamag-anak(int n) Inilipat ang kasalukuyang linya N na posisyon pasulong. Ang N ay maaaring <0
9 getRow() Ibinabalik ang numero ng linya

Ang mga pamamaraan ay medyo simple, ngunit dalawang paliwanag ang kailangang gawin. Ang mga resulta ay, kumbaga, naka-frame sa pamamagitan ng mga walang laman na linya sa magkabilang panig. Samakatuwid, sa una ang kasalukuyang linya ay bago ang unang linya ng resulta. At upang makuha ang unang hilera, kailangan mong tawagan ang susunod na() na pamamaraan nang hindi bababa sa isang beses .

Kung tinawag mo ang susunod na() na pamamaraan sa huling hilera , pagkatapos ay lumipat ka sa linya pagkatapos ng huli . Hindi mo mababasa ang data mula dito, ngunit walang error na magaganap. Dito ang isAfterLast() na pamamaraan ay magdedeklara ng totoo bilang resulta.

Halimbawa:

Statement statement = connection.createStatement();
ResultSet results = statement.executeQuery("SELECT * FROM user");

System.out.println( results.getRow() );        	// 0
System.out.println( results.isBeforeFirst() );  // true
System.out.println( results.isFirst() );          	// false

results.next();

System.out.println( results.getRow() );        	// 1
System.out.println( results.isBeforeFirst() );  // false
System.out.println( results.isFirst() );          	// true

results.next();

System.out.println( results.getRow() );        	// 2
System.out.println( results.isBeforeFirst() );  // false
System.out.println( results.isFirst() );          	// false

Pagkuha ng data mula sa kasalukuyang row

Natutunan mong mahusay na pamahalaan ang kasalukuyang linya. Ngayon, alamin natin kung paano makakuha ng data mula dito. Para dito, ang bagayset ng resultamay mga espesyal na pamamaraan na lahat ay maaaring ilarawan ng isang template:

getType(numberColumns)

Gayunpaman, kung may pangalan ang column, maaari mo ring makuha ang pangalan ng column:

getType(nameColumns)

Halimbawa:

while (results.next()) {
        	Integer id = results.getInt(“id”);
        	String name = results.getString(“name”);
        	System.out.println(results.getRow() + ". " + id + "\t"+ name);
}

Sa ibaba ay magbibigay ako ng isang talahanayan na tutulong sa iyo na iugnay ang mga uri ng data ng SQL at mga pamamaraan ng ResultSet:

Uri ng data ng SQL getXXX() na mga pamamaraan
CHAR getString()
VARCHAR getString()
INT getInt()
LUMUTANG getDouble()
CLOB getClob()
BLOB getBlob()
DATE getDate()
ORAS getTime()
TIMESTAMP getTimestamp()

Ang punto, sa tingin ko nakuha mo ito.

Pagkuha ng iba't ibang data tungkol sa ResultSet

Naisip namin kung paano basahin ang data mula sa kasalukuyang linya: pareho sa numero ng hanay at sa pangalan nito. Nga pala, paano ko malalaman ang pangalan ng column sa pamamagitan ng numero nito? O ang bilang ng mga column sa resulta?

Sa isang banda, kung sumulat ka ng isang kahilingan, tila kailangan mong malaman ang lahat ng ito. Sa kabilang banda, maaari tayong magsulat ng isang programa na nagpapakita ng resulta ng isang query sa screen: ang query ay ipinasa sa amin at gusto lang naming ipakita sa screen (sa console, web page) ang lahat ng ibinalik ng SQL server. para sa atin.

Ang JDBC ay may espesyal na bagay para dito, ang ResultSetMetaData interface . Ang pagkuha ng isang bagay ng ganitong uri ay medyo simple:

Statement statement = connection.createStatement();
ResultSet results = statement.executeQuery("SELECT * FROM user");
ResultSetMetaData resultSetMetaData = results.getMetaData();

Ang interface ng ResultSetMetaData ay may ilang napaka-interesante na pamamaraan. Nasa ibaba ang mga pinakasikat:

1 getColumnCount() Ibinabalik ang bilang ng mga column ng resulta
2 getColumnName(int column) Ibinabalik ang pangalan ng column
3 getColumnLabel(int column) Ibinabalik ang paglalarawan ng column
4 getColumnType() Ibinabalik ang uri ng column: numero (espesyal na code)
5 getColumnTypeName() Ibinabalik ang uri ng column: string
6 getColumnClassName() Ibinabalik ang pangalan ng java class para sa uri ng column
7 getTableName() Ibinabalik ang pangalan ng talahanayan
8 getCatalogName() Ibinabalik ang pangalan ng direktoryo ng column
9 getSchemaName() Ibinabalik ang pangalan ng schema ng database
10 isAutoIncrement(int column) Sinusuportahan ba ng column ang AUTO INCREMENT?
labing-isa isNullable() Maaari bang maglaman ng NULL ang isang column?

Gamitin natin ito upang matuto nang kaunti tungkol sa ating talahanayan:

ResultSetMetaData metaData = results.getMetaData();
int columnCount = metaData.getColumnCount();
for (int column = 1; column <= columnCount; column++)
{
        	String name = metaData.getColumnName(column);
        	String className = metaData.getColumnClassName(column);
        	String typeName = metaData.getColumnTypeName(column);
        	int type = metaData.getColumnType(column);

        	System.out.println(name + "\t" + className + "\t" + typeName + "\t" + type);
}

Mahalaga! Bigyang-pansin na ang mga column ay binibilang mula sa 1. Ang mga row din pala. Paano hindi karaniwan ay iyon, tama?

At ito ang resulta na nakuha ko pagkatapos patakbuhin ang programa:

"C:\Program Files\Java\jdk-17.0.3.1\bin\java.exe...
id java.lang.Integer INT 4
pangalan java.lang.string VARCHAR 12
antas java.lang.Integer INT 4
nilikha_petsa java.sql.date DATE 91
Natapos ang proseso gamit ang exit code 0