Управление на текущия ред
Написахме първата програма и тя работи перфектно. Написахме заявка, изпълнихме я и в резултат на това методът executeQuery() ни върна обектнабор от резултатиAn, който съдържа всички резултати от заявката. И сега ще се опитаме да разберем How да постигнем тези резултати от него.
Резултатът от заявката може да съдържа хиляди редове и стотици колони от различни типове, така че това не е толкова тривиална задача, колкото си мислите. Например, снимките могат да се съхраняват в базата данни, след което можете да получите картина като набор от byteове or InputStream, за да я изтеглите.
Но ще започнем с най-простото - с концепцията за „ текуща линия с резултати “. Тъй като резултатът обикновено има много редове, обектътнабор от резултатиима указател към текущия ред вътре. И последователно превключва редовете, за да ги прочете, използвайки метода next() .
Този подход се прави предимно за оптимизация. JDBC драйверът може да не зарежда низове от базата данни, докато не ги прочетете последователно. Вие също прочетете FileInputStream последователно от началото до края. Така че този подход трябва да ви е познат и разбираем.
Въпреки това, ако наистина имате нужда от това, тогава файловете могат да се четат навсякъде с помощта на класа RandomAccessFile .
Класът ResultSet също позволява нещо подобно и ви позволява да преместите текущия ред по резултата навсякъде. За да направите това, той има следните методи:
Метод | Описание | |
---|---|---|
1 | следващия() | Преминете към следващия ред |
2 | предишен () | Превключване към предишния ред |
3 | еПърво() | Първи текущият ред? |
4 | isBeforeFirst() | Пред първата линия ли сме? |
5 | еПоследен() | Текущият ред последен ли е? |
6 | isAfterLast() | След крайния срок ли сме? |
7 | абсолютен (int n) | Прави N-тия ред текущ |
8 | относително (int n) | Премества текущия ред N позиции напред. N може да бъде <0 |
9 | getRow() | Връща номера на реда |
Методите са доста прости, но трябва да се направят две обяснения. Резултатите са сякаш рамкирани с празни редове от двете страни. Следователно първоначално текущият ред е преди първия ред на резултата. И за да получите първия ред, трябва да извикате метода next() поне веднъж .
Ако сте извикали метода next() на последния ред , тогава сте се преместor на реда след последния . Не можете да четете данни от него, но няма да възникне грешка. Тук методът isAfterLast() ще декларира true като резултат.
Пример:
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
Получаване на данни от текущия ред
Научихте се майсторски да управлявате текущата линия. Сега нека да разберем How да вземем данни от него. За това обектътнабор от резултатиима специални методи, които могат да бъдат описани с един шаблон:
getType(numberColumns)
Ако обаче колоната има име, тогава можете да получите и по името на колоната:
getType(nameColumns)
Пример:
while (results.next()) {
Integer id = results.getInt(“id”);
String name = results.getString(“name”);
System.out.println(results.getRow() + ". " + id + "\t"+ name);
}
По-долу ще предоставя table, която ще ви помогне да свържете SQL типовете данни и методите ResultSet:
SQL тип данни | методи getXXX(). |
---|---|
CHAR | getString() |
VARCHAR | getString() |
ИНТР | getInt() |
ПЛАВКА | getDouble() |
CLOB | getClob() |
BLOB | getBlob() |
ДАТА | getDate() |
ВРЕМЕ | getTime() |
КЛАПОТО ЗА ЧАС | getTimestamp() |
Мисля, че разбирате.
Получаване на различни данни за ResultSet
Разбрахме How да четем данни от текущия ред: Howто по номера на колоната, така и по нейното име. Между другото, How мога да разбера името на колоната по нейния номер? Или броя на колоните в резултата?
От една страна, ако напишете молба, значи трябва да знаете всичко това. От друга страна, можем да напишем програма, която показва резултата от заявка на екрана: заявката се предава на нас и ние просто искаме да покажем на екрана (в конзолата, уеб pageта) всичко, което SQL сървърът е върнал за нас.
JDBC има специален обект за това, интерфейсът ResultSetMetaData . Получаването на обект от този тип е доста просто:
Statement statement = connection.createStatement();
ResultSet results = statement.executeQuery("SELECT * FROM user");
ResultSetMetaData resultSetMetaData = results.getMetaData();
Интерфейсът ResultSetMetaData има някои много интересни методи. По-долу са най-популярните:
1 | getColumnCount() | Връща броя на колоните с резултати |
2 | getColumnName(int колона) | Връща името на колоната |
3 | getColumnLabel(int колона) | Връща описанието на колоната |
4 | getColumnType() | Връща тип колона: номер (специален code) |
5 | getColumnTypeName() | Връща тип колона: низ |
6 | getColumnClassName() | Връща името на Java класа за типа колона |
7 | getTableName() | Връща името на tableта |
8 | getCatalogName() | Връща името на директорията на колоната |
9 | getSchemaName() | Връща името на схемата на базата данни |
10 | isAutoIncrement(int колона) | Колоната поддържа ли AUTO INCREMENT? |
единадесет | isNullable() | Може ли колона да съдържа NULL? |
Нека го използваме, за да научим малко за нашата маса:
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);
}
важно! Обърнете внимание, че колоните са номерирани от 1. Редовете, между другото, също. Колко необичайно е това, нали?
И това е резултатът, който получих след стартиране на програмата:
"C:\Program Files\Java\jdk-17.0.3.1\bin\java.exe... | |||
document за самоличност | java.lang.Integer | ИНТР | 4 |
име | java.lang.string | VARCHAR | 12 |
ниво | java.lang.Integer | ИНТР | 4 |
създадена_дата | java.sql.date | ДАТА | 91 |
Процесът завърши с изходен code 0 |
GO TO FULL VERSION