12/08/2018, 14:49

Sử dụng store proceduce với Hibernate

Trong bài viết này tôi muốn giới thiệu với các bạn về cách sử dụng store produce trong hibernate 1.Store proceduce là gì : Là một tập hợp các câu lệnh SQL dùng để thực thi một nhiệm vụ nhất định. Nó hoạt động giống như một hàm trong các ngôn ngữ lập trình khác. Stored procedure là một khái niệm khá ...

Trong bài viết này tôi muốn giới thiệu với các bạn về cách sử dụng store produce trong hibernate 1.Store proceduce là gì : Là một tập hợp các câu lệnh SQL dùng để thực thi một nhiệm vụ nhất định. Nó hoạt động giống như một hàm trong các ngôn ngữ lập trình khác. Stored procedure là một khái niệm khá phổ biến và được hầu hết các hệ quản trị cơ sở dữ liệu (DBMS) hỗ trợ, tuy nhiên không phải tất cả đều hỗ trợ Stored Procedure. 2.Một số ưu nhược điểm khi dùng store procdedure Ưu điểm 2.1 Hiệu năng cao:Do store procedure được được lưu trữ tại db và nó được db server kiểm tra trước khi lưu nên nó không cần kiểm tra lại khi thực thi,Việc gửi câu lệnh sql qua network khiến hiệu năng giảm đi,trong khi đó thì store produre luôn sẵn có tại db server nên khi có request gọi đến thì dữ liệu kết quả trả về nhanh hơn so với gửi câu sql tới db server. 2.2 Khả năng sử dụng lại:Một khi stored procedure được tạo ra nó có thể được sử dụng lại.Điều này làm cho việc bảo trì phần mềm dễ dàng hơn do đã có sự tách rời giữa business và database.Giả sử nếu có phải đổi ngôn ngữ lập trình thì ta cũng không phải viết nhiều logic vì ta có thể tái sử dụng được store procedure (chỉ việc truyền tham số và lấy ra kết quả). 2.3.Bảo mật:Khi lập trình viên sử dụng các store procedure có sẵn thì họ không cần phải quan tâm nhiều tới các table và ta có thể giới hạn các user chỉ có thể truy cập thông qua store procedure mà ko đụng tới table trực tiếp. Nhược điểm 2.4 Viết store procedure thì phức tạp và khó debug
Dưới đây là cách implement store procedure tron hibernate Bài viết sử dung maven để buil project Bước 1: Tạo file Pom với các thư viện cần thiết

  <?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0
                             http://maven.apache.org/xsd/maven-4.0.0.xsd">

    <modelVersion>4.0.0</modelVersion>
    <groupId>com.memorynotfound.db.hibernate</groupId>
    <artifactId>jpa-named-stored-procedure</artifactId>
    <version>1.0.0-SNAPSHOT</version>
    <packaging>war</packaging>
    <name>HIBERNATE - ${project.artifactId}</name>
    <url>http://memorynotfound.com</url>

    <properties>
        <mysql.driver.version>6.0.4</mysql.driver.version>
        <hibernate.version>5.2.3.Final</hibernate.version>
    </properties>

    <dependencies>
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>${mysql.driver.version}</version>
        </dependency>
        <dependency>
            <groupId>org.hibernate</groupId>
            <artifactId>hibernate-core</artifactId>
            <version>${hibernate.version}</version>
        </dependency>
    </dependencies>

    <build>
        <plugins>
            <plugin>
                <artifactId>maven-compiler-plugin</artifactId>
                <version>3.5.1</version>
                <configuration>
                    <source>1.8</source>
                    <target>1.8</target>
                </configuration>
            </plugin>
        </plugins>
    </build>

</project>

Bước 2:Tạo một hàm thủ tục

  DROP PROCEDURE IF EXISTS SP_ADD_BOOK;
CREATE PROCEDURE SP_ADD_BOOK(IN id INTEGER(11), IN title VARCHAR(255))
BEGIN
    INSERT INTO Book (id, title) VALUES (id, title);
END;


DROP PROCEDURE IF EXISTS SP_GET_BOOK_BY_ID;
CREATE PROCEDURE SP_GET_BOOK_BY_ID(IN id INTEGER(11))
BEGIN
    SELECT * FROM Book book WHERE book.id = id;
END;

Bước 3:Tạo model và mapping chúng Bạn có thể đánh dấu các class này bằng anotation @NamedStoredProcedureQueries để đăng ký nhiều store procedure.@StoredProcedureParameter thường được dùng để map input/output tham số tới store procedure import javax.persistence.*;

@Entity
@NamedStoredProcedureQueries({
        @NamedStoredProcedureQuery(
                name = "SP_GetBookById",
                procedureName = "SP_GET_BOOK_BY_ID",
                resultClasses = Book.class,
                parameters = {
                        @StoredProcedureParameter(
                                name = "id",
                                mode = ParameterMode.IN,
                                type = Integer.class)
                }
        ),
        @NamedStoredProcedureQuery(
                name = "SP_AddBook",
                procedureName = "SP_ADD_BOOK",
                parameters = {
                        @StoredProcedureParameter(
                                name = "id",
                                mode = ParameterMode.IN,
                                type = Integer.class),
                        @StoredProcedureParameter(
                                name = "title",
                                mode = ParameterMode.IN,
                                type = String.class)
                }
        )
})
public class Book {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Integer id;
    private String title;

    public Book() {
    }

    public Book(String title) {
        this.title = title;
    }

    public Integer getId() {
        return id;
    }

    public void setId(Integer id) {
        this.id = id;
    }

    public String getTitle() {
        return title;
    }

    public void setTitle(String title) {
        this.title = title;
    }

    @Override
    public String toString() {
        return "Book{" +
                "id=" + id +
                ", title='" + title + ' +
                '}';
    }
}

Bạn có thể dùng XML để map.File này được đặt trong thư mục src/main/resources/META-INF và tên là orm.xml

 <?xml version="1.0" encoding="UTF-8" ?>
<entity-mappings xmlns="http://xmlns.jcp.org/xml/ns/persistence/orm"
                 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
                 xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/persistence/orm
                                     http://xmlns.jcp.org/xml/ns/persistence/orm_2_0.xsd" version="2.1">

     
    <named-stored-procedure-query name="SP_GetBookById" procedure-name="SP_GET_BOOK_BY_ID">
        <parameter class="java.lang.Integer" mode="IN" name="id"/>
        <result-class>com.memorynotfound.hibernate.Book</result-class>
    </named-stored-procedure-query>
    <named-stored-procedure-query name="SP_AddBook" procedure-name="SP_ADD_BOOK">
        <parameter class="java.lang.Integer" mode="IN" name="id"/>
        <parameter class="java.lang.String" mode="IN" name="title"/>
    </named-stored-procedure-query>

     
    <entity class="com.memorynotfound.hibernate.Book">
        <attributes>
            <basic name="title"/>
        </attributes>
    </entity>

</entity-mappings>

Bước 4:Cấu hình hibernate/JPA Chúng ta cấu hình JPA Persistence Unit sử dụng file persistence.xml,file này được đặt tại đường dẫn src/main/resources/META-INF

<?xml version="1.0" encoding="UTF-8"?>
<persistence version="2.1" xmlns="http://xmlns.jcp.org/xml/ns/persistence"
             xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
             xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/persistence
                                 http://xmlns.jcp.org/xml/ns/persistence/persistence_2_1.xsd">
    <persistence-unit name="mnf-pu" transaction-type="RESOURCE_LOCAL">
         
        <properties>
             
            <property name="javax.persistence.jdbc.url" value="jdbc:mysql://localhost:3306/memorynotfound?serverTimezone=Europe/Brussels"/>
            <property name="javax.persistence.jdbc.user" value="root"/>
            <property name="javax.persistence.jdbc.password" value=""/>
            <property name="javax.persistence.jdbc.driver" value="com.mysql.cj.jdbc.Driver"/>

             
            <property name="hibernate.dialect" value="org.hibernate.dialect.MySQLDialect"/>
            <property name="hibernate.hbm2ddl.auto" value="create-drop"/>
            <property name="hibernate.format_sql" value="false"/>
            <property name="hibernate.show_sql" value="true"/>
        </properties>
    </persistence-unit>
</persistence>

Bước cuối:Chạy thử

import javax.persistence.*;
import java.util.List;

public class App {

    public static void main (String...args) throws InterruptedException {

        EntityManagerFactory emf = Persistence.createEntityManagerFactory("mnf-pu");
        EntityManager em = emf.createEntityManager();

        StoredProcedureQuery sp = em.createNamedStoredProcedureQuery("SP_AddBook")
                .setParameter("id", 1)
                .setParameter("title", "Hibernat/JPA Named Stored Procedure Example");
        sp.execute();

        Book result = (Book)em.createNamedStoredProcedureQuery("SP_GetBookById")
                .setParameter("id", 1)
                .getSingleResult();
        System.out.println(result);

        em.close();
        emf.close();
    }
}

Hi vọng với bài viết về cách thực thi store proceduce trong hibernate sẽ giúp các bạn phần nào trong quá trình học tập và công tác.Good luck

0