هایبرنیت در مقابل jdbc

تا امروز فکر میکردم jdbc از هایبرنیت سریعتره چون لایه های کمتری داره.

ولی وقتی روی ده هزار تراکنش تست کردیم دیدیم هایبرنیت در مقابل jdbc , ده برابر سریعتره

فکر کردیم اشتباه کردیم , دوباره همه چی رو کنترل کردیم

علتش اینه که هایبرنیت از کانکشن پولینگ استفاده میکنه و یه مکانیزم واسه کشینگ داره.

(با تشکر از آقای رضا شجاعی سرپرست تیم سوئیچ پست بانک)

چگونه با استفاده از اسپرینگ به دیتا سورس های مختلف کانکت بشیم

در اکثر سازمانها که وارد می شویم باید دیتا را از بانک های اطلاعاتی مختلف استخراج کنیم و در برنامه جدیدی که ایجاد می کنیم از آنها استفاده کنیم تا دوباره مجبور نشویم موجودیت های قبلی را دوباره تعریف کنیم .

برای دریافت دیتا از منابع مختلف راه حل های زیر وجود دارد :

1.دریافت دیتا از وب سرویس

2.اتصال مستقیم به بانک های مختلف از داخل اپلیکیشن جدید

در این پست قصد دارم نحوه استفاده از روش دوم را با تصاویری که از کدهای مربوطه گرفته شده را بیان کنم . فرض کنید قصد داریم اپلیکیشنی مطابق تصویر زیر ایجاد کنیم .

 

- اگر بخواهیم بدون استفاده از اسپرینگ کار کنیم باید با استفاده از jdbc به بانک های مختلف وصل بشیم و نتایجی که از این لایه (بیزینس) برگردانده میشود را در لایه کنترل به لایه ویو (jsp) منتقل کنیم. تصویر

- کدهایی که در لینک قبل می بینید خوانایی لازم را ندارند و کانکشن استرینگ برنامه در داخل خود برنامه گنجانده شده است و این اصلاً خوب نیست چون اگه تنظیمات بانک اطلاعاتی عوض شد نمیتوانیم بصورت پارامتریک این تغییرات را به اپلیکشن منتقل کنیم.

- برای حل این مشکل میتونیم یه فایل کانفیگ درست میکنیم که کانکشن استرینگ های مختلف داخل این فایل کانفیگ قرار دارند و یا میتونیم طبق استانداردهای کد نویسی اسپرینگ از فایل jdbc.properties استفاده کنیم. تصویر

- فایل کانتکست فایلی است که در آن آبجکت های مورد نیاز برنامه همانند آبجکت دیتا سورس , آبجکت مدیر تراکنش ها قرار میگرند . بازای هر بانک اطلاعاتی باید آبجکت دیتا سورس و آبجکت مدیر تراکنش های مرتبط با آن را ایجاد کنیم. تصویر

- ساختار پروژه ای که در حال کار بر روی آن هستیم با استفاده از Maven ایجاد شده است و از فایل pom.xml برای مدیریت آن استفاده می کنیم. در این مثال در داخل پکیج org برنامه ای است که با استفاده از هایبرنیت ایجاد شده است و در پست های قبلی راجع به آن توضیح داده شد. در داخل پکیج com برنامه ای است که از jdbc استفاده می کند. تصویر

- لایه model شامل POJO های ساده می باشد که هیچگونه Annotation در آن استفاده نشده است. تصویر

- لایه dao برنامه از یک اینرفیس تشکیل شده است که در آن امضا متدهایی که قصد پیاده سازی آن را داریم آورده میشود. تصویر

- ما قصد داریم اینرفیس dao اپلیکیشن خود را با استفاده از jdbc پیاده سازی کنیم . این قسمت مهمترین قسمت برنامه است و فریم ورک اسپرینگ کمک زیادی برای پیاده سازی این کلاس به ما میکند. دقت کنید که چگونه آبجکت دیتا سورس را با استفاده از @Autowired و @Qualifire  مقداردهی می کنیم و پس از آن چگونه JdbcTemplate را مقداردهی می کنیم. تصویر

- آبجکت JdbcTemplate توسط فریم ورک اسپرینگ معرفی شده است و به ما این امکان را میدهد تا با کد خواناتری از بانک اطلاعاتی پرس و جو کنیم. تصویر

-برای استفاده از روش های دیگر پرس و جو با استفاده از jdbcTemplate از سایت Mkyong.com میتوانید استاده کنید.

- هدف از ایجاد لایه bo مدیریت تراکنش می باشد که از یک اینرفیس تشکیل شده است که دقیقاً یک کپی از اینترفیس لایه dao می باشد. تصویر

- دقت شود که در هنگام پیاده سازی متدهای لایه bo , قبل از هر متد از @Transactional بطور صحیح استفاده شود. تصویر

- در لایه کنترلر مشخص می کنیم با ارسال یک url جدید به سرور: چه پردازشهایی باید در سرور انجام شوند؟ چه آبجکتهایی به لایه ویو منتقل شوند؟ چه چیزی بعنوان خروجی به کاربر نمایش داده شود؟ تصویر

- در لایه ویو با استفاده از${Object}  به آبجکتها دسترسی داریم. تصویر

- با استفاده از ابزارهای تست testing و نوشتن متدهای تستی میتوانیم قسمتهای مختلف برنامه را تست کنیم. تصویر

لایه بندی های مختلف پروژه این امکان را به ما میدهند تا در صورت نیاز به ایجاد تغییرات در برنامه , این تغییرات فقط در یک لایه انجام شوند تا از انتشار تغییرات در همه سطوح برنامه جلوگیری شود و هزینه نگهداری برنامه کاهش یابد.

حجم سورس کد برنامه 218 کیلو بایت است که برای استفاده از آن باید idea و maven را در کامپیوتر خود نصب کرده باشید. دریافت سورس کد.

فکر کنم تا به حال درباره لایه بیزینس توضیحات کاملی داده شده است . در پست های بعدی سعی میکنم بیشتر درباره لایه ویو بنویسم.

لطفاً کتاب Pro Spring MVC with Web Flow را یک منبع کامل درباره Spring MVC می باشد و مطابق با آخرین نسخه (در حال حاضر نسخه 3.2) می باشد را بصورت رایگان دریافت کنید.

download complete CRUD application using SpringMVC + Hibernate

Add, Edit, Delete, Search using Spring, Hibernate, MySQL

 

1. Setup a Dynamic Web project and convert it to maven project

2. Add the dependencies - be sure to clean install in maven to put your needed jars in the project so you won't have library issue while coding

3. Setup the database

4. Create model class - add JPA annotations

5. Create DAO components - @Repository

6. Create Service components - @Service

7. Create Controller component - @Controller

 - be sure to put BindingResult immediately after @ModelAttribute or else you will got issues

8. Create the View components - JSPs

9. Configurations

- jdbc.properties

- spring-servlet.xml

- log4j.xml

- hibernate.cfg.xml

- finally web.xml

10. Clean compile

 

Download Source Code

View output

منابع :

 چه جوری از URI در لایه کنترل استفاده کنیم

چه جوری واسه فرم ولیدیشن یه کلاس بنویسیم و چه جوری اون رو سرویس کنیم

چه جوری سطرهای گرید رو شناسایی کنیم

سوال :

چه جوری دوتا کانکشن درست کنیم

 

مستقیم jdbc با رانندگی jtds

اگه خیلی عجله داری . یا به هر دلیلی نمیخوای با هایبرنیت و اسپرینگ درگیر بشی و فقط میخوای یه کوئری یا یه استور پروسیجر رو چک کنی میتونی با کد زیر مستقیماً وصل بشی به بانک و کوئری رو تستش کنی .

فقط یادت نره که درایور jTDS رو با استفاده از maven به پروژه اضافه کنی .

----------------------------------------------------------------

package org.saye.service;

import org.apache.log4j.Logger;
import org.springframework.stereotype.Service;

import java.sql.*;
import java.util.LinkedList;
import java.util.List;

/**
 * Created with IntelliJ IDEA.
 * User: ameysami
 * Date: 3/5/13
 * Time: 1:10 PM
 * To change this template use File | Settings | File Templates.
 *


 * http://www.jdbc-tutorial.com/jdbc-tutorials/prepared-statements-tutorial
 */
@Service
public class DatabaseHandlerImpl implements DatabaseHandler {
    private Connection con = null;
    private CallableStatement cstmt = null;
//    private PreparedStatement pstmt = null;
    private Statement stmt = null;

    private ResultSet rs = null;
    private static Logger log = Logger.getLogger("DatabaseHandlerImpl");

    public DatabaseHandlerImpl() {
        String databaseUrl = "jdbc:jtds:sqlserver://Oracle01/Sale;";
        String databaseUsername = "sa";
        String databasePassword = "111111";
        try {
            Class.forName("net.sourceforge.jtds.jdbc.Driver");
            con = DriverManager.getConnection(databaseUrl, databaseUsername, databasePassword);
            System.out.println("Connection successful");
        } catch (Exception e) {
            System.err.println("Cannot connect to database server");
            e.printStackTrace();
        }
    }

    public List gettblPersonnel(String personnelRef, String supervisorRef, String dCRef, String personnelTypeRef) {
        List ll = new LinkedList();
        try {
            cstmt = con.prepareCall("{ call gettblPersonnel(?,?,?,?) }");
            cstmt.setString(1, personnelRef);
            cstmt.setString(2, supervisorRef);
            cstmt.setString(3, dCRef);
            cstmt.setString(4, personnelTypeRef);

            log.info("exec gettblPersonnel " + personnelRef + "," + supervisorRef + "," + dCRef + "," + personnelTypeRef);
            rs = cstmt.executeQuery();

            while (rs.next()) {
                PersonnelDTO personnelDTO = new PersonnelDTO();
                personnelDTO.setID(rs.getString(1));
                personnelDTO.setPersonnelName(rs.getString(1) + " : " + rs.getString(2));
                personnelDTO.setPersonnelPhone(rs.getString(3));
                personnelDTO.setPersonnelImage(rs.getBytes(4));
                personnelDTO.setPersonnelCode(rs.getString(5));

                ll.add(personnelDTO);
            }
        } catch (SQLException e) {
            e.printStackTrace();
        }
        return ll;
    }

    public byte[] getPersonnelImage(String ID) {
        PersonnelDTO personnelDTO = new PersonnelDTO();
        try {
            String sqlString = "SELECT PersonnelImage from tblPersonnel WHERE ID=" + ID;
            stmt = con.createStatement();
            rs = stmt.executeQuery(sqlString);
            log.info(sqlString);

            while (rs.next()) {
                log.info("salam");
                personnelDTO.setPersonnelImage(rs.getBytes(1));
            }
        } catch (SQLException e) {
            e.printStackTrace();
        }
        return personnelDTO.getPersonnelImage();
    }

    public static void main(String[] args) {
        DatabaseHandlerImpl handler = new DatabaseHandlerImpl();
        //handler.gettblPersonnel("0", "0", "1", "0");
        handler.getPersonnelImage("12");
    }
}

----------------------------------------------------------------

شرمنده اگه کد هام شلوغ پلوغه . ایکاش یه وب سایت داشتم.