Giriş
Şu satırı dahil ederiz.
Bu sınıf using ile kullanılmalı. Şöyle yaparız.
Örnek
Şöyle yaparız
Eğer hata olursa BatchUpdateException fırlatır. Açıklaması şöyle
Bu iki metod genelde beraber kullanılır. Döngü içinde cümleleri ekleriz. Döngü sonunda executeBatch ile işleri topluca çalıştırırız.
Örnek
Şöyle yaparız.
Eğer cümleleri 100'er 100'er çalıştırmak istersek şöyle yaparız.
Şöyle yaparız.
Şöyle yaparız.
PrepararedStatement aynı zamanda Statement sınıfından kalıttığı için executeQuery(sql) metodunu da çağırabilir. Ancak bence çağırmamalı çünkü esas kullanım amacı şöyle
Insert, Update cümlelerini çalıştırır. Şöyle yaparız.
Örnek
Şöyle yaparız.
Elimizde bir java.sql.Array olsun.
Şöyle yaparız.
setNull metodu
Şöyle yaparız.
Şöyle tanımlı olduğu için setX metodunun yerine kullanılabilir.
setQueryTimeout metodu
Şu satırı dahil ederiz.
import java.sql.PreparedStatement;
using İle KullanımBu sınıf using ile kullanılmalı. Şöyle yaparız.
try (Connection con = DriverManager.getConnection("...")) {
String sql = "select * from ...";
try (PreparedStatement stmt = con.prepareStatement(sql)) {
stmt.setInt(1, ...);
stmt.setString(2, ...);
...
}
}
Parametreler
SQL cümlesinde parametreler için sadece ? karakteri kullanılır. '?' şeklide kullanılmaz. Şu kod yanlış.
Bir connection nesnesinden türetilir. Verilen sql cümlesi içinde ? işaret ile parametrelerin atanacağı alanlar olur. Şöyle yaparız.SQL cümlesinde parametreler için sadece ? karakteri kullanılır. '?' şeklide kullanılmaz. Şu kod yanlış.
PreparedStatement ps = cn.prepareStatement("Update instructor set name ='?' ,
gender ='?', image ='?' where instructorID =?");
Açıklaması şöyleRemove quotes around question marks. Otherwise, '?' would be interpreted as a string literal with a single question mark in itsetX metodlarına geçilen indeks sayısı 1'den başlar. Bu aslında bütün Java,C++,C# mantığına ters. Nedenini bilmiyorum. Şöyle yaparız.
String query = "SELECT id FROM `client_table` WHERE username= ?";
stmt = connection.prepareStatement (query);
stmt.setString (1, username);
ResultSet rs = stmt.executeQuery ();
if(rs.next ()){
return UUID.fromString (rs.getString(1));
}else{
return null;//id not found
}
constructor - sqlPreparedStatement ps=con.prepareStatement("INSERT INTO ... VALUES (?,?)");
constructor - sql + optionÖrnek
Şöyle yaparız
String sql = "...";
PreparedStatement ps = conn.prepareStatement(sql, Statement.RETURN_GENERATED_KEYS);
Daha sonra şöyle yaparız.ps.execute();
ResultSet rs = ps.getGeneratedKeys();
int generatedKey = rs.getInt(1);
System.out.println("Inserted record ID: " + generatedKey);
addBatch ve executeBath metodlarıEğer hata olursa BatchUpdateException fırlatır. Açıklaması şöyle
Bu kısmı anlamadım ancak hata olursa driver çalışmaya devam edebilir deniyor. Açıklaması şöyle.The subclass of SQLException thrown when an error occurs during a batch update operation. In addition to the information provided by SQLException, a BatchUpdateException provides the update counts for all commands that were executed successfully during the batch update, that is, all commands that were executed before the error occurred. The order of elements in an array of update counts corresponds to the order in which commands were added to the batch.
Hatalı satırlar görülebilir. Açıklaması şöyle.After a command in a batch update fails to execute properly and a BatchUpdateException is thrown, the driver may or may not continue to process the remaining commands in the batch.
In the case where the driver continues processing commands, the array element for any command that failed is Statement.EXECUTE_FAILED.
Örnek
Şöyle yaparız.
PreparedStatement ps=con.prepareStatement("INSERT INTO ...");
while(somecondition)
{
....
ps.setString(1, date);
ps.setFloat(2, open);
.....
preparedStatement.addBatch();
}
preparedStatement.executeBatch();
ÖrnekEğer cümleleri 100'er 100'er çalıştırmak istersek şöyle yaparız.
int batchSize = 100;
for (int count = 0; count < 1000; count++) {
pStatement.setString(1, ...);
pStatement.setString(2, ...);
pStatement.addBatch();
if (count % batchSize == 0) {
pStatement.executeBatch();
}
}
pStatement.executeBatch() ;
//for remaining batch statements
ÖrnekŞöyle yaparız.
PreparedStatement = connection.prepareStatement("INSERT INTO item(stream_id,"+
"stream_item_date, channel) "+
"VALUES (?, ?, ?);");
for(Item item : stream.getItems()){
statement.setLong(1, item.getStream_id());
statement.setString(2, item.getStream_item_date());
statement.setString(3, item.getChannel());
statement.addBatch();
}
close metoduŞöyle yaparız.
ps.close();
executeQuery metoduPrepararedStatement aynı zamanda Statement sınıfından kalıttığı için executeQuery(sql) metodunu da çağırabilir. Ancak bence çağırmamalı çünkü esas kullanım amacı şöyle
ResultSet results = ps.executeQuery();
Şu değil.ResultSet results = state.executeQuery(sql);
executeUpdate metoduInsert, Update cümlelerini çalıştırır. Şöyle yaparız.
ps.executeUpdate();
getGeneratedKeys metoduÖrnek
Şöyle yaparız.
ResultSet rs = ps.getGeneratedKeys();
while (rs.next()) {
int generatedKey = rs.getInt(1);
System.out.println("Inserted record ID: " + generatedKey);
}
setArray metoduElimizde bir java.sql.Array olsun.
Integer[] id = {2, 14, 4};
Array array = connection.createArrayOf("INTEGER", id);
Şöyle yaparız.String sql = "INSERT INTO COMPANY (NO, ID) VALUES (?, ?)";
try (PreparedStatement pstmt = conn.prepareStatement(sql);) {
pstmt.setInt(1, 7); // Set NO
pstmt.setArray(2, array); // Set ID
pstmt.executeUpdate(); // Execute the query
}
setBinaryStream metoduŞöyle yaparız.
byte[] data = ...;
ByteArrayInputStream stream = new ByteArrayInputStream(data);
ps.setBinaryStream(1, stream, stream.available());
setBoolean metod
Örnek
Şöyle yaparız
String query = "INSERT INTO BoolTable values (?) ";
PreparedStatement pstmt = con.prepareStatement(query);
pstmt.setBoolean(1, true);
pstmt.execute();
...
...
ResultSet rs = stmt.executeQuery("select * from BoolTable");
setDate metodu - tarih
java.sql.Date nesnesi alır. Yani sadece tarih bilgisidir. Saat bilgisi içermez. Şöyle yaparız.
Double için şöyle yaparız.ps.setDate("...", new java.sql.Date());
setDouble metodups.setDouble(4,...);
setFloat metodu
Şöyle yaparız.ps.setFloat (1, ...);
setInt metodu
Şöyle yaparız.
Şöyle yaparız.
ps.setInt(1, ...);
Şöyle yaparız.
ps.setNull(1, java.sql.Types.VARCHAR);
setObject metoduŞöyle tanımlı olduğu için setX metodunun yerine kullanılabilir.
public void setObject(int parameterIndex, Object parameterObj)
throws SQLException {
synchronized (checkClosed().getConnectionMutex()) {
if (parameterObj == null) {
setNull(parameterIndex, java.sql.Types.OTHER);
} else {
if (parameterObj instanceof Byte) {
setInt(parameterIndex, ((Byte) parameterObj).intValue());
} else if (parameterObj instanceof String) {
setString(parameterIndex, (String) parameterObj);
} else if (parameterObj instanceof BigDecimal) {
setBigDecimal(parameterIndex, (BigDecimal) parameterObj);
} else if (parameterObj instanceof Short) {
setShort(parameterIndex, ((Short) parameterObj).shortValue());
} else if (parameterObj instanceof Integer) {
setInt(parameterIndex, ((Integer) parameterObj).intValue());
} else if (parameterObj instanceof Long) {
setLong(parameterIndex, ((Long) parameterObj).longValue());
} else if (parameterObj instanceof Float) {
setFloat(parameterIndex, ((Float) parameterObj).floatValue());
} else if (parameterObj instanceof Double) {
setDouble(parameterIndex, ((Double) parameterObj).doubleValue());
} else if (parameterObj instanceof byte[]) {
setBytes(parameterIndex, (byte[]) parameterObj);
} else if (parameterObj instanceof java.sql.Date) {
setDate(parameterIndex, (java.sql.Date) parameterObj);
} else if (parameterObj instanceof Time) {
setTime(parameterIndex, (Time) parameterObj);
} else if (parameterObj instanceof Timestamp) {
setTimestamp(parameterIndex, (Timestamp) parameterObj);
} else if (parameterObj instanceof Boolean) {
setBoolean(parameterIndex, ((Boolean) parameterObj).booleanValue());
} else if (parameterObj instanceof InputStream) {
setBinaryStream(parameterIndex, (InputStream) parameterObj, -1);
} else if (parameterObj instanceof java.sql.Blob) {
setBlob(parameterIndex, (java.sql.Blob) parameterObj);
} else if (parameterObj instanceof java.sql.Clob) {
setClob(parameterIndex, (java.sql.Clob) parameterObj);
} else if (this.connection.getTreatUtilDateAsTimestamp() &&
parameterObj instanceof java.util.Date) {
setTimestamp(parameterIndex,
new Timestamp(((java.util.Date) parameterObj).getTime()));
} else if (parameterObj instanceof BigInteger) {
setString(parameterIndex, parameterObj.toString());
} else {
setSerializableObject(parameterIndex, parameterObj);
}
}
}
}
Eğer SQL tipini de vermek istersek şöyle yaparız. Böylece Unicode string gönderebiliriz.ps.setObject(2,Id,Types.NVARCHAR);
Şöyle yaparız.
ps.setQueryTimeout (seconds);
setString metodu
Şöyle yaparız.
Şöyle yaparız.
ps.setString(1, ...);
Örnek
Like ile %...% karakterleri ile escape etmek için şöyle yaparız
String sql = "SELECT * FROM table1 WHERE Surname LIKE ? OR ";
sql += "Middlename LIKE ? OR Firstname LIKE ?";
PreparedStatement statement = con.prepareStatement(sql);
statement.setString(1, "%" + key + "%");
statement.setString(2, "%" + key + "%");
statement.setString(3, "%" + key + "%");
setTimeStamp metodu
Şöyle yaparız.
ps.setTimeStamp(1, new Timestamp(System.currentTimeMillis()));
Hiç yorum yok:
Yorum Gönder