Diğerlerinin de belirttiği gibi, dış kod gerekmediği halde kodunuz temel olarak doğrudur try
. İşte birkaç düşünce daha.
DataSource
Burada diğer cevaplar doğru ve iyi, bpgergo tarafından kabul edilen cevap . Ancak hiçbiri modern Java'da DataSource
yaygın olarak kullanılması tavsiye edilmez DriverManager
.
Yani eksiksizlik uğruna, veritabanı sunucusundan geçerli tarihi alan eksiksiz bir örnek. Burada kullanılan veritabanı Postgres'dir . Diğer tüm veritabanları benzer şekilde çalışır. Kullanımını veritabanınıza uygun org.postgresql.ds.PGSimpleDataSource
bir uygulama ile değiştirirsiniz DataSource
. Bir uygulama, muhtemelen bu rotaya giderseniz sürücünüz veya bağlantı havuzunuz tarafından sağlanır.
Bir DataSource
uygulama gerek yok o “açıldı” hiçbir zaman, çünkü kapatılacak. A DataSource
bir kaynak değildir, veritabanına bağlı değildir, bu nedenle veritabanı sunucusundaki ağ bağlantılarını veya kaynakları tutmaz. A DataSource
, veritabanına bağlantı yapılırken, veritabanı sunucusunun ağ adı veya adresi, kullanıcı adı, kullanıcı şifresi ve bir bağlantı yapıldığında belirtilmesini istediğiniz çeşitli seçeneklerle basitçe gerekli olan bilgidir. Yani DataSource
uygulama nesnesi yok değil sizin Try-ile-kaynaklar parantez içine girin.
İç içe kaynaklar ile deneme
Kodunuz, kaynaklarla denenmiş iç içe ifadelerin doğru şekilde kullanılmasını sağlar.
Aşağıdaki örnek kodda , kaynaklarla deneme sözdizimini iki kez kullandığımıza dikkat edin ; biri iç içe. Dış try
iki kaynağı tanımlar: Connection
ve PreparedStatement
. İç kısım kaynağı try
tanımlar ResultSet
. Bu yaygın bir kod yapısıdır.
İçinden bir istisna atılır ve orada yakalanmazsa, ResultSet
kaynak otomatik olarak kapatılır (varsa, boş olmaz). Bunu takiben, PreparedStatement
kapanacak ve son Connection
olarak kapalı olacak. Kaynaklar, kaynak denemeli ifadeler içinde bildirildikleri ters sırada otomatik olarak kapatılır.
Buradaki örnek kod aşırı derecede basittir. Yazıldığı gibi, tek bir kaynaklarla deneme ifadesi ile yürütülebilir. Ancak gerçek bir işte, iç içe try
çağrılar arasında daha fazla iş yapacaksınız . Örneğin, kullanıcı arabiriminizden veya POJO'nuzdan değerler çıkarıyor ve daha sonra yöntemlere ?
çağrılar yoluyla SQL'inizdeki yer tutucuları yerine getirmek için bunları PreparedStatement::set…
geçiriyor olabilirsiniz.
Sözdizimi notları
Sondaki noktalı virgül
Kaynaklarla deneme parantezindeki son kaynak deyimini izleyen noktalı virgülün isteğe bağlı olduğuna dikkat edin. İki nedenden ötürü kendi çalışmamda kullanıyorum: Tutarlılık ve tam görünüyor ve satır sonu noktalı virgülleri hakkında endişelenmenize gerek kalmadan kopyalamayı yapıştırma işlemini kolaylaştırır. IDE'niz son noktalı virgülü gereksiz olarak işaretleyebilir, ancak ayrılmanın bir zararı yoktur.
Java 9 - Kaynaklarla denemede mevcut değişkenleri kullanma
Java 9'daki yenilikler, kaynaklarla deneme sözdiziminin bir geliştirmesidir. Artık, try
ifadenin parantezlerinin dışındaki kaynakları bildirebilir ve doldurabiliriz . Bunu JDBC kaynakları için henüz yararlı bulmadım, ancak kendi çalışmanızda aklınızda bulundurun.
ResultSet
kendini kapatmalı ama olmayabilir
İdeal bir dünyada ResultSet
, belgelerin vaat ettiği gibi kendini kapatır:
Bir ResultSet nesnesi, onu oluşturan Statement nesnesi kapatıldığında, yeniden çalıştırıldığında veya bir sonraki sonucu birden çok sonuç dizisinden almak için kullanıldığında otomatik olarak kapatılır.
Ne yazık ki, geçmişte bazı JDBC sürücüleri bu sözü yerine getiremedi. Sonuç olarak, birçok JDBC programcılar dahil mutlaka kapatılması tüm JDBC kaynaklarına öğrenilen Connection
, PreparedStatement
ve ResultSet
de. Modern kaynaklarla deneme sözdizimi bunu daha kolay ve daha kompakt bir kodla yapmıştır. Bildirim Java ekibi işaretleme rahatsız gitti ResultSet
olarak AutoCloseable
, ben bunu faydalanmak düşündürmektedir. Tüm JDBC kaynaklarınız etrafında kaynaklarla deneme özelliğini kullanmak, kodunuzu niyetleriniz konusunda daha fazla kendi kendine belgelendirir.
Kod örneği
package work.basil.example;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.time.LocalDate;
import java.util.Objects;
public class App
{
public static void main ( String[] args )
{
App app = new App();
app.doIt();
}
private void doIt ( )
{
System.out.println( "Hello World!" );
org.postgresql.ds.PGSimpleDataSource dataSource = new org.postgresql.ds.PGSimpleDataSource();
dataSource.setServerName( "1.2.3.4" );
dataSource.setPortNumber( 5432 );
dataSource.setDatabaseName( "example_db_" );
dataSource.setUser( "scott" );
dataSource.setPassword( "tiger" );
dataSource.setApplicationName( "ExampleApp" );
System.out.println( "INFO - Attempting to connect to database: " );
if ( Objects.nonNull( dataSource ) )
{
String sql = "SELECT CURRENT_DATE ;";
try (
Connection conn = dataSource.getConnection() ;
PreparedStatement ps = conn.prepareStatement( sql ) ;
)
{
… make `PreparedStatement::set…` calls here.
try (
ResultSet rs = ps.executeQuery() ;
)
{
if ( rs.next() )
{
LocalDate ld = rs.getObject( 1 , LocalDate.class );
System.out.println( "INFO - date is " + ld );
}
}
}
catch ( SQLException e )
{
e.printStackTrace();
}
}
System.out.println( "INFO - all done." );
}
}
try (ResultSet rs = ps.executeQuery()) {
çünkü A ResultSet nesnesi, onu oluşturan Statement nesnesi tarafından otomatik olarak kapatılır