Tải bản đầy đủ (.pdf) (50 trang)

chapter 5 jdbc lập trình java

Bạn đang xem bản rút gọn của tài liệu. Xem và tải ngay bản đầy đủ của tài liệu tại đây (980.84 KB, 50 trang )

<span class="text_page_counter">Trang 1</span><div class="page_container" data-page="1">

<b>LẬP TRÌNH JAVA</b>

<b><small>Giảng viên: Tạ Việt Phương</small></b>

<b>Ch 5. JDBC</b>

</div><span class="text_page_counter">Trang 2</span><div class="page_container" data-page="2">

<b>Nội dung</b>

➢Giới thiệu JDBC

<small>2</small>

</div><span class="text_page_counter">Trang 3</span><div class="page_container" data-page="3">

<b>Giới thiệu</b>

JDBC: Java DataBase Connectivity

Là Java API (Application Programming Interface) chứa tập hợp các class và interface hỗ trợ xây dựng các ứng dụng Java truy cập đến các CSDL khác

nhau (Access, SQL Server, MySQL, Oracle, …)

</div><span class="text_page_counter">Trang 4</span><div class="page_container" data-page="4">

<b>Khái niệm</b>

JDBC hỗ trợ việc truy cập CSDL để thực hiện các tác vụ xử lý (truy vấn, thêm, xóa, sửa, cập nhật)

o

Tạo kết nối đến Database

o

Tạo câu lệnh truy vấn SQL

o

Thực thi các câu lệnh SQL

o

Truy vấn, hiển thị và xử lý dữ liệu trả về

Bao gồm 2 gói thư viện chính:

o

java.sql.*: chứa các lớp và giao diện cơ sở

o

javax.sql.*: chứa các lớp và giao diện mở rộng

</div><span class="text_page_counter">Trang 5</span><div class="page_container" data-page="5">

<b>Kiến trúc JDBC</b>

</div><span class="text_page_counter">Trang 6</span><div class="page_container" data-page="6">

<b>Kiến trúc JDBC (tt)</b>

➢<b>JDBC API</b>: Tập hợp các interface cung cấp trực tiếp cho ứng dụng để thao tác với JDBC

➢<b>DriverManager</b>: quản lý các trình điều khiển JDBC được coi là xương sống của JDBC. Là một class

giúp kết nối giữa Java Application đến các JDBC Driver.

➢<b>JDBC Driver</b>: là thành phần chính giao tiếp trực tiếp với CSDL

</div><span class="text_page_counter">Trang 7</span><div class="page_container" data-page="7">

<b>JDBC DRIVERS</b>

Sun cung cấp đặc tả là các JDBC interface (Connection, PreparedStatement, Statement, ResultSet, …). Tập hợp các class hiện thực các JDBC interface đối với một database engine cụ thể được gọi là JDBC driver.

Do các hãng xây dựng DBMS hoặc một đơn vị thứ 3

</div><span class="text_page_counter">Trang 8</span><div class="page_container" data-page="8">

o <b>Loại 2</b>: Native API

o <b>Loại 3</b>: Network Protocol

o <b>Loại 4</b>: Native Protocol

Loại 1vàLoại 4được sử dụng phổbiến nhất

</div><span class="text_page_counter">Trang 9</span><div class="page_container" data-page="9">

<b>Loại 1: JDBC ODBC </b>

<small>oCác trình điều khiển cầu nốiJDBC- ODBC.</small>

<small>oỦy nhiệm công việc truy xuất dữ liệu cho ODBC API</small>

<small>oSUN cung cấp một phần mềm trình điều khiển JDBC/ODBC.</small>

</div><span class="text_page_counter">Trang 10</span><div class="page_container" data-page="10">

<b>Loại 2: NATIVE API </b>

o Chuyển lệnh gọi JDBC thành lệnh gọi API trên máy client của CSDL

o <b>Java chuyển lệnh JDBC thànhlệnh chuẩn của DBMS</b>

o Phụ thuộc nền tảng sử dụng

o Nâng cao hiệu quả thực hiện kết nối

o <b>Ưu điểm: tốt hơn </b>

o <b>Hạn chế: Driver Type-2 và thư </b>

viện Client-side của database cần cài đặt trên máy client.

</div><span class="text_page_counter">Trang 11</span><div class="page_container" data-page="11">

<b>Loại 3: NETWORK PROTOCOL </b>

o Được viết thuần bằng Java và sử dụng giao thức Net độc lập nhà sản xuất để tru y cập đến trình theo dõi

o Hỗ trợ việc kết nối nhiều ứng dụng với nhiều CSDL khác nhau

o <b>Ưu điểm</b>: có thể kết nối đến nhiều hệ quản trị CSDL khác nhau mà

</div><span class="text_page_counter">Trang 12</span><div class="page_container" data-page="12">

<b>Loại 4: NATIVE PROTOCOL </b>

o Được viết thuần túy bằng Java, là loại hiệu quả nhất.

o Kết nối trực tiếp vào CSDL o Các drivers được hỗ trợ

bởi các provider DBMS o <b>Ưu điểm:</b>

• Nâng cao hiệu quả khi thực thi

• Độc lập platform

o <b>Nhược điểm : </b> đòi hỏi có driver cho từng loại CSDL

</div><span class="text_page_counter">Trang 13</span><div class="page_container" data-page="13">

<b>JDBC DRIVERS</b>

</div><span class="text_page_counter">Trang 14</span><div class="page_container" data-page="14">

<b>JDBC Interface </b>

➢ Class và Interface của JDBC API thuộc gói java.sql

➢ <b>DriverManager:</b> dùng để nạp các driver và tạo Connection đến cơ sở dữ liệu.

➢ <b>Driver</b>: Driver của cơ sở dữ liệu, mỗi JDBC Driver đều cài đặt lại Interface này.

➢ <b>Connection</b> : thiết lập một Connection đến cơ sở dữ liệu và cho phép tạo các Statement .

➢ <b>Statement</b>: gắn kết với một connection đến cơ sở dữ liệu và cho phép thực thi các câu lệnh SQL.

➢ <b>PreparedStatement</b>: tương tự như Statement nhưng thực thi câu lệnh SQL được biên dịch trước (Precompiled SQL) và có truyền tham số

</div><span class="text_page_counter">Trang 15</span><div class="page_container" data-page="15">

<b>JDBC Interface (tt)</b>

➢ <b>ResultSet</b>: Cung cấp thông tin rút trích từ cơ sở dữ liệu, cho phép truy x́t các dịng dữ liệu.

➢ <b>ResultSetMetaData</b>: Cung cấp các thơng tin như kiểu dữ liệu và các thuộc tính trong Resultset.

➢ <b>DatabaseMetaData</b>: Cung cấp các thông tin của cơ sở dữ liệu kết nối.

➢ <b>SQLException</b>: Cung cấp thông tin các ngoại lệ xảy ra khi tương tác với cơ sở dữ liệu.

</div><span class="text_page_counter">Trang 16</span><div class="page_container" data-page="16">

<b>CÁC BƯỚC SỬ DỤNG JDBC</b>

➢Đăng ký <b>driver </b>của JDBC (Load driver) ➢Xác định các thông số CSDL – DB kết nối ➢Tạo kết nối <b>CSDL</b>

➢Tạo lệnh <b><sub>SQL </sub></b>cần thực thi ➢Thực thi lệnh

➢Xử lý kết quả trả về➢Đóng <b>Connection</b>

</div><span class="text_page_counter">Trang 17</span><div class="page_container" data-page="17">

<b>CÁC BƯỚC SỬ DỤNG JDBC</b>

</div><span class="text_page_counter">Trang 18</span><div class="page_container" data-page="18">

<b>Đăng ký driver (LOAD DRIVER)</b>

➢ Driver là phần mềm hỗ trợ giao tiếp.

➢ JDBC driver là Java class thực hiện chuyển đổi các lệnh Java thành câu lệnh SQL tương ứng.

➢ Load driver là tạo các instance hỗ trợ liên kết và đăng ký

</div><span class="text_page_counter">Trang 19</span><div class="page_container" data-page="19">

<b>Đăng ký driver (LOAD DRIVER) </b>

➢VD khi dùng MySQL

</div><span class="text_page_counter">Trang 20</span><div class="page_container" data-page="20">

<b>Đăng ký driver (LOAD DRIVER) </b>

</div><span class="text_page_counter">Trang 21</span><div class="page_container" data-page="21">

<b>Đăng ký driver (LOAD DRIVER) </b>

<small>Driver được cài đặt trong JAR file.</small>

<small>JAR phải được khai báo trong classpath:</small>

1. Thêm jar file to vào IDE project

2. Thêm JAR file vào CLASSPATH

</div><span class="text_page_counter">Trang 24</span><div class="page_container" data-page="24">

<b>Tạo kết nối đến CSDL</b>

Phương thức getConnection() của lớp

DriverManager dung để thiết lập kết nối với database

</div><span class="text_page_counter">Trang 25</span><div class="page_container" data-page="25">

<b>Ví dụ Load Driver và tạo kết nối</b>

<small>conn = DriverManager.getConnection(url); </small>

<small>System.out.println("Connected to the database"); return true;</small>

</div><span class="text_page_counter">Trang 26</span><div class="page_container" data-page="26">

<b>Tạo kết nối SQL Server</b>

<small>StringuserName = "hung";Stringpassword = "12345";</small>

➢ Tạo kết nối trong SQL Server

<small>Class.forName("com.microsoft.sqlserver.jdbc</small>

</div><span class="text_page_counter">Trang 27</span><div class="page_container" data-page="27">

<b>Tạo câu lệnh thực thi </b>

o Statement statement = connection.createStatement() ;

o ResultSet executeQuery (String sql) o int executeUpdate (String sql)

o boolean execute (String sql)

</div><span class="text_page_counter">Trang 28</span><div class="page_container" data-page="28">

<b>Tạo câu lệnh thực thi </b>

String SQL = "SELECT * FROM hocsinh"; Statement stat = con.createStatement(); o Có 03 loại Statement

</div><span class="text_page_counter">Trang 29</span><div class="page_container" data-page="29">

<b>Thực thi lệnh </b>

o executeQuery() đối với câu lệnh truy vấn

<small>String strSQL = “Select * From Registration”; ResultSet rs = stat.executeQuery(strSQL);</small>

o executeUpdate():đối câu lệnh <b>Insert</b>, <b>Update </b>và <b>Delete</b>

<small>String strSQL = “Insert into RegistrationValues(“Aptech”, “Aptech”);</small>

<small>int nRow = stat .executeUpdate(strSQL);</small>

o execute() dùng để tạo và xóa đối tượng như table

</div><span class="text_page_counter">Trang 30</span><div class="page_container" data-page="30">

<b>Xử lý kết quả trả về và đóng kết nối </b>

➢<b>Xử lý kết quả</b>

<small>o</small><b>Sử dụng ResultSet nhận kết quả trả về</b>

<small>o</small><b>Sử dụng phương thức getXxx (số thứ tự/ hay tên field) của ResultSet để lấy giá trị của field</b>

<b><small>Số thứ tự bắt đầu từ 1</small></b>

<small>Xxx tương ứng với loại dữ liệu của field•</small> <i><b><small>getInt(): lấy về giá trị int từ dịng hiện hành.</small></b></i>

<small>•</small> <i><b><small>getString(): lấy về giá trị String từ dịng hiện hành.</small></b></i>

<small>•</small> <i><b><small>getDate(): lấy về giá trị Date từ dịng hiện hành.</small></b></i>

<small>•</small> <i><b><small>getFloat(): lấy về giá trị float từ dịng hiện hành.</small></b></i>

<small>•</small> <i><b><small>getObject(): lấy về giá trị từ dòng hiện hành và xem giá trị </small></b></i>

<b><small>này như là 1 object.</small></b>

o <b>Sử dụng phương thức next() của ResultSet để duyệt lần</b>

lượt các record

</div><span class="text_page_counter">Trang 31</span><div class="page_container" data-page="31">

o <b>Resultset 2 chiều hỗ trợ các phương thức truy cập như: </b>

first, isFirst, last, ..

</div><span class="text_page_counter">Trang 32</span><div class="page_container" data-page="32">

<b>Xử lý kết quả trả về và đóng kết nối </b>

<small>Đóng đối tượng </small><i><b><small>Connection</small></b></i><small>, thì đối tượng </small><i><b><small>Statement </small></b></i><small>và</small>

<i><b><small>ResultSet </small></b></i><small>sẽ tự động đóng</small>

<small>Nên đóng connection sau khi hoàn tấtConnection connection = </small>

<small>DriverManager.getConnection(...); </small>

<small>/* use the database */ </small>

<small>... /* done using database */ </small>

<small>public void close( ) { </small>

<small>if ( connection == null ) return; try { connection.close(); } </small>

<small>catch ( SQLException sqle ) { /* ignore it */ }finally { connection = null; }}</small>

</div><span class="text_page_counter">Trang 33</span><div class="page_container" data-page="33">

<b>Làm việc với ResultSet & Cursor</b>

<b>ResultSet chứa các "rows" thỏa hay trả về từ câu query.Là </b>

<b>đối tượng dạng bảng trong RAM, có gắn với Cursor.</b>

<b>Cursor được sinh ra khi một ResultSet được sinh ra.</b>

<b>Cursor cho phép chúng ta có thể xử lý một ResultSet từ </b>

trên xuống dưới hoặc từ dưới lên (theo cả 2 hướng) hoặc đi đến 1 dòng chỉ định nào đó.

</div><span class="text_page_counter">Trang 34</span><div class="page_container" data-page="34">

<b>Làm việc với ResultSet & Cursor</b>

<b><small>ResultSet hỗ trợ các phương thức để lấy dữ liệu từ cột:</small></b>

<small>"get" by column number -- starts at 1 (not 0)!</small>

<small>"get" by column name -- field names in table/query</small>

<b><small>String query = "SELECT * FROM Country WHERE ...";ResultSet rs = statement.executeQuery( query );</small></b>

<b><small>// go to first row of results</small></b>

</div><span class="text_page_counter">Trang 35</span><div class="page_container" data-page="35">

<b>Làm việc với ResultSet & Cursor</b>

<small>ResultSet hỗ trợ các phương thức để lấy từng dòng và cột </small>

<small>getInt( name: String ) getInt( index: int ) ...</small>

<small>go to next row of results. "false" if no more. go to previous row. "false" if 1st result. go to first row of results.</small>

<small>go to last row of results.go to k-th row of results.get int value of field "name"</small>

<small>get int value of k-th column in a record </small>

</div><span class="text_page_counter">Trang 36</span><div class="page_container" data-page="36">

<b>Làm việc với ResultSet & Cursor</b>

<small>Các phương thức get(…) trả về dữ liệu cột: </small>

<small>getLong(3): get by column index (most efficient) </small>

<small>getLong("population"): get by field name (safest)</small>

<small>getInt( ), getLong( ) - get Integer field valuegetFloat( ), getDouble()</small> <sup>- get floating pt. value</sup>

<small>getString( ) getDate( ) </small> <sup>- get Char or Varchar field value- get </sup> <small>Date or Timestamp field value</small>

<small>getBoolean( )</small> <sup>- get a Bit field value</sup> <small>getBytes( ) - get Binary data</small>

<small>getBigDecimal( )</small> <sup>- get Decimal field as BigDecimal</sup>

<small>getBlob( ) getObject( ) </small> <sup>- get Binary Large Object- get any field </sup> <small>value</small>

</div><span class="text_page_counter">Trang 37</span><div class="page_container" data-page="37">

<b>Đối tuợng PreparedStatement</b>

<i><b>PreparedStatement kế thừa từ Statement.</b></i>

Thường được dùng với các câu lệnh SQL có tham số. Thay vì thực thi đối tượng Statement nhiều lần, có thể

<i><b>dung PreparedStatement.</b></i>

<i><b>Đối tượng PreparedStatement chứa 1 câu lệnh SQL đã </b></i>

được biên dịch trước khi gởi đến DBMS, khác với

</div><span class="text_page_counter">Trang 38</span><div class="page_container" data-page="38">

<b>Đối tuợng PreparedStatement</b>

<small>String sql = "INSERT INTO user_info (name, address) VALUES (?, ?);";</small>

<small>List<User> listUser = new ArrayList<User>();listUser.add(new User("Harry", "England"));listUser.add(new User("Batman", "USA"));</small>

</div><span class="text_page_counter">Trang 39</span><div class="page_container" data-page="39">

<small>String SQL = "SELECT * FROM hocsinh"; Statement stat = conn.createStatement(); ResultSet rs = stat.executeQuery(SQL); </small>

</div><span class="text_page_counter">Trang 40</span><div class="page_container" data-page="40">

<small>String SQL1="INSERT hocsinh VALUES(‘Nguyen Van A')";</small>

<small>Statement stat1 = conn.createStatement(); stat1.executeUpdate(SQL1);</small>

</div><span class="text_page_counter">Trang 41</span><div class="page_container" data-page="41">

<b>Delete một dòng</b>

➢ <b>Xóa một dòng thỏa mãn điều kiện trong bảng</b>

<small>Statement st = con.createStatement();</small>

<small>String sql = "DELETE FROM hocsinh WHERE ten = </small>

</div><span class="text_page_counter">Trang 42</span><div class="page_container" data-page="42">

<b>Delete tất cả các dòng</b>

<small>Statement st = con.createStatement(); String sql = "DELETE FROM hocsinh"; int delete = st.executeUpdate(sql); if(delete == 0){</small>

<small>System.out.println("All rows are completel ly deleted!");</small>

<small>}</small>

</div><span class="text_page_counter">Trang 43</span><div class="page_container" data-page="43">

<b>Delete một bảng </b>

<small>Statement st = con.createStatement(); st.execute("DROP TABLE Employee1"); </small>

<small>System.out.println ("Table Deletion process iscompletly successfully!");</small>

</div><span class="text_page_counter">Trang 44</span><div class="page_container" data-page="44">

<b>Update </b>

➢ <b>Cập nhật dòng thỏa điều kiện dùng PrepareStatement</b>

<small>String sql = "UPDATE movies SET title = ? WHERE </small>

</div><span class="text_page_counter">Trang 45</span><div class="page_container" data-page="45">

<small>System.out.println("Enter table name:"); String table = bf.readLine();</small>

<small>ResultSet res = st.executeQuery("SELECT COUNT(*)FROM "+table); </small>

<small>int count=0;</small>

<small>while (res.next()){ </small>

</div><span class="text_page_counter">Trang 46</span><div class="page_container" data-page="46">

<i><small>(Trong đó tương ứng với mỗi dấu ? là 1 tham số của store procedure </small></i>

<i><small>đã tạo trong Database )</small></i>

<small>oTạo 1 thể hiện của interface CallableStatement thông qua phương</small>

<b><small>thức prepareCall() dựa trên đối tượng Connection</small></b>

<small>o</small> <b><small>Gọi phương thức executeQuery() để trả về kết quả là 1 ResultSet.</small></b>

<b><small>String strCall = "{call </small></b>

</div><span class="text_page_counter">Trang 47</span><div class="page_container" data-page="47">

<b><small>String strCall = "{call deleteAccount(?)}"; </small></b>

<b><small>CallableStatement caSt = con.prepareCall(strCall); caSt.setString(1, user);</small></b>

</div><span class="text_page_counter">Trang 48</span><div class="page_container" data-page="48">

<b>Sử dụng Transaction</b>

<small>Statement statement1= con.createStatement(); Statement statement2= con.createStatement(); </small>

</div><span class="text_page_counter">Trang 49</span><div class="page_container" data-page="49">

<small>Statement statement1= con.createStatement();Statement statement2= con.createStatement();</small>

</div><span class="text_page_counter">Trang 50</span><div class="page_container" data-page="50">

<b>Q & A </b>

<b><small>Giảng viên: Tạ Việt PhươngE-mail: </small></b>

</div>

×