21

Click here to load reader

datubaze.files.wordpress.com  · Web view01/09/2012 · interfeisu. Tā saprot kā SQL vaicājumu vai DB glabājamās procedūras izsaukumu nodot datu bāzes sistēmai, lai tā to

Embed Size (px)

Citation preview

Page 1: datubaze.files.wordpress.com  · Web view01/09/2012 · interfeisu. Tā saprot kā SQL vaicājumu vai DB glabājamās procedūras izsaukumu nodot datu bāzes sistēmai, lai tā to

JDBC interfeisa izmantošana SQL komandu realizēšanai

SQL Java JDBC DB

Page 2: datubaze.files.wordpress.com  · Web view01/09/2012 · interfeisu. Tā saprot kā SQL vaicājumu vai DB glabājamās procedūras izsaukumu nodot datu bāzes sistēmai, lai tā to

2

java.sql.DriverManager klase un JDBC draiveri

java.sql.DriverManager ir savienojumu veidošanas klase (savienojumu rūpnīca (connection factory)). Tā ir vienīgā klase, kura var izveidot savienojumus ar datu bāzi. Katrs savienojums ir java.sql.Connection objekts.

Driver Manager klase izmanto JDBC dzini (driver) lai izveidotu savienojumu. Katra datu bāzes sistēmas izstrādātāja firma (piemēram, Oracle, IBM, MS, Sybase) veic apgādi ar nepieciešamajiem dziņiem.

JDBC dzinis ir Java klase, kura realizē java.sql.Driver interfeisu. Tā saprot kā SQL vaicājumu vai DB glabājamās procedūras izsaukumu nodot datu bāzes sistēmai, lai tā to izpildītu. Dziņi tiek noformēti kā *.jar vai *.zip tipa faili. Dziņa instalēšana nozīmē viņa glabāšanas (atrašanās) vietas norādīšana operētājsistēmā (parametrs CLASSPATH):

CLASSPATH=c:\\oracle\oracle\10.1.0\jdbc\lib\ojdbc14.jar;%CLASSPATH%

Make sure following environment variables are set as described below:1) JAVA_HOME: This environment variable should point to the directory where you installed the JDK, e.g. C:\Program Files\Java\jdk1.5.0D:\oracle\product\10.2.0\db_1\jdk

2) CLASSPATH: This environment variable should have appropriate paths set, e.g. C:\Program Files\Java\jdk1.5.0_20\jre\libD:\oracle\product\10.2.0\db_1\jdk\jre\lib

3) PATH: This environment variable should point to appropriate JRE bin, e.g. C:\Program Files\Java\jre1.5.0_20\binD:\oracle\product\10.2.0\db_1\jdk\jre\bin

Page 3: datubaze.files.wordpress.com  · Web view01/09/2012 · interfeisu. Tā saprot kā SQL vaicājumu vai DB glabājamās procedūras izsaukumu nodot datu bāzes sistēmai, lai tā to

3

JDBC API Connection objektsThe java.sql.Connection object represents a single logical database connection. You use the Connection object for sending a set of SQL statements to the database server and managing the committing or aborting (rollback) of those SQL statements. Connection objekts veic sekojošu darbību izpildi:1. Izveido SQL komandu aprakstus (izveido Statement objektus).2. Nodrošina SQL vaicājumu un citu komandu izpildi un atbildes iegūšanu (objekts Resultset).3. Vada komandu commit un rollback izpildi.4. Nodrošina apgādi ar meta-datiem par savienojumuar datu bāzi.

Page 4: datubaze.files.wordpress.com  · Web view01/09/2012 · interfeisu. Tā saprot kā SQL vaicājumu vai DB glabājamās procedūras izsaukumu nodot datu bāzes sistēmai, lai tā to

4

JDBC interfeisa izmantošanas pamatdarbības

1. JDBC interfeisa programmu pakešu imports (nepieciešamo JDBC Java klašu piesaiste).

2. JDBC dziņa (draivera) reģistrācija. Vēlamā draivera realizācija tiek ielādēta operatīvajā atmiņā, lai varētu izpildīt JDBC pieprasījumus (requests).

3. Datu bāzes URL norādīšana. Izmantojamās datu bāzes adreses norādīšana.

4. Lietojuma un datu bāzes savienojuma objekta Connection izveidošana. DriverManager objekta getConnection() metodes izsaukums. Tas izveido savienojumu ar datu bāzi.

5. SQL komandas objekta (statement) izveidošana.

6. Vaicājuma izpilde un rezultāta ieguve (execute a query and return a

ResultSet object).

7. Iegūtā rezultāta apstrāde (process the ResultSet object).

7. Rezultāta un komandas objektu aizvēršana (ose the ResultSet and

Statement objects).

Page 5: datubaze.files.wordpress.com  · Web view01/09/2012 · interfeisu. Tā saprot kā SQL vaicājumu vai DB glabājamās procedūras izsaukumu nodot datu bāzes sistēmai, lai tā to

5

1. JDBC programmu pakešu imports

import java.sql.* ; import oracle.jdbc.driver.* ;

Page 6: datubaze.files.wordpress.com  · Web view01/09/2012 · interfeisu. Tā saprot kā SQL vaicājumu vai DB glabājamās procedūras izsaukumu nodot datu bāzes sistēmai, lai tā to

6

2. JDBC draivera reģistrēšana un savienojuma objekta izveidošana.

First it needs to establish a connection with the data source you want to use. A data source can be a DBMS, a legacy file system, or some other source of data with a corresponding JDBC driver. Typically, a JDBC application connects to a target data source using one of two classes:1. DriverManager: This fully implemented class connects an application to a data source, which is specified by a database URL. When this class first attempts to establish a connection, it automatically loads any JDBC 4.0 drivers found within the class path. Note that your application must manually load any JDBC drivers prior to version 4.0.2. DataSource: This interface is preferred over DriverManager because it allows details about the underlying data source to be transparent to your application. A DataSource object's properties are set so that it represents a particular data source.

Page 7: datubaze.files.wordpress.com  · Web view01/09/2012 · interfeisu. Tā saprot kā SQL vaicājumu vai DB glabājamās procedūras izsaukumu nodot datu bāzes sistēmai, lai tā to

7

2. JDBC draivera reģistrēšana un savienojuma objekta izveidošana. Klases DriverManager izmantošana

Datu bāzes draivera programmas reģistrācija ir process kurā draivera klase tiek ielādēta atmiņā, lai tā varētu realizēt JDBC interfeisu.

DriverManager.registerDriver(new oracle.jdbc.OracleDriver());static Connection conn = null;conn = DriverManager.getConnection("jdbc:oracle:thin:@dators:1521:BAZE", "system", "janis");

Driver DBdzinis = new oracle.jdbc.driver.OracleDriver();DriverManager.registerDriver(DBdzinis); static Connection conn = null;conn = DriverManager.getConnection("jdbc:oracle:thin:@dators:1521:BAZE", "system", "janis");

Connection conn = DriverManager.getConnection("jdbc:default:connection:");

Connection conn =DriverManager.defaultConnection();

Ja kļūda – SQLException;

However, the server-side internal JDBC driver runs within a default session and a default transaction context. As a result, you are already connected to the database, and all your SQL operations are part of the default transaction. You need not register the driver because it comes preregistered.

Page 8: datubaze.files.wordpress.com  · Web view01/09/2012 · interfeisu. Tā saprot kā SQL vaicājumu vai DB glabājamās procedūras izsaukumu nodot datu bāzes sistēmai, lai tā to

8

2. JDBC draivera reģistrēšana un savienojuma objekta izveidošana. Oracle Call Interface (OCI) draivera izmantošana (klases forName lietošana)

Class.forName ("oracle.jdbc.OracleDriver");Connection conn = DriverManager.getConnection ("jdbc:oracle:oci8:@localhost", "system", "janis");

Bet var arī:

Class.forName ("oracle.jdbc.OracleDriver");Connection conn = DriverManager.getConnection ("jdbc:oracle:thin:@//localhost:1521/BAZE", "system", "janis"); Ja kļūda – ClassNotFoundException.

Oracle's JDBC Thin driver uses Java sockets to connect directly to Oracle. It provides its own TCP/IP version of Oracle's SQL*Net protocol. Because it is 100% Java, this driver is platform independent and can also run from a Web Browser (applets).

Page 9: datubaze.files.wordpress.com  · Web view01/09/2012 · interfeisu. Tā saprot kā SQL vaicājumu vai DB glabājamās procedūras izsaukumu nodot datu bāzes sistēmai, lai tā to

9

2. Savienojuma ar datu bāzes sistēmu izveidošana.Oracle KPRB draiveris

Connection conn = (new oracle.jdbc.OracleDriver()).defaultConnection();

Oracle's JDBC KPRB driver is mainly used for writing Java stored procedures, triggers and database JSPs. It uses the default/ current database session and thus requires no additional database username, password or URL. Remember not to close the default Connection. Closing the default connection might throw an exception in future releases of Oracle.

jdbc:oracle:kprbjdbc:default:connectionjdbc:oracle:kprb:jdbc:default:connection:

Page 10: datubaze.files.wordpress.com  · Web view01/09/2012 · interfeisu. Tā saprot kā SQL vaicājumu vai DB glabājamās procedūras izsaukumu nodot datu bāzes sistēmai, lai tā to

10

2. OracleDataSource klases izmantošana savienojuma veidošanai ar datu bāzes sistēmu

OracleDataSource ods = new OracleDataSource();ods.setURL("jdbc:oracle:kprb");Connection conn = ods.getConnection();

OracleDataSource ods = new OracleDataSource();ods.setURL("jdbc:default:connection");Connection conn = ods.getConnection();

ods = new OracleDataSource();ods.setURL("jdbc:oracle:thin:@//server.local:1521/prod");ods.setUser("scott"); ods.setPassword("tiger");

Page 11: datubaze.files.wordpress.com  · Web view01/09/2012 · interfeisu. Tā saprot kā SQL vaicājumu vai DB glabājamās procedūras izsaukumu nodot datu bāzes sistēmai, lai tā to

11

create or replace JAVA source named "Tests" asimport java.sql.*;import oracle.jdbc.pool.*;public class Tests {public static String Metode() throws ClassNotFoundException,      SQLException {// Tipiskie JNDI savienojuma parametriOracleDataSource ds = new OracleDataSource();ds.setDriverType("thin"); ds.setServerName("localhost"); ds.setPortNumber(1521); ds.setDatabaseName("BAZE"); // sidds.setUser("system"); ds.setPassword("Janis1946"); Connection conn = ds.getConnection(); Statement stmt = conn.createStatement(); ResultSet rset = stmt.executeQuery("select 'Savienojuma pārbaude' from dual"); if (rset.next()) System.out.println(rset.getString(1)); rset.close(); stmt.close();String m = "AAA";return m;}}

create or replace JAVA source named "Tests" asimport java.sql.*;import oracle.jdbc.*;public class Tests {public static String Metode() {String m = "AAA";return m;}}

create or replace function TESTS_1 return varchar2 as language JAVA name 'Tests.Metode() return java.lang.String';

set serveroutput on;call DBMS_JAVA.SET_OUTPUT(2000);

select TESTS_1 from DUAL;

Page 12: datubaze.files.wordpress.com  · Web view01/09/2012 · interfeisu. Tā saprot kā SQL vaicājumu vai DB glabājamās procedūras izsaukumu nodot datu bāzes sistēmai, lai tā to

12

3. Datu bāzes adreses (URL) norādīšana

Izmantojot DriverManager.getConnection() metodi var izmantot trīs variantus datu bāzes URL norādei:

getConnection(String url)getConnection(String url, Properties prop)getConnection(String url, String user, String password)

DBVS JDBC dziņa nosaukums URL formāts

MySQL com.mysql.jdbc.Driver jdbc:mysql://hostname/ databaseName

ORACLE oracle.jdbc.driver.OracleDriver

jdbc:oracle:thin:@hostname:port Number:databaseName

DB2 COM.ibm.db2.jdbc.net.DB2Driver

jdbc:db2:hostname:port Number/databaseName

Sybase com.sybase.jdbc.SybDriver jdbc:sybase:Tds:hostname: port Number/databaseName

A JDBC URL is the connect string used during database connection requests. It specifies the JDBC driver type, authentication information, the database instance, the host, the protocol, the port, service name, and so on. It contains either the complete authentication information or partial information plus indirections (i.e., aliases) to other mechanisms such as the TNSNAMES.ORA.The Oracle JDBC URL format is as follows:

jdbc:oracle:<drivertype>:[<username>/<password>]@<database_specifier>where:<drivertype> = “thin” | “oci” | “kprb”[<username>/<password>] = “<username>”/”<password>” | empty

jdbc:oracle:thin:@localhost:1521:orcl jdbc:oracle:thin:@localhost:1521/myservice - Rekomendētais jaunais pieraksta variants

Page 13: datubaze.files.wordpress.com  · Web view01/09/2012 · interfeisu. Tā saprot kā SQL vaicājumu vai DB glabājamās procedūras izsaukumu nodot datu bāzes sistēmai, lai tā to

13

4. Priekšraksta (statement) vai komandas objekta izveidošana. Statement klase

Statement klase. Lieto SQL komandām, kurām nav IN tipa parametru.

String sql = "DROP " + object_type + " " + object_name;Statement stmt = conn.createStatement();stmt.executeUpdate(sql);

String sql = "SELECT COUNT(*) FROM " + tabName;int rows = 0;Statement stmt = conn.createStatement();ResultSet rset = stmt.executeQuery(sql);while (rset.next()) {rows = rset.getInt(1);}

A ResultSet object contains SQL query results, that is, the rows that meet the search condition. You can use the next() method to move to the next row, which then becomes the current row. You can use the getXXX() methods to retrieve column values from the current row.

Page 14: datubaze.files.wordpress.com  · Web view01/09/2012 · interfeisu. Tā saprot kā SQL vaicājumu vai DB glabājamās procedūras izsaukumu nodot datu bāzes sistēmai, lai tā to

14

4. Priekšraksta (statement) vai komandas objekta izveidošana. PreparedStatement klase

PreparedStatement klase. Lieto SQL komandām, kurām ir IN tipa parametri un kuras tiek izpildītas atkārtoti. Notiek pārkompilācijas.

String sql = "DELETE FROM dept WHERE deptno = ?";PreparedStatement pstmt = conn.prepareStatement(sql);pstmt.setInt(1, deptID);pstmt.executeUpdate();

Page 15: datubaze.files.wordpress.com  · Web view01/09/2012 · interfeisu. Tā saprot kā SQL vaicājumu vai DB glabājamās procedūras izsaukumu nodot datu bāzes sistēmai, lai tā to

15

4. Priekšraksta (statement) vai komandas objekta izveidošana. CallableStatement klase

CallableStatement lieto datu bāzes serverī glabājamo funkciju un procedūru izsaukšanai. Var būt IN un OUT tipa parametri.

// parameterless stored procedureCallableStatement cstmt = conn.prepareCall("{CALL proc}");

// stored procedureCallableStatement cstmt = conn.prepareCall("{CALL proc(?,?)}");

// stored functionCallableStatement cstmt = conn.prepareCall("{? = CALL func(?,?)}");

Important Points. When developing JDBC applications that access stored procedures, you must consider the following:1) Each Oracle JVM session has a single implicit native connection to the Database session in which it exists. This connection is conceptual and is not a Java object. It is an inherent aspect of the session and cannot be opened or closed from within the JVM.2) The server-side internal JDBC driver runs within a default transaction context. You are already connected to the database, and all your SQL operations are part of the default transaction. Note that this transaction is a local transaction and not part of a global transaction, such as that implemented by Java Transaction API (JTA) or Java Transaction Service (JTS).3) Statements and result sets persist across calls and their finalizers do not release database cursors. To avoid running out of cursors, close all statements and result sets after you have finished using them. Alternatively, you can ask your DBA to raise the limit set by the initialization parameter, OPEN_CURSORS.4) The server-side internal JDBC driver does not support auto-commits. As a result, your application must explicitly commit or roll back database changes.5) You cannot connect to a remote database using the server-side internal JDBC driver. You can connect only to the server running your Java program. For server-to-server connections, use the server-side JDBC Thin driver. For client/server connections, use the client-side JDBC Thin or JDBC Oracle Call Interface (OCI) driver.6) Typically, you should not close the default connection instance because it is a single instance that can be stored in multiple places, and if you close the instance, each would become unusable. If it is closed, a later call to the OracleDriver.defaultConnection method gets a new, open instance. The OracleDataSource.getConnection method returns a new object every time you call it, but, it does not create a new database connection every time. They all utilize the same implicit native connection and share the same session state, in particular, the local transaction.

Page 16: datubaze.files.wordpress.com  · Web view01/09/2012 · interfeisu. Tā saprot kā SQL vaicājumu vai DB glabājamās procedūras izsaukumu nodot datu bāzes sistēmai, lai tā to

16

5. SQL komandas izpilde: execute-Query(), executeUpdate(), and execute()

ResultSet rezultats = komanda.executeQuery("select NOS from FIRMAS");

int rowcount = komanda.executeUpdate("create table FIRMAS (NUM number, NOS varchar2(20)");

int rowcount = komanda.executeUpdate(“delete from FIRMAS where NUM = 7");

Page 17: datubaze.files.wordpress.com  · Web view01/09/2012 · interfeisu. Tā saprot kā SQL vaicājumu vai DB glabājamās procedūras izsaukumu nodot datu bāzes sistēmai, lai tā to

17

5. Iegūto rezultātu - ResultSet objekta apstrāde

while (rezultats.next()) {String nos = rezultats.getString("NOS");int num = rezultats.getInt("NUM");… }

NUMBER getInt()DATE getDate()VARCHAR2 getString()BLOB getBlob()CLOB getClob()ARRAY getArray()Structured type getObject()REF getRef()

6. Izmantoto, piesaistīto resursu atbrīvošana (aizvēšana)

rezultats.close();komanda.close();savienojums.close(); (Jāuzmanās !!!)