Този урок обяснява как да използваме JDBC ResultSet за извличане на данни. Ще се запознаем и с интерфейсите ResultSetMetaData и DatabaseMetaData с примери:
В JDBC DriverManager наръчник на Поредица от уроци за JDBC , научихме как да използваме JDBC DriverManager и неговите методи, JDBC PreparedStatement в Java приложения.
В този урок ще разгледаме останалите интерфейси в JDBC. В предишните уроци разгледахме интерфейсите Statement, PreparedStatement и CallableStatement.
Тук ще се запознаем с интерфейсите JDBC ResultSet, ResultSetMetaData и DatabaseMetaData, техните методи и как да ги използваме в Java програма.
Интерфейс JDBC ResultSet
Интерфейсът ResultSet се намира в пакета java.sql. Той се използва за съхраняване на данните, които се връщат от таблицата на базата данни след изпълнение на SQL операциите в Java програмата. Обектът ResultSet поддържа курсор, насочен към данните за резултата. По подразбиране курсорът се позиционира преди първия ред на данните за резултата.
Методът next() се използва за преместване на курсора на следващата позиция в посока напред. Той връща FALSE, ако няма повече записи. Той извлича данни чрез извикване на метода executeQuery(), като използва някой от обектите statement. Това може да бъде обект Statement или PreparedStatement или CallableStatement. Интерфейсите PreparedStatement и CallableStatement са подинтерфейси на Statementинтерфейс.
Интерфейс на изявлението
Statement statemnt1 = conn.createStatement(); ResultSet rs1 = statemnt1.executeQuery("Select * from EMPLOYEE_DETAILS");
Интерфейс PreparedStatement
PreparedStatement pstatemnt1 = conn.prepareStatement(insert_query); ResultSet rs1 = pstatemnt1.executeQuery("Select * from EMPLOYEE_DETAILS");
Можем да използваме метода getX(), за да получим данните на колоните, докато итерираме през резултатите, където X - е типът на данните на колоната. Можем да използваме имената на колоните или индекса, за да получим стойностите, използвайки методите getX().
while(rs1.next()) { int empNum = rs1.getInt("empNum"); String lastName = rs1.getString("lastName"); String firstName = rs1.getString("firstName"); String email = rs1.getString("email"); String deptNum = rs1.getString("deptNum"); String salary = rs1.getString("salary"); System.out.print(empNum + "," +lastName+ "," +firstName+ "," +email +", "+deptNum +"," +salary); }
В методите getX() можем също така да посочим индексния номер на колоната вместо името на колоната.
while(rs1.next()) { int empNum = rs1.getInt(1); String lastName = rs1.getString(2); String firstName = rs1.getString(3); String email = rs1.getString(4); String deptNum = rs1.getString(5); String salary = rs1.getString(6); System.out.println(empNum + "," +lastName+ "," +firstName+ "," +email +", "+deptNum +"," +salary); }
Типове ResultSet
По подразбиране можем да итерираме данните/стойностите в ResultSet, които са върнати като изход от изпълнената SQL заявка, в права посока. Можем да итерираме стойностите в други посоки, като използваме Scrollable ResultSet. Можем да зададем типа и едновременността на ResultSet, докато създаваме обекти Statement, PreparedStatement и CallableStatement.
В ResultSet има 3 типа. Те са:
- TYPE_FORWARD_ONLY: Това е опцията по подразбиране, при която курсорът се движи от началото до края, т.е. в посока напред.
- TYPE_SCROLL_INSENSITIVE: При този тип курсорът ще се движи както напред, така и назад. Ако направим някакви промени в данните, докато итерираме съхранените данни, те няма да се актуализират в набора от данни, ако някой промени данните в БД. Защото наборът от данни съдържа данните от момента, в който SQL заявката върне данните.
- TYPE_SCROLL_SENSITIVE: Тя е подобна на TYPE_SCROLL_INSENSITIVE, но разликата е, че ако някой актуализира данните, след като SQL заявката е върнала данните, по време на итерацията тя ще отрази промените в набора от данни.
Съвременност на набора от резултати
В ResultSet има 2 режима на съвместна работа. Те са:
- ResultSet.CONCUR_READ_ONLY: Това е режимът на едновременност по подразбиране. Можем само да четем данните в ResultSet. Актуализирането не е приложимо.
- ResultSet.CONCUR_UPDATABLE: Можем да актуализираме данните в обекта ResultSet.
Някои бази данни не поддържат режим на едновременност за всички типове ResultSet. В такъв случай трябва да проверим дали поддържат желания от нас тип и режим на едновременност, като използваме метода supportsResultSetConcurrency().
Методи в интерфейса ResultSet
Съществуват 4 категории методи ResultSet. Те са:
- Навигационни методи
- Методи за получаване
- Методи за задаване
- Различни методи
Първо ще обсъдим методите за навигация, а след това ще продължим напред.
#1) Навигационни методи
Този метод се използва за придвижване на курсора в набора от данни.
- Булев абсолют(int row): Използва се за преместване на курсора в посочения ред, който е посочен в параметъра, и връща true, ако операцията е успешна, в противен случай връща false.
- Void afterLast(): Това кара курсора на ResultSet да се премести след последния ред.
- Void beforeFirst(): Това кара курсора на ResultSet да се премести преди първия ред.
- Boolean first(): Тя кара курсора на ResultSet да се премести на първия ред. Връща True, ако операцията е успешна, в противен случай False.
- Boolean last(): Тя кара курсора на ResultSet да се премести на последния ред. Връща True, ако операцията е успешна, в противен случай False.
- Boolean next(): Той кара курсора на ResultSet да се премести на следващия ред. Връща True, ако има още записи, и False, ако няма повече записи.
- Boolean previous(): Тя кара курсора на ResultSet да се премести на предишния ред. Връща True, ако операцията е успешна, в противен случай False.
- Boolean relative(): Тя премества курсора до зададения брой редове в посока напред или назад.
- Int getRow(): Връща номера на текущия ред, към който е насочен обектът ResultSet.
- Void moveToCurrentRow(): Той премества курсора обратно в текущия ред, ако в момента се намира в ред за вмъкване.
- Void moveToInsertRow(): Той премества курсора до конкретния ред, за да вмъкне реда в базата данни. Той запомня текущото местоположение на курсора. Така че можем да използваме метода moveToCurrentRow(), за да преместим курсора до текущия ред след вмъкването.
В този урок всички програми са написани на Java. Използвани са версия на Java 8 и Oracle DB.
>>Можете да изтеглите софтуера на Oracle от тук
>>Можете да изтеглите версията на Java 8 от тук
В него е описан процесът на инсталиране на Java стъпка по стъпка.
Примерна програма за JDBC ResultSet: (използване на навигационни методи)
package com.STH.JDBC; import java.sql.Connection; import java.sql.DatabaseMetaData; import java.sql.DriverManager; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.sql.SQLException; public class ResultSet_Example { public static void main(String[] args) throws ClassNotFoundException { // TODO Auto-generated method stub //Select query String select_query = "select * fromemployee_details"; Class.forName("oracle.jdbc.driver.OracleDriver"); //Свързване към Oracle DB try(Connection conn = DriverManager.getConnection("jdbc:oracle:thin:system/pass123@localhost:1521:X E")) { //Създаване на обект DatabaseMetaData DatabaseMetaData dbmd = conn.getMetaData(); /Проверка дали драйверът поддържа чувствителен към свитъци тип и едновременно обновяване boolean isSupportResultSetType =dbmd.supportsResultSetConcurrency(ResultSet.TYPE_SCROLL_SENSITIVE, ResultSet.CONCUR_UPDATABLE); if(isSupportResultSetType == true) { // Създаване на подготвена заявка PreparedStatement pstatemnt1 = conn.prepareStatement(select_query,ResultSet.TYPE_SCROLL_SENSITIVE,ResultSet. CONCUR_UPDATABLE); ResultSet rs = pstatemnt1.executeQuery(); /Придвижване на курсора към първия ред rs.first();System.out.println("FIRST ROW \n EMP NUM = " + rs.getInt("empNum") + "\n LAST NAME = "+ rs.getString(2)+"\n FIRST NAME = " + rs.getString(3)); //Moving the cursor to point last row rs.last(); System.out.println("LAST ROW \n EMP NUM = " + rs.getInt("empNum") + "\n LAST NAME = "+ rs.getString(2)+"\n FIRST NAME = " + rs.getString(3)); //Moving the cursor to point before first row rs.beforeFirst();System.out.println("Курсорът е насочен преди първия ред. Използвайте next(), за да се придвижите в посока напред"); /Придвижване на курсора до първия ред с помощта на next() rs.next(); System.out.println("FIRST ROW \n EMP NUM = " + rs.getInt("empNum") + "\n LAST NAME = " + rs.getString(2)+"\n FIRST NAME = " + rs.getString(3)); /Придвижване на курсора до точка след последния ред rs.afterLast(); System.out.println("КурсорътИзползвайте previous(), за да се придвижите в обратна посока"); /Придвижване на курсора до точка на последния ред с помощта на previous() rs.previous(); System.out.println("LAST ROW \n EMP NUM = " + rs.getInt("empNum") + "\n LAST NAME = "+ rs.getString(2)+"\n FIRST NAME = " + rs.getString(3)); /Придвижване на курсора до точка на третия ред rs.absolute(3); System.out.println("Курсорът е насочен към 3.ред"); System.out.println("ТРЕТИ РЕД \n EMP NUM = " + rs.getInt("empNum") + "\n ПОСЛЕДНО ИМЕ = "+ rs.getString(2)+"\n ПЪРВО ИМЕ = " + rs.getString(3)); /Придвижване на курсора към предходния ред на третия ред rs.relative(-1); System.out.println("Курсорът сочи към 1 ред преди третия ред"); System.out.println("ВТОРИ РЕД \n EMP NUM = " + rs.getInt("empNum") + "\n ПОСЛЕДНО ИМЕ = "+rs.getString(2)+"\n ПЪРВО ИМЕ = " + rs.getString(3)); /Придвижване на курсора към точка на четвъртия ред след втория ред rs.relative(4); System.out.println("Курсорът сочи към четвъртия ред след втория ред"); System.out.println("ШЕСТИ РЕД \n EMP NUM = " + rs.getInt("empNum") + "\n ПОСЛЕДНО ИМЕ = "+ rs.getString(2)+"\n ПЪРВО ИМЕ = " + rs.getString(3)); /Придвижване на курсора към точка на текущия редSystem.out.println(" Current Row = " + rs.getRow()); } } catch (SQLException e) { e.printStackTrace(); } } }
ИЗХОД:
Данни в таблица Employee_details
Обяснение:
В горната програма сме имплементирали методите first(), last(), beforeFirst(), afterLast(), next(), previous(), absolute(), relative() и getRow() в ResultSet. За да използваме тези методи, задаваме стойности ResultSet.TYPE_SCROLL_SENSITIVE, ResultSet.CONCUR_UPDATABLE в метода prepareStatement.
След това ще обсъдим кои са методите Getter в ResultSet:
#2) Методи за получаване
В ResultSet са записани данните от таблицата от базата данни. Методите Getter се използват за получаване на стойностите на таблицата в ResultSet. За целта трябва да се подаде или стойност на индекса на колоната, или име на колоната.
Следват методите за получаване в ResultSet:
- int getInt(int ColumnIndex): Използва се за получаване на стойността на посочената колона Index като тип данни int.
- float getFloat(int ColumnIndex): Използва се за получаване на стойността на посочената колона Index като тип данни float.
- java.sql.date getDate(int ColumnIndex): Използва се за получаване на стойността на посочената колона Индекс като стойност на дата.
- int getInt(String ColumnName): Използва се за получаване на стойността на посочената колона като тип данни int.
- float getFloat(String ColumnName): Използва се за получаване на стойността на посочената колона като тип данни float.
- Java.sql.date getDate(String ColumnName): Използва се за получаване на стойността на посочената колона като стойност на дата.
В интерфейса ResultSet има методи за получаване на всички примитивни типове данни (Boolean, long, double) и String. Можем да получим масив и двоичен тип данни от базата данни. Тя има методи и за това.
#3) Методи за задаване/актуализиране
Можем да актуализираме стойността в базата данни, като използваме методите ResultSet Updater. Те са подобни на методите Getter, но тук трябва да предадем стойностите/данните за конкретната колона, която трябва да се актуализира в базата данни.
Следват методите за актуализиране в ResultSet:
- void updateInt(int ColumnIndex, int Value): Използва се за актуализиране на стойността на посочената колона Index със стойност int.
- void updateFloat(int ColumnIndex, float f): Използва се за актуализиране на стойността на посочената колона Index с плаващата стойност.
- void updateDate(int ColumnIndex, Date d): Използва се за актуализиране на стойността на посочената колона Индекс със стойността на датата.
- void updateInt(String ColumnName, int Value): Използва се за актуализиране на стойността на посочената колона с дадената стойност int.
- void updateFloat(String ColumnName, float f): Използва се за актуализиране на стойността на зададената колона със зададената плаваща стойност.
- Java.sql.date getDate(String ColumnName): Използва се за актуализиране на стойността на посочената колона с дадената стойност на датата.
В интерфейса ResultSet има методи Updater за всички примитивни типове данни (Boolean, long, double) и String.
Методите на Updater само актуализират данните в обекта ResultSet. Стойностите ще бъдат актуализирани в БД след извикване на метода insertRow или updateRow.
Актуализиране на ред:
Можем да актуализираме данните в един ред, като извикаме метода updateX(), като подадем името или индекса на колоната и стойностите, които трябва да се актуализират. Можем да използваме всеки тип данни вместо X в метода updateX. Досега актуализирахме данните в обекта ResultSet. За да актуализираме данните в БД, трябва да извикаме метода updateRow().
Вмъкване на ред:
Трябва да използваме moveToInsertRow(), за да преместим курсора за вмъкване на нов ред. Вече разгледахме това в раздела за методите за навигация. След това трябва да извикаме метода updateX(), за да добавим данните към реда. Трябва да предоставим данни за всички колони, в противен случай ще се използва стойността по подразбиране на конкретната колона.
След като актуализираме данните, трябва да извикаме метода insertRow(). След това използвайте метода moveToCurrentRow(), за да върнете позицията на курсора обратно към реда, на който сме били преди да започнем да вмъкваме нов ред.
Пример за ResultSet:
package com.STH.JDBC; import java.sql.Connection; import java.sql.DatabaseMetaData; import java.sql.DriverManager; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.sql.SQLException; import java.sql.Statement; public class ResultSet_Example1 { public static void main(String[] args) throws ClassNotFoundException { // TODO Auto-generated method stub String select_query ="select empnum,lastName,firstName from employee_details"; String insert_query = "insert into employee_details values(?,?,?,?,?,?,?,?)"; Class.forName("oracle.jdbc.driver.OracleDriver"); /Свързване с Oracle DB try(Connection conn = DriverManager.getConnection("jdbc:oracle:thin:system/pass123@localhost:1521:XE")) { //Създаване на обект DatabaseMetaData DatabaseMetaData dbmd = conn.getMetaData();//Проверяваме дали драйверът поддържа тип, който не е чувствителен на превъртане, и едновременно обновяване boolean isSupportResultSetType = dbmd.supportsResultSetConcurrency(ResultSet.TYPE_SCROLL_INSENSITIVE, ResultSet.CONCUR_UPDATABLE); if(isSupportResultSetType == true) { // Създаване на подготвена декларация PreparedStatement pstatemnt1 =conn.prepareStatement(select_query,ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_UPDATABLE); ResultSet rs = pstatemnt1.executeQuery(select_query); /Придвижване на курсора към точката на последния ред на таблицата rs.last(); System.out.println("LAST ROW: Before inserting new Employee"); System.out.println("LAST ROW: EMPNUM = " + rs.getInt(1)); System.out.println("\n EMP NUM = " + rs.getInt("empNum") + "\nLAST NAME = " + rs.getString(2)+"\n FIRST NAME = " + rs.getString(3)); //Задаване на стойностите за вмъкване в таблицата EMPLOYEE_DETAILS /Придвижване на курсора към точката за вмъкване на ред в таблицата rs.moveToInsertRow(); //Актуализиране на стойността EMPNUM rs.updateInt(1, 1017); //Актуализиране на стойността LAST NAME rs.updateString(2, "Bond"); //Актуализиране на стойността FIRST NAME rs.updateString(3, "James"); //Вмъкване на нов ред rs.insertRow();/Придвижване на курсора към точка 5 ред rs.absolute(5); System.out.println("За актуализиране на EMPNUM на 5 ред"); System.out.println("\n EMP NUM = " + rs.getInt("empNum") + "\n LAST NAME = "+ rs.getString(2)+"\n FIRST NAME = " + rs.getString(3)); System.out.println(" Актуализиране на EMP id на 5 ред EMPLOYEE"); //Актуализиране на EMPNUM на 5 ред rs.updateInt(1,3005); rs.updateRow(); System.out.println("\n EMPNUM = " + rs.getInt("empNum") + "\n LAST NAME = "+ rs.getString(2)+"\n FIRST NAME = " + rs.getString(3)); //Moving the cursor to point last row rs.last(); System.out.println("LAST ROW: EMPNUM = " + rs.getInt(1)); System.out.println("\n EMP NUM = " + rs.getInt("empNum") + "\n LAST NAME = "+ rs.getString(2)+"\n FIRST NAME = " + rs.getString(3)); } } catch (SQLException e) { e.printStackTrace(); } }}
ИЗХОД:
Обяснение:
В горната програма това, което направихме, е, че първо съхранихме данните от таблицата Employee_details в обекта ResultSet, като използвахме заявката SELECT. След това показахме данните от последния ред в таблицата Employee_details, като използвахме метода last() на ResultSet. методът moveToInsertRow() кара курсора да посочи текущия ред, сега текущият ред е последният ред.
Методите updateXXX() се използват за актуализиране на стойностите в реда, а методът insertRow() вмъква данните в нов ред. Използвайки метода absolute(), накарахме курсора да сочи към 5-ия ред. Методът UpdateInt() се използва за актуализиране на EMPNUM с нов идентификатор на 5-ия служител в таблицата. След това се показват данните, за да се провери дали EMPNUM е актуализиран или не.
Накарахме курсора да посочи последния ред на таблицата с помощта на last() и го показахме. За да изпълним горната логика, трябва да зададем стойности на ResultSet.TYPE_SCROLL_INSENSITIVE, ResultSet.CONCUR_UPDATABLE в метода prepareStatement.
#4) Различни методи
- void close(): Използва се за затваряне на инстанцията ResultSet и освобождаване на ресурсите, свързани с инстанцията ResultSet.
- ResultSetMetaData getMetaData(): Връща инстанцията ResultSetMetaData. Тя съдържа информация за типа и свойствата на колоните на изхода на заявката. Ще научим повече за ResultSetMetaData в следващия раздел.
ResultSetMetaData
Какво представляват метаданните?
Метаданните означават данни за данните. Използвайки този интерфейс, ще получим повече информация за ResultSet. Той е наличен в пакета java.sql. Всеки обект ResultSet е свързан с един обект ResultSetMetaData.
Този обект ще съдържа подробна информация за свойствата на колоните, като тип данни на колоната, име на колоната, брой колони, име на таблицата, име на схемата и т.н., Можем да получим обекта ResultSetMetaData, като използваме метода getMetaData() на ResultSet.
Синтаксис на ResultSetMetaData:
PreparedStatement pstatemnt1 = conn.prepareStatement(insert_query); ResultSet rs1 = pstatemnt1.executeQuery("Select * from EMPLOYEE_DETAILS"); ResultSetMetaData rsmd = rs.getMetaData();
Важни методи на интерфейса ResultSetMetaData:
Име на метода | Описание |
---|---|
String getColumnName(int column) | Връща името на колоната на конкретната колона |
String getColumnTypeName(int column) | Връща типа данни на конкретната колона, която сме подали като параметър |
String getTableName(int column) | Връща името на таблицата на колоната |
String getSchemaName(int column) | Връща името на схемата на таблицата на колоната |
int getColumnCount() | Връща броя на колоните на ResultSet |
boolean isAutoIncrement(int Column) | Връща true, ако дадената колона е Auto Increment, иначе false |
boolean isCaseSensitive(int Column) | Връща true, ако дадената колона е Case Sensitive, иначе false |
Пример за ResultSetMetaData
package com.STH.JDBC; import java.sql.Connection; import java.sql.DriverManager; import java.sql.ResultSet; import java.sql.ResultSetMetaData; import java.sql.SQLException; import java.sql.Statement; public class ResultSetMetaData_Example { public static void main(String[] args) throws ClassNotFoundException, SQLException { // TODO Auto-generated method stub String QUERY= " select * fromemployee_details"; Class.forName("oracle.jdbc.driver.OracleDriver"); try(Connection conn = DriverManager.getConnection("jdbc:oracle:thin:system/pass123@localhost:1521:XE")) { Statement statemnt1 = conn.createStatement(); ResultSet rs1 =null; rs1 = statemnt1.executeQuery(QUERY); ResultSetMetaData rsmd = rs1.getMetaData(); System.out.println(" Използваме ResultSetMetaData ");System.out.println("No: of Columns: " + rsmd.getColumnCount()); System.out.println("ColumnName of Column 1: " + rsmd.getColumnName(1)); System.out.println("Data Type of Column 2: " + rsmd.getColumnTypeName(2)); System.out.println("Table Name of the Column 1: " + rsmd.getTableName(1)); System.out.println("Schema Name of the Column 1: " + rsmd.getSchemaName(1)); } } }
ИЗХОД:
Обяснение:
В горната програма сме имплементирали методите getColumnCount(), getColumnName(), getColumnTypeName(), getTableName() и getSchemaName() в интерфейса ResultSetMetaData.
DatabaseMetaData
Интерфейсът DatabaseMetaData дава информация за базата данни, като например DatabaseName, версия на базата данни и т.н.
Важни методи на интерфейса DatabaseMetaData:
Име на метода | Описание |
---|---|
String getDriverName() | Той ще върне името на драйвера JDBC, който използваме в нашата Java програма. |
String getDriverVersion() | Връща номера на версията на драйвера JDBC |
String getUserName() | Той връща потребителското име на базата данни, която използваме |
String getDatabaseProductName() | Връща името на базата данни, която използваме |
String getDatabaseProductVersion() | Връща номера на версията на базата данни, която използваме |
ResultSet getSchemas() | Връща имената на схемите, налични в свързаната база данни. |
String getStringFunctions() | Връща списъка с функциите за символни низове, налични в свързаната база данни |
String getTimeDateFunctions() | Връща списъка с функции за време и дата, налични в свързаната база данни. |
String getURL() | Той връща URL адреса на базата данни |
Boolean isReadOnly() | Връща информация дали базата данни е в режим само за четене. |
Boolean supportsBatchUpdates() | Връща информация дали базата данни поддържа пакетни актуализации. |
Boolean supportsSavepoints() | Връща информация дали базата данни поддържа точки за запаметяване |
Boolean supportsStatementPooling() | Връща информация дали базата данни поддържа обединяване на изявления |
Boolean supportsStoredProcedures() | Връща информация дали базата данни поддържа съхранени процедури |
Boolean supportsOuterJoins() | Връща информация дали базата данни поддържа Outer Join |
Тук са изброени някои важни методи на интерфейса DatabaseMetaData. Можете да се обърнете към официалния сайт на Oracle където можете да видите всички методи, налични в интерфейса DatabaseMetaData.
DatabaseMetaData Пример:
package com.STH.JDBC; import java.sql.Connection; import java.sql.DatabaseMetaData; import java.sql.DriverManager; import java.sql.ResultSet; import java.sql.ResultSetMetaData; import java.sql.SQLException; import java.sql.Statement; public class DatabaseMetaData_Example { public static void main(String[] args) throws ClassNotFoundException, SQLException { // TODO Auto-generated method stubClass.forName("oracle.jdbc.driver.OracleDriver"); Connection conn = DriverManager.getConnection("jdbc:oracle:thin:system/pass123@localhost:1521:XE"); DatabaseMetaData dbmd = conn.getMetaData(); System.out.println("Using DatabaseMetaData"); System.out.println("Driver Name: " + dbmd.getDriverName()); System.out.println("Driver Version: "+ dbmd.getDriverVersion()); System.out.println("UserName of theDatabase: " + dbmd.getUserName()); System.out.println("Database Product Name:" + dbmd.getDatabaseProductName()); System.out.println("Database Product Version: " + dbmd.getDatabaseProductVersion()); System.out.println("List of String Functions in the Database: " + dbmd.getStringFunctions()); System.out.println("List of Time & Date functions in the Database: " + dbmd.getTimeDateFunctions());System.out.println("URL на базата данни: " + dbmd.getURL()); System.out.println("Базата данни е само за четене? " +dbmd.isReadOnly()); System.out.println("Поддържа пакетни актуализации? " + dbmd.supportsBatchUpdates()); System.out.println("Поддържа точки за запазване? " + dbmd.supportsSavepoints()); System.out.println("Поддържа обединяване на изявления? " + dbmd.supportsStatementPooling()); System.out.println("Поддържа съхранениПроцедури? " + dbmd.supportsStoredProcedures()); System.out.println("Support Outer Join?" + dbmd.supportsOuterJoins()); } }
ИЗХОД:
Обяснение:
В горната програма сме използвали/имплементирали методите getDriverName(), getDriverVersion(), getUserName(), getDatabaseProductName(), getDatabaseProductVersion(), getStringFunctions(), getTimeDateFunctions(), getURL(), isReadOnly(), supportsBatchUpdates(), supportsStatementPooling(), supportsSavepoints(), supportsStoredProcedures() и supportsOuterJoins() в интерфейса DatabaseMetaData.
Да се отбележи:
- Интерфейсът JDBC ResultSet се използва за съхраняване на данните от базата данни и използването им в нашата Java програма.
- Можем също така да използваме ResultSet за актуализиране на данните, като използваме методите updateXXX().
- Обектът ResultSet насочва курсора преди първия ред от данните за резултата. С помощта на метода next() можем да преминем през ResultSet.
- Имаме методи за навигация на ResultSet, за да се придвижваме по-нататък в обекта ResultSet
- ResultMetaData се използва за получаване на повече информация за ResultSet, като име на колона, брой колони, тип данни на колоната и др.
- DatabaseMetData се използва за получаване на информация за базата данни, към която сме се свързали
Често задавани въпроси
Q #1) Каква е употребата на ResultSet?
Отговор: ResultSet се използва за съхраняване и извличане на данни от БД. Когато се изпълни методът executeQuery(), той ще върне обект ResultSet. Можем да използваме този обект ResultSet в нашата програма, за да изпълняваме логически задачи.
В #2) Как да проверим дали ResultSet е празен или не?
Отговор: Няма предварително дефинирани методи като length(), size() за проверка на IsResultSet Empty. Можем да използваме метода next() за итерация и ако той върне True, значи не е празен, а ако върне False, значи ResultSet е празен.
Q #3) Възможно ли е ResultSet да бъде null?
Отговор: Не, методът executeQuery() връща обект ResultSet, който никога не може да бъде нулев.
Q #4) Какво представлява актуализируемото ResultSet?
Отговор: Обновяемият обект ResultSet се използва за актуализиране на данните в колоната, вмъкване на данни в колоните и изтриване на редове. За да направим ResultSet обновяем, трябва да зададем тип на превъртане като чувствителен или нечувствителен и тип CONCUR като обновяем.
ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_UPDATABLE.
Q #5) Как да получите името на базата данни, която е била свързана?
Отговор: Можем да използваме метода getDatabaseProductName() на обекта DatabaseMetaData.
Заключение
В този урок разгледахме какво представляват интерфейсите ResultSet, ResultSetMetaData и DatabaseMetaData и техните важни методи, които се използват често в програмите JDBC. Видяхме също как да актуализираме данни в БД, като използваме ResultSet. ResultSetMetadata съдържа информация за ResultSet, като име на колона, брой колони и т.н.
DatabaseMetaData съдържа информация за базата данни.
<