Download Application Server and Database Server Communication

Survey
yes no Was this document useful for you?
   Thank you for your participation!

* Your assessment is very important for improving the workof artificial intelligence, which forms the content of this project

Document related concepts
no text concepts found
Transcript
CSE 135
Application Server and Database Server
Communication
Three-Tier Architecture
Located
@ Any PC
Browser
HTTP
Requests
Located
@ Server 2
HTML
App
Server
JDBC
Requests
R
t
Located
@ Server 1
JSPs
Tuples
Database
Server
2
1
Data Entry Form
3
JDBC
import java.sql.*;
class JdbcTest {
public static void main (String args [])
throws SQLException {
// Registering Postgresql JDBC driver
Class.forName("org.postgresql.Driver");
// Open a connection to the database
Connection conn = DriverManager.getConnection(
"jdbc:postgresql://localhost/jdbc-examples?"
+
"user=postgres&password=postgres");
4
2
JDBC (cont’d)
// Query the student PIDs
Statement stmt = conn.createStatement();
ResultSet rset =
stmt.executeQuery("SELECT pid FROM students");
// Print out the PID (1st attribute)
while (rset.next ())
System.out.println (rset.getInt(1));
//
//close
the result set,
, statement,
, and connection
rset.close();
stmt.close();
conn.close();
}
}
5
PreparedStatement Object
• If you want to execute a Statement object many
times, it will normally reduce execution time to
use a PreparedStatement
P
dSt t
t object instead:
PreparedStatement pstmt = conn.prepareStatement(
"UPDATE students SET first_name = ? " +
"WHERE pid = ?");
pstmt.setString(1,
pstmt
setString(1 ”John");
John );
pstmt.setInt(2, 88888888);
pstmt.executeUpdate();
6
3
PreparedStatement Object (cont’d)
• The following two code fragments accomplish the
same thing:
String updateStr =
"UPDATE students SET first_name = ’John’ " +
"WHERE pid = 88888888";
stmt.executeUpdate(updateStr);
PreparedStatement pstmt = conn.prepareStatement(
"UPDATE students SET first_name = ? " +
"WHERE pid = ?");
pstmt.setString(1, ”John");
pstmt.setInt(2, 88888888);
updateSales.executeUpdate():
7
ResultSet Object
• int getInt(int columnIndex)
Retrieves the value of the designated column in
the current row of a ResultSet
R
ltS t object as an int
i t
Java type
• int getInt(String columnName)
• String getString(int columnIndex)
• String getString(String columnName)
8
4
Using Transactions
• When a connection is created, it is in AutoCommit
mode, that is, each individual SQL statement is
treated as a transaction and will be automatically
committed right after it is executed
conn.setAutoCommit(false);
...
<transaction>
...
conn.commit();
conn.setAutoCommit(true);
You can omit if you do
not wish
h to switch
h back
b k
to autocommit mode.
Then this point becomes
the start of a new
transaction
9
Using Transactions – Example
conn.setAutoCommit(false);
PreparedStatement pstmt = conn.prepareStatement(
"UPDATE students SET first_name
first name = ? WHERE pid = ?");
pstmt.setString(1, ”John");
pstmt.setInt(2, 88888888);
pstmt.executeUpdate();
pstmt.setString(1, ”Mary");
pstmt.setInt(2, 77777777);
pstmt.executeUpdate();
p
p
();
conn.commit();
conn.setAutoCommit(true);
10
5
Retrieving Exceptions
• JDBC lets you catch the exceptions generated by
your DBMS
try {
// Code that could generate a SQLException
} catch (SQLException e) {
// Either handle exception here...
// ... or propagate it upwards with the original cause
throw new RuntimeException(e);
}
11
Retrieving Exceptions (cont’d)
• Release resources even if an exception if thrown
try{
...
} catch (SQLException e) {
...
} finally {
// release resources in reverse-order of creation
if (rs != null) {
try { rs.close(); } catch (SQLException e) {} // Ignore
rs = null;
}
if (pstmt != null) {...}
if (conn != null) {...}
}
12
6
Data Entry Form
13
1st Attempt: only reports students – no
forms
14
7
1st Attempt; Split apart menus,
advertisements, etc
Menu HTML Code
<b>Data
b
Entry Menu</b>
/b
<ul>
<li><a href=”students.jsp">Students<a></li>
<li><a href="classes.jsp">Classes<a></li>
<li><a href=”enrollment.jsp">Enrollment<a></li>
</ul>
15
1st Attempt
JSP Code
<html>
<body><table><tr>
b d
bl
<td><jsp:include page="menu.html”/></td>
<td>
<Open Connection Code>
<Statement Code>
<Presentation Code>
<Close Connection Code>
</td>
</tr></table></body>
</html>
16
8
1st Attempt
Open Connection Code
<%-- Import the java.sql package --%>
<%@
%@ page i
import="java.sql.*"
t "j
l *" %
%>
<%
<variable declarations and initializations>
try {
// Registering Postgresql JDBC driver
Class.forName("org.postgresql.Driver");
// Open a connection to the database
conn = DriverManager.getConnection(
"jdbc:postgresql://localhost/jdbc-examples?" +
"user=postgres&password=postgres");
%>
17
1st Attempt
Statement Code
<%
%
// Create the statement
stmt = conn.createStatement();
// Use the statement to SELECT the students
// FROM the students table.
rs = stmt.executeQuery(
stmt executeQuery("SELECT
SELECT * FROM students");
students );
%>
18
9
1st Attempt
Presentation Code
<table>
<tr>
<th>ID</th>
<th>PID</th>
<th>First Name</th>
<th>Middle Name</th>
<th>Last Name</th>
</tr>
<%-- Iterate over the ResultSet --%>
<% while ( rs.next() ) { %>
<Iteration Code>
<% } %>
</table>
19
1st Attempt
Iteration Code
<tr>
<%-- Get the id--%>
<td><%=rs.getInt(”id")%></td>
g
<%-- Get the pid --%>
<td><%=rs.getInt(”pid")%></td>
<%-- Get the first name --%>
<td><%=rs.getString("first_name")%></td>
<%-- Get the middle name --%>
<td><%=rs.getString("middle_name")%></td>
<%-- Get the last name --%>
<td><%=rs.getString("last_name")%></td>
</tr>
20
10
1st Attempt
Close Connection Code
<%
// Cl
Close the
h ResultSet
l S
rs.close();
// Close the Statement
statement.close();
// Close the Connection
conn.close();
} catch (SQLException e) { <Exception handling> }
%>
21
Data Entry Form - 2nd Attempt:
Insertion form included
22
11
“Model 1” programming
Database accessing code
If request to insert student
perform SQL INSERT
If request to delete student
perform SQL UPDATE
If request to update student
perform SQL DELETE
HTML-producing part of JSP
INSERT STUDENT FORM
UPDATE STUDENT FORMS
DELETE STUDENT FORMS
http://.../students.jsp?action=insert&...
http://.../students.jsp?action=update&...
http://.../students.jsp?action=delete&...
23
Data Entry Form - 2nd Attempt
JSP Code
<html>
<body><table><tr>
b d
bl
<td><jsp:include page="menu.html”/></td>
<td>
<Open Connection Code>
<Insertion Code>
<Statement Code>
<Presentation Code>
<Close Connection Code>
</td>
</tr></table></body>
</html>
24
12
Data Entry Form - 2nd Attempt
Presentation Code
<table>
<tr>
<th>ID</th>
<th>PID</th>
<th>First Name</th>
<th>Middle Name</th>
<th>Last Name</th>
</tr>
<Insert Form Code>
<%-- Iterate over the ResultSet --%>
<% while ( rs.next() ) { %>
<Iteration Code>
<% } %>
</table>
25
Data Entry Form - 2nd Attempt
Insert Form Code
<tr>
<form action="students
action="students.jsp"
jsp" method=”POST">
<input type="hidden" name="action" value="insert"/>
<th>&nbsp;</th>
<th><input value="" name=”pid" size="10"/></th>
<th><input value="" name="first" size="15"/></th>
<th><input value="" name="middle" size="15"/></th>
<th><input value="" name="last" size="15"/></th>
<th><input type
type="submit"
"submit" value
value="Insert"/></th>
"Insert"/></th>
</form>
</tr>
26
13
Data Entry Form - 2nd Attempt
Insertion Code
// Check if an insertion is requested
String action = request.getParameter(
request getParameter("action");
action );
if (action != null && action.equals("insert")) {
...
// Create the prepared statement to INSERT student values
pstmt = conn.prepareStatement(
"INSERT INTO students (pid, first_name, middle_name,
last_name) VALUES (?, ?, ?, ?)");
pstmt.setInt(1,Integer.parseInt(request.getParameter(”pid")));
...
int rowCount = pstmt.executeUpdate();
...
}
27
Data Entry Form - 3rd Attempt
28
14
Data Entry Form - 3rd Attempt
JSP Code
<html><body><table><tr>
<td><jsp:include
d j
i l d page="menu.html”/></td>
"
h l”/ / d
<td>
<Open Connection Code>
<Insertion Code>
<Update Code>
<Delete Code>
<Statement Code>
<Presentation Code>
<Close Connection Code>
</td>
</tr></table></body></html>
29
Data Entry Form - 3rd Attempt
Presentation Code
<table>
<tr>
<th>ID</th>
<th>PID</th>
<th>First Name</th>
<th>Middle Name</th>
<th>Last Name</th>
</tr>
<I
<Insert
t F
Form C
Code>
d >
<%-- Iterate over the ResultSet --%>
<% while ( rs.next() ) { %>
<Iteration Code>
<% } %>
</table>
30
15
Data Entry Form - 3rd Attempt
Iteration Code
<tr>
<form action="students.jsp" method=”POST">
<input type="hidden" name="action" value="update"/>
<input type="hidden" name="id" value="<%=rs.getInt(”id")%>"/>
...
<%-- Get the pid --%>
<td><input value="<%=rs.getInt(”pid)%>" name=”pid”/></td>
...
<td><input type="submit" value="Update"></td>
</form>
<form action="students.jsp" method=”POST">
<input type="hidden" name="action" value="delete"/>
<input type="hidden" value="<%=rs.getInt(”id")%>" name="id"/>
<td><input type="submit" value="Delete"/></td>
</form>
</tr>
31
Data Entry Form - 3rd Attempt
Delete Code
// Check if a delete is requested
if (action != null && action.equals("delete"))
action equals("delete")) {
...
// Create the prepared statement to DELETE students
pstmt = conn.prepareStatement(
"DELETE FROM Students WHERE id = ?");
pstmt.setInt(1,
Integer parseInt(request.getParameter(
Integer.parseInt
(request getParameter("id")));
id )));
int rowCount = pstmt.executeUpdate();
...
}
32
16
Data Entry Form - 3rd Attempt
Update Code
// Check if an update is requested
if (action != null && action.equals("update"))
action equals("update")) {
...
// Create the prepared statement to UPDATE student
values
pstmt = conn.prepareStatement(
"UPDATE students SET pid = ?, first_name = ?, " +
"middle_name = ?, last_name = ? WHERE id = ?");
pstmt.setInt(1,
Integer.parseInt(request.getParameter("pid")));
...
int rowCount = pstmt.executeUpdate();
...
}
33
17
Related documents