* Your assessment is very important for improving the workof artificial intelligence, which forms the content of this project
Download ps - CS
Serializability wikipedia , lookup
Concurrency control wikipedia , lookup
Clusterpoint wikipedia , lookup
Microsoft SQL Server wikipedia , lookup
Database model wikipedia , lookup
Java ConcurrentMap wikipedia , lookup
Relational model wikipedia , lookup
Versant Object Database wikipedia , lookup
Introduction to JDBC JDBC is used for accessing databases JDBC: Java Database Connectivity from Java applications Information is transferred from relations to objects and vice-versa databases optimized for searching/indexing objects optimized for engineering/flexibility Compilation Why Access a Database with Java? When executing an SQL statement via There are queries that can not be JDBC, it is not checked for errors until it computed in SQL: is run (Not checked during compilation) Given a table Bus(Source, Destination) find all pairs of places that it is possible to travel between (paths of any length) Java allows for a convenient user interface to the database Six Steps Packages to Import Load the driver In order to connect to the Oracle Establish the Connection database from java, import the following Create a Statement object packages: Execute a query Process the result Close the connection java.sql.*; (usually enough) javax.sql.* (for advanced features, such as scrollable result sets) JDBC Architecture Connecting Driver Manager Driver Manager Application Application Driver Driver The application creates a driver instance and registers it with the DriverManager. 1. Initializing a driver: new oracle.jdbc.driver.OracleDriver() 2. Registering it with the DriverManager: DriverManager.registerDriver( ) 3. Getting a connection: The DriverManager connects a driver to the DB The DriverManager keeps track of registered driver inst ances and t heir connect ions t o DB s. The Driver t alks t o a part icular dat abase t hrough the connection DriverManager.getConnection(URL) Note: Stages 1+2 may be combined with Class. f orName( oracle. j dbc. driver. OracleDriver"); In Stage 3, the Manager tries all drivers and assigns a connection to the first driver that succeeds. Connecting to the Database String path = "jdbc:oracle:thin:"; String host = "sol4"; String port = "1521"; String db = "stud"; String login = gidi"; String password = password ; String url = path + login + "/" + password + "@" + host +":" + port + ":" + db; Class.forName("oracle.jdbc.driver.OracleDriver"); Connection con = DriverManager.getConnection(url); Statements Statements are used for queries that are only issued once. Query methods 1. Statement createStatement() returns a new Statement object prepared because it already includes the query string 2. PreparedStatement prepareStatement(String sql) returns a new PreparedStatement object Both are used to send SQL commands to the DB Both are created by the connection executeQuery String queryStr = "SELECT * FROM Sailors " + "WHERE Name = 'joe smith'"; No semicolon(;) !!! A statement can activate: 1. executeQuery(String query): for queries t hat don t change t he DB (select ) 2. executeUpdate(String query): for queries which affect the DB (create, delete, drop, etc.) Statement stmt = con.createStatement(); ResultSet rs = stmt.executeQuery(queryStr); The executeQuery method returns a ResultSet object representing the query result. executeUpdate String deleteStr = DELETE FROM Sailors " + "WHERE sid = 15"; PreparedStatement motivation Suppose we would like to run the query No semicolon(;) !!! Statement stmt = con.createStatement(); int delnum = stmt.executeUpdate(deleteStr); executeUpdate returns the number of rows modified. Prepared Statements Prepared Statements are used for queries that are executed many times with possibly different contents. A PreparedStatement object includes the query and is prepared for execution. SELECT * FROM Emp wher e name= moshe ; But we would like to run this for all employees (separately), not only moshe Could we create a variable instead of moshe which would get a different name every time??.. Querying with PreparedStatement String queryStr = "SELECT * FROM Sailors " + "WHERE Name = ? and Rating < ? ; PreparedStatement pstmt = con.prepareStatement(queryStr); Value to Question marks can be inserted as variables. -setString(i, value) The i-th question -setInt(i, value) mark is set to the insert pstmt.setString(1, Joe ); pstmt.setInt(2, 8); 1 st question mark ResultSet rs = pstmt.executeQuery(); given value. Affecting the DB with PreparedStatement String deleteStr = DELETE FROM Boats " + "WHERE Name = ? and Color = ? ; PreparedStatement pstmt = con.prepareStatement(deleteStr); pstmt.setString(1, Fluffy ); pstmt.setString(2, "red"); int delnum = pstmt.executeUpdate(); Statements vs. PreparedStatements: Be Careful ! Are these the same? What do they do? String val = Joe ; PreparedStatement pstmt = con.prepareStatement( select * from Sailors where sname=? ); pstmt.setString(1, val); ResultSet rs = pstmt.executeQuery(); String val = Joe ; Statement stmt = con.createStatement( ); ResultSet rs = stmt.executeQuery( select * from Sailors where sname= + val); Statements vs. PreparedStatements: Be Careful ! Statements vs. PreparedStatements: Be Careful ! Will this always work? Will this work? Statement stmt = con.createStatement( ); ResultSet rs = stmt.executeQuery( select * from R where A = + val + ); The moral: When getting input from the user, always use a PreparedStatement PreparedStatement pstmt = con.prepareStatement( select * from ? ); pstmt.setString(1, "Sailors"); No! will attempt to insert sailors , and result in: Select * from sailors We can put ? only instead of values ResultSet ResultSet Statement ExecuteQuery(String Q) ResultSet createStatement() Statement Connection ExecuteUpdate(String Q) int A ResultSet is an object which contains the result of a query- a t able . Only one ResultSet per Statement can be open at once(!). A ResultSet maintains a cursor pointing to its current row of data. Prepared Statement setString(int num,String val) ExecuteQuery() ResultSet Prepared prepareStatement Statement (String Q) ExecuteUpdate() Connection int The 'next' method moves the cursor to the next row As of JDBC 2.0, scrollable ResultSets are available, which also include previous , first , last , et c.. ResultSet cont. Any methods on the resultSet will occur on the current row. The cursor is positioned before the first row upon creation. Statement stmt=con.createStatement(); ResultSet rs = stmt.executeQuery ("SELECT * FROM Table1"); while (rs.next()) { //something } ResultSet methods Getting the value in some column (for the current row): String s = getString(int columnNum); rs.getString( column1"); getString(String columnName); getInt(int columnNum); getInt(String columnName); Et c To check if null was returned, you have to use wasNull() on the ResultSet after getting the value. The driver maps SQL types (varchar, number, ) t o the appropriate Java method (getString, getInt ) SQL type Mapping Java Types to SQL Types Example revisited Statement stmt = con.createStatement(); ResultSet rs = stmt.executeQuery("SELECT a, b, c FROM Table1"); // retrieve and print the values for the current row while (rs.next()) { int i = rs.getInt("a"); String s = rs.getString("b"); Java method float f = rs.getFloat("c"); System.out.println("ROW = " + i + " " + s + " " + f); } Advanced ResultSets 1. TYPE_FORWARD_ONLY: The default, simple RS. 2. TYPE_SCROLL_INSENSITIVE: Scrollable RS, does not modify when the DB is modified 3. TYPE_SCROLL_SENSITIVE: Scrollable RS, if its values are changed in the DB, they will also change in the RS. In addition, a ResultSet may be either: 1. CONCUR_READ_ONLY: the programmer cannot change the ResultSet (default) 2. CONCUR_UPDATABLE: the programmer can change the ResultSet ResultSetMetaData An object created by the ResultSet which holds information about its columns ResultSetMetaData rsmd = rs.getMetaData(); int numcols = rsmd.getColumnCount(); for (int i = 1 ; i <= numcols; i++) { if (i > 1) System.out.print(","); System.out.print(rsmd.getColumnLabel(i)); } Creating advanced ResultSets For Statement: Statement stmt = con.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE, ResultSet.CONCUR_UPDATABLE); ResultSet rs = stmt.executeQuery( "SELECT * from emp"); For PreparedStatement: PreparedStatement pstmt= con.prepareStatement("SELECT * FROM Emp where Eid=? , ResultSet.TYPE_SCROLL_SENSITIVE, ResultSet.CONCUR_UPDATABLE); pstmt.setInt(1, "1000010"); ResultSet rs = stmt.executeQuery(); Printing Query Output: Result Set (2) while (rs.next()) { for (int i = 1 ; i <= numcols; i++) { if (i > 1) System.out.print(","); System.out.print(rs.getString(i)); } System.out.println(""); } Cleaning Up After Yourself Remember to close the Connections, Statements, PreparedStatements and ResultSets Dealing With Exceptions An exception may be chained: catch (SQLException e) { while (e != null) { //human readable message about the exception System.out.println(e.getMessage()); Highly recommended con.close(); stmt.close(); pstmt.close(); rs.close(); //String describing the reason of the exception System.out.println(e.getSQLState()); Recommended Optional (Will otherwise be closed by its calling statement) //driver- dependant code for the exception System.out.println(e.getErrorCode()); e = e.getNextException(); } } What will this output? Timeout St r ing t able1= cr eat e t able t able1(col1 int eger , col2 int eger ) ; Statement st=con.createStatement(); int resCreate=st.executeUpdate(table1); PreparedStatement ps1 = con.pr epar eSt at ement ( inser t into Table1 values(?,?) ); You can use Stmnt.setQueryTimeOut(int secs) to set a timeout for the driver to wait for a statement to be completed for(int i=0;i<10;i++){ ps1.setInt(1,i); ps1.setInt(2,i*i); ps1.executeUpdate(); If the operation is not completed in the given time, an SQLException is thrown } Statement st2=con.createStatement(); ResultSet rs=execut eQ uer y( select col2 f r om Table1 ); while(rs.next()){ System.out.println(rs.getInt(1)); } Transactions Transaction = 2 or more statements which must all succeed (or all fail) together Transactions in JDBC If one fails, the system must reverse all previous actions Also can t leave DB in inconsist ent st at e half way through a transaction COMMIT = complete transaction ROLLBACK = abort Example Transaction Management Suppose we want to transfer money from bank account 13 to account 72: PreparedStatement pstmt = con.prepareStatement( update BankAccount set amount = amount + ? where accountId = ? ); pstmt.setInt(1,- 100); pstmt.setInt(2, 13); pstmt.executeUpdate(); What happens if this pstmt.setInt(1, 100); update fails? pstmt.setInt(2, 72); pstmt.executeUpdate(); The connection has a state called AutoCommit mode if AutoCommit is true, then every statement is automatically committed if AutoCommit is false, then every statement is added to an ongoing transaction Default: true Fixed Example AutoCommit con.setAutoCommit(boolean val) If you set AutoCommit to false, you must explicitly commit or rollback the transaction using Connection.commit() and Connection.rollback() Useful link regarding JDBC: http://java.sun.com/ j2se/ 1.3/ docs/ guide/ jdbc/ getstart/ GettingStartedTOC.fm.html con.setAutoCommit(false); try { PreparedStatement pstmt = con.prepareStatement( update BankAccount set amount = amount + ? where accountId = ? ); pstmt.setInt(1,- 100); pstmt.setInt(2, 13); pstmt.executeUpdate(); pstmt.setInt(1, 100); pstmt.setInt(2, 72); pstmt.executeUpdate(); con.commit(); catch (Exception e) { con.rollback(); } This document was created with Win2PDF available at http://www.daneprairie.com. The unregistered version of Win2PDF is for evaluation or non-commercial use only.