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

chapter 5 hibernate 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 (670.2 KB, 45 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ươngE-mail: </small></b>

<b>Ch 5. (tt) Hibernate</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 Hibernate➢Cài đặt Hibernate

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

<small>Là hình thức kết nối trực tiếp CSDL (Connected Model)</small>

<small>Connect: tạo kết nối chương trình với Hệ quản trị </small>

<small>Nếu ứng dụng kết nối với nhiều hệ quản trị CSDL khác nhau, câu truy vấn có thể khác nhau trong mỗi hệ quản trị CSDL</small>

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

<b>ORM (Object Relational Mapping)</b>

CSDL thường được thiết kế theo mơ hình quan hệ. Tuy nhiên, hiện nay, phần mềm thường được thiết kế theo hướng đối tượng

Đối với lập trình viên khi xây dựng phần mềm

thường muốn làm việc với các đối tượng và không phải nhớ đến các dòng, các cột trong các bảng của cơ sở dữ liệu. ORM cho phép lấy dữ liệu từ CSDL quan hệ vào trong đối tượng

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

<b>ORM (tt)</b>

ORM (Object Relational Mapping) là một kỹ thuật lập trình cho phép ánh xạ cơ sở dữ liệu đến các đối

tượng thuộc ngơn ngữ lập trình hướng đối tượng chẳng hạn như C#, Java,… (các table tương ứng các class, mối ràng buộc giữa các table tương ứng quan hệ giữa các class ‘has a’ , ‘is a’).

<b><small>5</small></b>

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

<b>ORM (tt)</b>

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

<b>ORM (tt)</b>

ORM có đặc trưng cơ bản là gói gọn CSDL trong một object. Trong object, một phần là data, phần cịn lại đảm nhận cơng việc xử lý data để chuyển nó thành CSDL quan hệ.

<b><small>7</small></b>

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

<b>ORM (tt)</b>

Ưu điểm:

Tính độc lập: có thể dùng với nhiều RDBMS khác nhau thông qua cấu hình.

Tính đơn giản, dễ sử dụng: ORM cung cấp các API đơn giản và rất dễ sử dụng trong việc truy vấn, thêm, xóa, sửa dữ liệu

Tiết kiệm thời gian lập trình, dễ bảo trì, sửa chữa

Cơ chế ORM giúp người lập trình tập trung hơn

vào việc lập trình hướng đối tượng (OOP).

Hạn chế những lỗi ngữ pháp trong SQL.

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

<b>ORM (tt)</b>

Nhược điểm:

Tự động sinh ra các câu lệnh SQL nên sẽ khó có thể tác động vào để tối ưu câu lệnh.

Việc quản lý session khá phức tạp

Khi sử dụng ORM Framework, lập trình viên dễ bị rơi vào bẫy truy xuất dữ liệu quá nhiều (vì quá dễ để truy xuất), ảnh hưởng đến hiệu năng của hệ thống

Đối với những ai mới tìm hiểu về kỹ thuật ORM là gì sẽ gặp phải nhiều khó khăn trong q trình sử dụng.

<b><small>9</small></b>

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

<b>ORM với Hibernate</b>

Được phát triển bởi Gavin King năm 2001

JBoss chính thức phát triển Hibernate từ năm 2003

Là 1 ORM Framework: thực hiện mapping cơ sở dữ

liệu quan hệ sang các object trong ngôn ngữ hướng đối tượng.

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

<b>ORM với Hibernate (tt)</b>

Một ứng dụng có thể chia làm 3 phần: presentation layer, business layer, data layer

Business layer có thể chia thành 2 layer con:

Business logic layer (các tính tốn nhằm thỏa mãn yêu cầu người dùng)

Persistence layer chịu trách nhiệm giao tiếp với data layer (mở kết nối, truy xuất và lưu trữ dữ liệu vào CSDL)

Hibernate framework là một framework cho persistence layer

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

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

Kiến trúc Hibernate bao gồm nhiều đối tượng như đối tượng persistent, session factory, transaction factory, connection factory, session, transaction,...

Có 4 tầng trong kiến trúc hibernate đó là tầng ứng

dụng java, tầng hibernate framework, tầng backhand api và tầng database.

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

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

<b><small>13</small></b>

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

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

<small>Các thành phần trong kiến trúc Hibernate:</small>

<small>Đối tượng Configuration: bao gồm Database Connection (hibernate.properties và </small>

<small>hibernate.cfg.xml) và Class Mapping Setup - Thành phần này tạo ra kết nối giữa các lớp Java và các bảng cơ sở dữ liệu.</small>

<small>Đối tượng SessionFactory</small>

<small>Đối tượng Session</small>

<small>Đối tượng Transaction</small>

<small>Đối tượng Query</small>

<small>Đối tượng Criteria</small>

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

<b>Môi trường Hibernate</b>

Tải về phiên bản mới nhất của Hibernate từ tất cả các tập tin thư viện từ /lib vào

CLASSPATH, và thay đổi biến classpath để bao gồm tất cả các JARs.

Copy tập tin hibernate[x].jar vào CLASSPATH. Tập tin này nằm trong thư mục gốc của tiến trình cài đặt và là tệp JAR chính mà Hibernate cần để thực hiện cơng việc của nó.

<b><small>15</small></b>

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

<b>ORM với Hibernate (tt)</b>

Mỗi table trong database là một object trong

Hibernate. Cần có một java bean cho mỗi table trong database. Các java bean này sẽ có các

getters/setters và một số ngoại lệ theo quy ước của Hibernate.

Mỗi file mapping (ánh xạ) có dạng ***.hbm.xml có nhiệm vụ đặc tả mỗi quan hệ giữa các thuộc tính của đối tượng và các trường trong bảng CSDL (cột nào ứng với thuộc tính nào của class, kiểu giá trị là gì, quan hệ giữa các bảng chuyển thành quan hệ giữa các lớp ra sao…).

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

<b>ORM với Hibernate (tt)</b>

File Hibernate.cfg.xml : Đây là tập tin được load đầu tiên khi khởi chạy ứng dụng Hibernate. Nó chứa các thơng tin về kết nối (database kết nối là gì (MySQL, Oracle, SQL server…), username và password kết nối với database là gì, tên database được kết nối), driver kết nối…

<b><small>17</small></b>

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

Ánh xạ giữa các lớp Java đến các bảng trong CSDL dung các file XML

Cung cấp các API đơn giản để lưu trữ, truy xuất trực tiếp các đối tượng Java và CSDL.

Nếu có bất kỳ thay đổi nào trong CSDL thì chỉ cần thay đổi file XML.

Cung cấp đầy đủ các tiện ích, tính năng truy vấn dữ liệu đơn giản, hiệu quả.

Thao tác, xử lý được các quan hệ phức tạp của các đối tượng trong CSDL.

Giảm thiểu sự truy cập đến CSDL đến mức thấp nhất

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

HQL, Criteria Query, Native SQL

Hibernate Cache, Filter, Interceptor, Event

Hibernate Monitor

Hibernate Toolset

<b><small>19</small></b>

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

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

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

<b>Các bước sử dụng Hibernate</b>

Bước 1: Tạo cơ sở dữ liệu

Bước 2: Tạo file cấu hình hibernate.cfg.xml

Bước 3: Tạo các POJO (Lớp persistent)

Bước 4: Tạo các file mapping <POJO>.hbm.xml

Bước 5: Khai báo các file mapping vào

Bước 6: Xây dựng lớp HibernateUtil

Bước 7: Sử dụng

<b><small>21</small></b>

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

<b>Tạo cơ sở dữ liệu</b>

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

<b>Cấu hình hibernate.cfg.xml</b>

Được dùng đề khai báo cấu hình các thơng tin liên quan đến CSDL: url, driver_class, username,

password, pool_size, autocommit.

Khai báo nơi mà chứa file ánh xạ giữa các lớp thực thể tới các bảng trong CSDL

<b><small>23</small></b>

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

<b>Cấu hình hibernate.cfg.xml (tt)</b>

➢Các thuộc tính cấu hình cơ bản:

o <b>hibernate.dialect: Cho phép hibernate tối ưu hóa SQL cho </b>

thích hợp với CSDL quan hệ đặc biệt.

o <b>hibernate.connection.driver_class: lớp driver class.</b>

o <b>hibernate.connection.url: url để kết nối tới CSDL thông qua </b>

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

<b>Cấu hình hibernate.cfg.xml (tt)</b>

➢ <b>Loại hibernate.dialect: của một số CSDL phổ biến:</b>

<i><small>DB2: org.hibernate.dialect.DB2Dialect</small></i>

<i><small>Microsoft SQL Server 2005: org.hibernate.dialect.SQLServer2005Dialect Microsoft SQL Server 2008: org.hibernate.dialect.SQLServer2008Dialect </small></i>

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

<small><property name="hibernate.connection.username">root</property><property name="hibernate.connection.password">sang</property></small>

<small><!-- List of XML mapping files --><mapping resource="SinhVien.hbm.xml"/></session-factory></small>

<small></hibernate-configuration></small>

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

<b>Tạo POJO (Lớp persistent)</b>

Các lớp Java có các đối tượng hoặc các thể hiện sẽ được lưu trữ trong các bảng cơ sở dữ liệu được gọi là các lớp persistent trong Hibernate.

Hibernate hoạt động tốt nhất nếu các lớp này tuân theo một số quy tắc đơn giản, còn được gọi là mơ hình lập trình Plain Old Java Object (POJO).

<b><small>27</small></b>

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

<b>Tạo POJO (Lớp persistent)</b>

<b><small>Phải có 1 phương thức khởi tạo mặc định (phương </small></b>

<small>thức khởi tạo khơng có tham số)</small>

<b><small>Tất cả các thuộc tính trong lớp cần đặt private hoặc protected, hoặc default (Hibernate không xử lý các</small></b>

<small>thuộc tính để public)</small>

<small>Tất cả các thuộc tính phải có phương thức setter và getter.</small>

<small>Class khơng nên để final</small>

<small>Các phương thức không nên để public final, chỉ nên để public</small>

<small>Các lớp này không được kế thừa (extend) các lớp đặcbiệt khác mà chỉ có thể kế thừa các lớp persistent </small>

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

<b>Tạo POJO (Lớp persistent)</b>

<b><small>29</small></b>

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

<b>VD: Tạo POJO SinhVien</b>

<small>public class SinhVien {</small>

<small>privateString maSV;</small>

<small>privateString hoTen;</small>

<small>privateString gioiTinh;</small>

<small>privateString noiSinh;</small>

<small>public SinhVien(){ } </small>

<small>public SinhVien(String maSV){this.maSV = maSV; } </small>

<small>public SinhVien(String maSV,String hoTen, String gioiTinh, </small>

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

File mapping được sử dụng để ánh xạ một hoặc nhiều lớp trong java với các bảng trong database.

Có hai cách để tạo ra các file mapping XML này:

Tạo file mapping XML bằng tay

Tạo file mapping XML bằng tool, bao gồm XDoclet, Middlegen và AndroMDA

<b><small>31</small></b>

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

<b>Tạo file mapping ###.hbm.xml</b>

Các thành phần quan trọng trong file mapping:

<b><hibernate-mapping>: phần tử gốc của tài liệu ánh xạ(mapping) </b>

<b>hibernate, nó chứa các phần tử khác và kết thúc với </hibernate- </b>

<b><class> Ánh xạ các lớp đối tượng với bảng trong CSDL.</b>

<small>oname : tên của lớp đối tượng dữ liệu</small>

<small>otable : tên bảng trong CSDL tương ứng với lớp của thuộc tính name</small>

<b><id> dùng để định danh id duy nhất của lớp đối tượng. Thường </b>

ánh xạ với khóa chính trong bảng CSDL. Có các thuộc tính sau :

<small>oname : tên thuộc tính được sử dụng trong lớp persistent</small>

<small>ocolumn : cột trong bảng CSDL để lưu khóa chính.</small>

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

<b>Tạo file mapping ###.hbm.xml (tt)</b>

<b><generator> tạo ra giá trị ID khi thêm bản ghi mới vào CSDL </b>

bằng Hibernate. Một số phương thức tạo giá trị ID:

<small>oincrement : sử dụng để tạo ID, chỉ dùng cho kiểu long, int, short .</small>

<small>osequence : Hibernate sử dụng chuỗi để tạo khóa tự động. Thường được sử dụng với HQTCSDL : DB2, PostgreSQL, Oracle, SAP DB databases.</small>

<small>oassigned : đăng ký 1 phương thức khởi tạo ID , phương thức nàyđược tạo ra bởi người phát triển ứng dụng.</small>

<small>oidentity: ID tự động tạo ra bởi CSDL.</small>

<b><property> sử dụng các thuộc tính giống như thẻ ID nhưng </b>

khơng có thẻ con <generator>. Được dùng để ánh xạ các cột bình thường (khơng phải khóa chính).

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

<b>Tạo file mapping ###.hbm.xml (tt)</b>

<small><class name="hibernateexample.SinhVien" table="sinhvien"><id name="maSV" type="string"></small>

<small><column length="5" name="MaSV"/><generator class="assigned" /></id></small>

<small><property name="hoTen" type="string"><column length="25" name="HoTen" /></property></small>

<small><property name="gioiTinh" type="string"><column length="4" name="GioiTinh" /></property></small>

<small><property name="noiSinh" type="string"><column length="20" name="NoiSinh" /></property></small>

<small></hibernate-mapping></small>

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

<b>Tạo file mapping ###.hbm.xml (tt)</b>

Nên lưu file mapping với định dạng <classname>.hbm.xml.

Trong ví dụ trên file mapping được lưu với tên SinhVien.hbm.xml.

<b><small>35</small></b>

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

<b>Kiểu dữ liệu trong hibernate</b>

<small>integerint hoặc IntegerINTEGERlonglong hoặc LongBIGINTshortshort hoặc ShortSMALLINTfloatfloat hoặc FloatFLOATdoubledouble hoặc DoubleDOUBLEbig_decimaljava.math.BigDecimalNUMERICcharacterStringCHAR(1)stringStringVARCHARbytebyte hoặc ByteTINYINTbooleanboolean hoặc BooleanBIT</small>

Các kiểu dữ liệu cơ bản

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

<b>Kiểu dữ liệu trong hibernate (tt)</b>

Các kiểu dữ liệu thời gian

<b><small>Kiểu HibernateKiểu JavaKiểu SQL</small></b>

<small>datejava.util.Date hoặc java.sql.DateDATEtimejava.util.Date hoặc java.sql.TimeTIME</small>

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

<b>Khai báo mapping vào ###.cfg.xml </b>

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

<b>Sử dụng – Tạo kết nối</b>

<small>public class HibernateSessionFactory {</small>

<small>private static SessionFactory sesstionFac;</small>

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

<b>Lấy danh sách sinh viên</b>

<small>public static List<SinhVien> getDSSinhVien(){List<SinhVien> dsSV = null;</small>

<small>Session session = </small>

<small>HibernateSessionFactory.getSessionFactory().openSession();try{</small>

<small>String sql = "select sv from SinhVien sv"; Query query = session.createQuery(sql); </small>

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

<b>Lấy thông tin sinh viên</b>

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

<b>Thêm sinh viên</b>

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

<b>Xóa sinh viên</b>

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

<b>Sửa sinh viên</b>

<small>public static boolean capNhatSV(SinhVien sv){ Session </small>

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

<b>Q & A </b>

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

</div>

×