Upload
others
View
26
Download
0
Embed Size (px)
Citation preview
www . i t s c i .m ju . ac . t h / sayan
JDBC SAYAN UNANKARD1/2562
5
WHAT IS JDBC?
พฒนาขนโดย Javasoft ในป 1996 และไดรบการยอมรบอยางแพรหลาย
JDBC ยอมาจากค าวา Java Data Base Connectivity API ซงเปนเครองมอทใชเปนพนฐานส าหรบนกพฒนาในการตดตอกบ data sourceโดยมโครงสรางทถกออกแบบมาเพอยอมใหนกพฒนาในการโปรแกรม ส าหรบเปนมาตรฐานในการตดตอและยอมใหระบบฐานขอมลทแตกตางกนสามารถใช low-level JDBC เพอใชส าหรบการเชอตอและการ query ของระบบฐานขอมล
เนองจาก JDBC มความยดหยนคอนขางมาก นกพฒนาจงไมจ าเปนตองกงวลเกยวกบการตดตอกบSQL ส าหรบแตละฐานขอมล database หรอสญเสยคณสมบตบางประการส าหรบระบบฐานขอมลทเปนเปาหมาย
2
Database
JDBC API
Java Application
JDBC Driver Manager
Vendor-Supplied
JDBC Driver
JDBC/ODBCBridge
Database ODBC Driver
JDBC Driver API
JDBC TECHNOLOGY DRIVERS
3
ใชแนวความคดในการพฒนาแบบ ODBC
ไดรบการสนบสนนจากผผลต DBMS รายใหญ เชน Oracle, DB2, SQL Server, Sybase, Informix
ขอดของ JDBC• ถกพฒนาขนจาก Java – “Write once, run anywhere”
• ไมจ าเปนตองตดตงลงบนฝง client
JDBCExtension
API SPIApplication Program
DBMS vendor-provided or third-party JDBC driver
JDBC
4
THE JDBC-ODBC BRIDGE
• ODBC (Open Database Connectivity) เปนเทคโนโลยของ Microsoft ทเกดขนในชวงกลางของทศวรรษ 1990’s.
• เปน API ทยอมใหโปรแกรมทเขยนดวย C/C++ สามารถประมวลผลค าสง SQL ภายในระบบฐานขอมลได
• สวน JDBC-ODBC bridge จะยอมใหโคดจาวาสามารถใช C/C++ interface ของ ODBC ได
• ขนตอนในการแปลงโคดจะไดจาก Java --> C --> SQL) ซงอาจมผลตอเวลาในการประมวลผล
• ODBC driver ส าหรบ Microsoft Access ถกจดจ าหนายมาพรอมกบ MS Office
5
PROGRAMMING WITH JDBC
ขนตอนในการโปรแกรมดวย JDBC• โหลด driver ของระบบฐานขอมล (may be)
• ตดตงการ connection
• ประมวลผล SQL statements
• โปรเซสผลลพธตาง ๆ (if needed)
• ปดการ connection (may be)
6
JDBC
Type I“Bridge”
Type II“Native”
Type III“Middleware”
Type IV“Pure”
ODBCODBCDriver
CLI(.lib)
MiddlewareServer
JDBC DRIVERS
7
TYPE OF JDBC DRIVER
ถกจ าแนกออกเปน 4 แบบ:
Type 1 JDBC-ODBC bridge drivers • ใชการ connect ระหวาง Java client ไปยงระบบฐานขอมลโดยผาน ODBC drivers แบบ
Type 1 ตองการ non-Java software ในการตดตงบนเครองทใชส าหรบรนโคด และโดยปกตจะถก implemented โดยใช native code เชน C/C++
Type 2 Native-API partly Java drivers • ใช code library ในการเขาถงฐานขอมล โดยการเรยกผาน Java ไปยง library โดยType 2
จะถก implemented โดย native code ดงนนจงสามารถท างานไดดกวา Java ปจจบนคอนขางลาสมยแลว เชน e.g. Intersolv Oracle Driver
8
TYPE OF JDBC DRIVER
Type 3 Net-protocol All-Java drivers • เปนการใชเนตเวรคโปรโตคอลเพอตดตอกบสวนทเปน middleware ซงอาจเปน driver ชนด
อน ๆ ทไดจดเตรยมไวส าหรบการเขาถงฐานขอมล เชน BEA's WebLogic ทม drivers โดยเฉพาะส าหรบทจะใชกบ applet หรอ Symantec DBAnywhere
Type 4 Native-protocol All-Java drivers
• จะถกเขยนโดย Java ทงหมด โดย Driver แบบนจะเขาใจถงเนตเวรคโปรโตคอลทใชกบระบบฐานขอมลโดยเฉพาะ และสามารถเขาถงระบบฐานขอมลไดโดยตรง drivers แบบนจะม Java security manager ทยอมให TCP/IP สามารถเชอมตอกบ database server ได Oracle, mSQL
9
Type 1Type 2
Type 1 : Drivers ในรปของจาวาโคดทสามารถ connect กบ Java client ไปยงฐานขอมลทไมใชจาวา เชน ODBC
Type 2 : ใชกบ code libraries โดยเรยกใชผาน Java code ทเปน JDBC
JDBC DRIVER TYPES
10
Type 4Pure Java
Type 3
Type 3 : โคดจาวาทงหมดจะเชอมตอเขากบ middleware ในการเขาถงฐานขอมลผานโปรโตคอลเนตเวรค
Type 4 : เปน Java JDBC ทงหมดทถกสรางขนเพอเขาถงฐานขอมลโดยตรง และอาจใหบรการแก networking middleware
JDBC DRIVER TYPES
11
JDBC PSEUDOCODE
การโปรแกรมกบ JDBC จะตองมขนตอนดงตอไปน :1) โหลด JDBC driver
2) ระบชอและต าแหนงของระบบฐานขอมลทตองการใช
3) เชอมตอเขากบระบบฐานขอมลโดยอาศย Connection object
4) ประมวลผลชดค าสง SQL query โดยใช Statement object
5) รบคาผลลพธจากการท างานในรปของ ResultSet object
6) สนสดการท างานโดยการปด ResultSet, Statement และ Connection objects
12
PSEUDO CODE AS A DIAGRAM
DriveManager
Connection Statement ResultSet
createscreates creates
Driver
SQL
SQL
data
data
make linkto driver
13
WHAT YOU EXPECT IN DB API
1. Open a Connection
2. Send a statement
3. Retrieve results
4. Close a connection 1. Create a connection Session
2. Execute statement
3. Send results
4. Close the session
Java Application
DBMS Engine
Java DB API
14
Java Application
JDBC Manager
JDBC Drivers
JDBC API
JDBC Driver API
Data Sources
Grey Area
BIG PICTURE
15
CallableStatement
<<Interface>>
Statement
<<Interface>>
DriverManager
<<Singleton>>
PreparedStatement
<<Interface>>
Connection
<<Interface>>
ResultSet
<<Interface>>
ResultSetMetaData
<<Interface>>DatabaseMetaData
<<Interface>>
JDBC INTERFACE CLASSES
java.sql.* ไดจดเตรยมคลาสไวส าหรบใชงานรวมกบฐานขอมลดงน
16
JDBC OBJECT CLASSES
DriverManager• ใชส าหรบการโหลด หรอ เลอก drivers
Driver• ใชส าหรบการตดตอกบระบบฐานขอมล
Connection• เปนชดค าสงของ SQL statements ทใชกบ DB
Statement• เปนค าสงเดยวของ SQL statement
ResultSet• records ทคนมาจากการท างานของ SQL Statement
17
THE JDBC STEPS
1. Importing Packages
2. ตดตง JDBC Drivers
3. เปด Connection ไปยงฐานขอมล
4. สราง Statement Object
5. ประมวลผล Query และคนคาในรปของ Result Set Object
6. โปรเซส Result Set
7. ปดการท างานของ Result Set และ Statement Objects
8. ปดการ Connection
18
CONNECTING TO DATABASE WITH JDBC
19
LOADING THE DATABASE DRIVER
Class.forName(driverName).newInstance();
driverName เปนชอของแพคเกจและคลาสของ driver เชน Class.forName("jdbc.SimpleText.SimpleTextDriver").newInstance();
ต าแหนงของฐานขอมลจะถกระบโดย URL ตามรปแบบดงตอไปน: < protocol>:< subprotocol>:< subname>
ในกรณทมการตดตง Data Source ไวเรยบรอยแลว การโหลด driver ของระบบฐานขอมลท าไดโดย explicitlyClass.forName(dbDriverClassName);
20
jdbc:odbc : // host.domain.com: 1511 /data/file
The commsprotocol
The machineholding the database.
The portused for the connection.
The path tothe databaseon the machine
e.g. jdbc:odbc:Books
ODBC DATABASE URL
21
ESTABLISHING A CONNECTION
เมอ Driver ถกโหลดและ URL ถกสรางขน ขนตอนตอไปจะเปนการ connect ไปยงระบบฐานขอมลทถกระบภายใน URL โดยใชเมธอด getConnection() จากคลาส DriverManager
การสราง connection จะท าไดดงตอไปนConnection conn =
DriverManager.getConnection(dbUrl, dbUser, dbPass);
dbUrl เปนคาทถกระบโดย vendor แตโดยปกตจะท าการระบดงน :jdbc:driverName://host:port/databaseName
พารามเตอรตวแรกจะเปน URL ทถกสรางขน
พารามเตอรตวถดมาจะเปน Properties object ทมคา configuration ส าหรบระบบฐานขอมล เชน date format หรอต าแหนงของ tables
22
CONNECTION
ออปเจคทคนคาจากเมธอด getConnection() จะเปน Connection object ทใชส าหรบฐานขอมลทใชส าหรบการสงค าสง SQL queries หรอใชในการ updates ฐานขอมล
ในกรณทเกดความผดพลาดจะ Throws java.sql.SQLException
Connection เปนการน าเสนอ session รวมกบฐานขอมลทถกระบ
ภายใน context ของ Connection สวนทเปน SQL statements จะถกประมวลผลและคนคาผลลพธออกมา
นอกจากนนยงจดเตรยม “metadata” -- ขอมลทเกยวกบ database, tables, และ fields
รวมไปถงวธการทใชรวมกบ transactions
23
OBTAINING A CONNECTION
String url = "jdbc:mysql://localhost:3306/MyDB?characterEncoding=UTF-8";
String uname = "root";
String pwd = "itmju";
Connection con;
try {
Class.forName("com.mysql.jdbc.Driver");
con = DriverManager.getConnection(url,uname,pwd);
} catch (ClassNotFoundException e) {
e.printStackTrace();
} catch (SQLException e) {
e.printStackTrace();
} 24
STATEMENT
เมอท าการสราง Connection เรยบรอยแลว ผใชสามารถใชค าสง SQL ในการสงงาน โดยผานStatement objects ซงใน JDBC จะแบงออกเปนสามชนด:• Statement
ใชส าหรบน าเสนอค าสง SQL แบบพนฐาน• PreparedStatement
น าเสนอค าสง SQL ทถกคอมไพลไวแลว ซงจะชวยเพมประสทธภาพในการท างานไดเรวขน• CallableStatement
ยอมให JDBC programs สามารถเขาถง stored procedures ภายในฐานขอมลไดอยางสมบรณ
25
STATEMENT CLASS
ออปเจคของคลาส Statement จะรบคาพารามเตอรในรปของ string ทมค าสง SQL ทใชในการประมวลผล
Statement จะถกสรางขนโดยการเรยกใชเมธอด createStatement() จากคลาส Connection ซงจะคนคาในรปของ Statement object
ค าสง SQL จะถกประมวลผลโดยสราง string ของ SQL ทตองการและผานในรปของพารามเตอรไปยงเมธอดของ Statement ซงจะสงผานไปยงฐานขอมลและคนคาผลลพธตอไป
เมธอดของ Statement ทสามารถใชในการประมวลผล SQL statement ในรปของ string จะมสามแบบ คอ: • ResultSet executeQuery(String)• int executeUpdate(String)• boolean execute(String)
26
STATEMENT OBJECT
Statement object ถกใชส าหรบการประมวลผลในรปของ static SQL statement และรบคาผลลพธทถกสรางขน
ResultSet executeQuery(String)
ประมวลผล SQL statement ทคนคาในรปของ ResultSet เดยว
int executeUpdate(String)
ในกรณทไมตองการคนคาจากการใชค าสง SQL Statement ไดจดเตรยมเมธอดexecuteUpdate( ) ไว โดยใชกบค าสงประเภท UPDATE และ DELETE
เมธอด executeUpdate( ) จะคนคา integer ซงแสดงถงจ านวนแถวในฐานขอมลทเกยวของ
27
STATEMENT OBJECT
boolean execute(String) • ในกรณทไมทราบวา SQL statement จะคนคาอะไรออกมา อาจใชเมธอด execute( ) ได
เมธอดนจะคนคา true หากมผลลพธทเกยวของกบ statement นน ๆ
การรบคา Statement object สามารถท าไดโดยการเรยกใชเมธอด createStatement() ของConnection:
Statement stmt = con.createStatement();
28
SAMPLE DATABASE
Employee ID Last Name First Name
1 Davolio Nancy
2 Fuller Andrew
3 Leverling Janet
4 Peacock Margaret
5 BuchananSteven
Connection con = DriverManager.getConnection(url,"alex", "8675309");
Statement st = con.createStatement();
ResultSet results = st.executeQuery("SELECT EmployeeID, LastName, FirstName FROM Employees");
29
การใชงาน STATEMENT OBJECT
เมอสราง Statement เสรจแลว ขนตอนตอไปจะเปนการประมวลผลค าสง SQL ซง statement สามารถจะอยในรปของ query ทคนคาผลลพธหรอการท างานท manipulates ในฐานขอมล ในกรณทใชการ query จะเรยกใชเมธอด executeQuery( ) ของ Statement object เชนResultSet rs = stmt.executeQuery("SELECT * FROM CUSTOMERS");
ResultSet object จะเกบคาผลลพธทไดจากการ query
30
RESULTSET OBJECT
Statement stmt = dbCon.createStatement();
String sql = "select * from " + table;
ResultSet rs = stmt.executeQuery(sql);
ขอมลภายในตารางสามารถน าเสนอผาน result set ซงจะถกสรางขนจากการประมวลผลของqueries
มเพยง 1 ResultSet ตอ Statement ทสามารถเปดขนไดในครงหนง ๆ
โดย default แลว ResultSet object จะไมสามารถท าการ update ได และ cursor จะเลอนต าแหนงไปไดเฉพาะการเดนหนาเทานน ดงนนจงสามารถเลอนต าแหนงจากแถวแรกไปยงแถวสดทายไดเพยงครงเดยว
31
RESULTSET
การท างานของ ResultSet object จะท าไดโดยการ maintains ต าแหนงของ cursor ทชไปยงแถวปจจบนของขอมล โดยคาเรมตนจะชไปยงต าแหนงกอนหนาของขอมลแถวแรก และเลอนต าแหนงไปไดโดยการเรยกใชเมธอด next() ดงนนจงสามารถใชรวมกบ while loop เพอน าเสนอผลลพธแบบตอเนองได
23
5
17
98
John
Mark
Paul
Peter
cursor
32
ACCESSING COLUMN DATA
การคนหา Rows โดยอาศยเมธอด executeQuery() จะมการคนคาออปเจคทม type เปน ResultSet
Rows ทถกรบคาจาก ResultSet สามารถใชการท างานแบบ iteration ผานลงไปในแตละ rows และอานขอมลในแตละคอลมนออกมา
การ Iteration แตละ rows จะท างานเชนเดยวกบการ iterating ผาน elements ในรปของEnumeration object ในการรบคา row แรกภายใน ResultSet จะสามารถท าไดโดยการเรยกใชเมธอดnext()
• boolean next()
• เมธอดคนคา false ในกรณทไมมขอมลอกตอไป เชน :
while(rs.next()){// process the row;
}
33
PROCESS RESULTSET
เมอเรมตนท างานกบ ResultSet ต าแหนงของ cursor จะอยในต าแหนงกอนแถวแรกของผลลพธ นนกหมายความวาการเรยกใชเมธอด next( ) ครงแรกจะเปนการเขาถงแถวแรก
แตละคอลมนอาจประกอบไปดวยชนดของขอมลทแตกตางกน การใช ResultSet เมธอดจงจ าเปนตองมการก าหนด datatype ใหถกตอง
เมธอดประเภททชอขนตนดวย getXXX() จะใชส าหรบการรบคาในรปของ เรคคอรดปจจบน เชน• การรบคา column ดวยคาแบบ integer จะตองใชเมธอด
getInt(int column)
• ขณะทการรบคา column ทเปน string จะใชเมธอด
getString(int column)
34
USING THE RESULTSET OBJECT
เมธอด getXXX( ) จะคนคาชนดขอมลทก าหนด รปแบบของเมธอดประเภทนจะแบงออกไดเปนสองลกษณะ ตามการรบคาพารามเตอร คอ• แบบรบคา case-insensitive ในรปชอของ column ทตองการอานคา (e.g., "PHONE",
"CUSTOMER_ID") • แบบรบคา column indexes ซงจะเรมตงแต 1 ถง n columns.
ResultSet rs = stmt.getResultSet();
while (rs.next()) {
writer.print(rs.getLong("ID"));
writer.print(rs.getString("Name"));
writer.print(rs.getDouble(5));
}
35
EXAMPLE OF ACCESSING COLUMNS WITHIN ROWS:
Statement stmt = dbCon.createStatement();
String sql = "select * from " + table;
ResultSet rs = stmt.executeQuery(sql);
while (rs.next()) {
String name = rs.getString(1);
int age = rs.getInt(2);
System.out.println(name + " " + age);
}
rs.close();
36
RESULTSET METHODS
String getString(int columnIndex)
boolean getBoolean(int columnIndex)
byte getByte(int columnIndex)
short getShort(int columnIndex)
int getInt(int columnIndex)
long getLong(int columnIndex)
float getFloat(int columnIndex)
double getDouble(int columnIndex)
Date getDate(int columnIndex)
Time getTime(int columnIndex)
Timestamp getTimestamp(int columnIndex)
37
RESULTSET METHODS
Type getType(int columnIndex)• คนคา the given field as the given type เรมตนท 1 (not 0)
Type getType(String columnName)• same, but uses name of field
int findColumn(String columnName)• looks up column index given column name
void close() • ใชส าหรบการ disposes ของ ResultSet• ยอมใหผใชสามารถ re-use Statement ทถกสรางขนไวแลว• ถกเรยกใชไดโดยอตโนมตจากเมธอดสวนใหญของ Statement
38
EXECUTEXXX() LIMITATION
ขอส าคญทตองระลกไวเสมอคอ Statement object จะน าเสนอขอมลจากการประมวลผลค าสง SQL ไดเพยงค าสงเดยว
การเรยกใชเมธอด executeQuery( ) executeUpdate( ) หรอ execute( ) จะมผลท าใหสนสดการท างานของ ResultSet ทเกยวของกบค าสงปจจบน ดงนนกอนการเรยกใชเมธอดเหลานจะตองแนใจไดวาการท างานกบผลลพธเสรจสนสมบรณแลว กอนการประมวลผลของ query ดวย Statement object เดม
ในกรณทจ าเปนตองมการประมวลผล query มากกวาหนงครง จ าเปนจะตองใช multiple Statement objects
39
RESULTS
ขอมลในระบบฐานขอมลNAME CUSTOMER_ID PHONE----------------------------------------------------------------------Jane Markham 1 617 555-1212Louis Smith 2 617 555-1213Woodrow Lang 3 508 555-7171Dr. John Smith 4 615 428-1239
ผลลพธทตองการ :Customer #1, Jane Markham, is at 617 555-1212
Customer #2, Louis Smith, is at 617 555-1213Customer #3, Woodrow Lang, is at 508 555-7171Customer #4, Dr. John Smith, is at 615 428-1239
40
PROCESS RESULTSET
เมอมการประมวลผล SQL ผลลพธทไดจะเปนไปตามเงอนไขทก าหนดอยใน query เสมอStatement stmt = con.createStatement();
ResultSet rs = stmt.executeQuery( "SELECT NAME, CUSTOMER_ID, PHONE
FROM CUSTOMERS");
while(rs.next()) {
System.out.print("Customer #" + rs.getString("CUSTOMER_ID"));
System.out.print(", " + rs.getString("NAME"));
System.out.println(", is at " + rs.getString("PHONE"));
}
rs.close();
stmt.close();
41
SELECT EXAMPLE
Connection con = DriverManager.getConnection(url, "alex", "8675309");
Statement st = con.createStatement();
ResultSet results = st.executeQuery("SELECT EmployeeID, LastName,
FirstName FROM Employees");
while (results.next()) {
int id = results.getInt(1);
String last = results.getString(2);
String first = results.getString(3);
System.out.println("" + id + ": " + first + " " + last);
}
st.close();
con.close(); 42
MAPPING JAVA TYPES TO SQL TYPES
SQL type Java Type
CHAR, VARCHAR, LONGVARCHAR String
NUMERIC, DECIMAL java.math.BigDecimal
BIT boolean
TINYINT byte
SMALLINT short
INTEGER int
BIGINT long
REAL float
FLOAT, DOUBLE double
BINARY, VARBINARY, LONGVARBINARY byte[]
DATE java.sql.Date
TIME java.sql.Time
TIMESTAMP java.sql.Timestamp43
JDBC EXAMPLE
String DB_URL = "jdbc:mysql://localhost/students"; //students คอชอฐานขอมล
String DB_USER = "";
String DB_PASSWORD= "";
Connection conn;
Statement stmt;
String query = "select * from Student";
try {
Class.forName("com.mysql.jdbc.Driver");
conn = DriverManager.getConnection(DB_URL, DB_USER, DB_PASSWORD);
stmt = conn.createStatement();
ResultSet result = stmt.executeQuery(query);
while(result.next()){
out.println(result.getString(1));
out.println(result.getString(2));
out.println(result.getString(3));
}
44
JDBC EXAMPLE
result.close();
stmt.close();
conn.close();
} catch(Exception e){
e.printStackTrace();
}
45
PREPAREDSTATEMENT CLASS
ออปเจคของคลาส PreparedStatement จะรบคาพารามเตอรในรปของ string ทมค าสง SQL ทใชในการประมวลผล
Statement จะถกสรางขนโดยการเรยกใชเมธอด prepareStatement(sql) จากคลาสConnection ซงจะคนคาในรปของ PreparedStatement object
ค าสง SQL จะถกประมวลผลโดยสราง string ของ SQL ทตองการและผานในรปของพารามเตอรไปยงเมธอดของ PreparedStatement ซงจะสงผานไปยงฐานขอมลและคนคาผลลพธตอไป
เมธอดของ PreparedStatement ทสามารถใชในการประมวลผล SQL statement ในรปของ string จะมสองแบบ คอ: • ResultSet executeQuery()• ResultSet executeQuery(String)
46
SAMPLE DATABASE
Employee ID Last Name First Name
1 Davolio Nancy
2 Fuller Andrew
3 Leverling Janet
4 Peacock Margaret
5 Buchanan Steven
Connection con = DriverManager.getConnection(url,"alex", "8675309");
String sql = "SELECT EmployeeID, LastName, FirstName FROM Employees";
PreparedStatement stmt = con.prepareStatement(sql);
ResultSet rs = stmt.executeQuery();
เหมาะส าหรบค าสง Select ทไมมเงอนไข Where หรอ Having
47
CALLABLESTATEMENT CLASS
ออปเจคของคลาส CallableStatement จะรบคาพารามเตอรในรปของ string ทมค าสงในการเรยกใช stored procedure หรอ function ในฐานขอมล
Statement จะถกสรางขนโดยการเรยกใชเมธอด
prepareCall({call stored procedure{parameter,?,?,?}}) จากคลาส Connection ซงจะคนคาในรปของ CallableStatement object
เมธอดของ CallableStatement ทสามารถใชในการประมวลผลในรปของ string จะมหลายแบบ แตจะยกตวอยางเพยง สองแบบคอ• boolean execute()
• boolean execute(String sql)
48
CALLABLESTATEMENT CLASS
กรณทมการสง parameter เขาไปใน stored procedure สามารถเรยกใชเมธอด setXXX(index, value) เขาไปไดเชน• stmt.setInt(1, 200);
• stmt.setString(2,"Sayan Unankard");
โดย index เรมทต าแหนงท 1 เสมอ
49
STORED PROCEDURE DATABASE : MYSQL
DELIMITER $$
CREATE PROCEDURE insertEmployee (IN empid INT, IN empname VARCHAR(30),
IN salary FLOAT, IN deptid INT )
BEGIN
INSERT INTO Employee VALUES(empid,empname,salary,deptid);
END$$
DELIMITER ;
Connection con = DriverManager.getConnection(url,"alex", "8675309");
CallableStatement cstmt = con.prepareCall("{call insertEmployee(?,?,?,?)}");
cstmt.setInt(1, 300);
cstmt.setString(2, "sayan unankard");
cstmt.setDouble(3, 25000.00);
cstmt.setInt(4, 1);
cstmt.execute();
con.close;50