2011-05-13 49 views
10

Tôi nói rằng phương pháp ưa thích để tải trình điều khiển JDBC là:tải trình điều khiển JDBC

Class.forName(driverName); 

tôi hiểu rằng đây là tốt hơn cho một quyết định động giữa nhiều trình điều khiển có thể đọc từ một tập tin cấu hình XML hoặc người dùng nhập vào . Điều tôi tò mò về là làm thế nào để gọi câu lệnh này tải trình điều khiển đã nêu vào môi trường mà chúng ta thậm chí không lưu trữ đối tượng "Lớp" kết quả ở bất cứ đâu. Mục JavaDocs nói:

public static Class forName(String className) 
       throws ClassNotFoundExceptionReturns 

trả về đối tượng Class liên kết với lớp hoặc giao diện với tên chuỗi trao

Trong trường hợp đó, làm thế nào để các nhà phát triển Java quản lý để tạo điều kiện cho sự tồn tại của đối tượng điều khiển chỉ với tuyên bố này?

+2

Lưu ý rằng 'Class.forName (...)' là không cần thiết nữa nếu bạn đang sử dụng JDBC 4.0 hoặc mới hơn (được bao gồm trong Java SE 6). JDBC có thể tự động tìm và khởi tạo trình điều khiển ngay bây giờ. Xem: http://onjava.com/pub/a/onjava/2006/08/02/jjdbc-4-enhancements-in-java-se-6.html – Jesper

+0

Thông tin khác tại http://stackoverflow.com/a/8053125/632951 – Pacerier

Trả lời

26

Class#forName() chạy static initializers (bạn biết đấy, static áp dụng cho lớp học, không áp dụng cho trường hợp này). Việc thực hiện trình điều khiển JDBC should tự đăng ký trong bộ khởi tạo tĩnh.

public class SomeDriver implements Driver { 

    static { 
     DriverManager.registerDriver(new SomeDriver()); 
    } 

} 

Lưu ý rằng có các trình điều khiển JDBC lỗi như org.gjt.mm.mysql.Driver không đăng ký chính xác bên trong trình tạo. Đó là lý do tại sao bạn cần một cuộc gọi newInstance() sau đó trên các trình điều khiển đó để giúp họ tự đăng ký.

+0

Tôi hiểu rồi. Cảm ơn. Câu trả lời hay nhất mọi lúc :) – mihsathe

+0

Bạn được chào đón. – BalusC

+0

@BalusC, Tại sao chúng ta cần sử dụng Class.forName để chạy trình khởi tạo tĩnh? Nếu chúng tôi sử dụng trực tiếp 'SomeDriver', ví dụ: nếu chúng ta đã có một thể hiện của nó, hoặc chúng ta gọi trực tiếp 'SomeDriver.StaticMethod', thì điều đó sẽ không đảm bảo rằng bộ khởi tạo tĩnh sẽ được gọi? – Pacerier

Các vấn đề liên quan