31 Mart 2020 Salı

Swing AbstractTableModel Sınıfı

Giriş
Şu satırı dahil ederiz.
import javax.swing.table.AbstractTableModel;
constructor
Şöyle yaparız.
class DataModel extends AbstractTableModel{
  ArrayList<Object[]> data = new ArrayList<Object[]>();
  ArrayList<String> columnNames = new ArrayList<String>();

  public DataModel(ArrayList<String> cNames){
    super();
    columnNames = cNames;
    
  }
  ...
}
fireTableStructureChanged metodu
Açıklaması şöyle.
Model notifies the view that the data has changed. This would be done by invoking the: fireTableStructureChanged(…);
getColumnCount metodu
Şöyle yaparız.
public int getColumnCount()
{
  return columnNames.size();
};
getColumnName metodu
Şöyle yaparız.
public String getColumnName(int column)
{
  return columnNames.get(column);
}
getRowCount metodu
Şöyle yaparız.
public int getRowCount()
{
  return data.size();
};
getValueAt metodu
Şöyle yaparız.
public Object getValueAt(int rowIndex, int columnIndex){ 
  Object[] row = data.get(rowIndex);

  return row[columnIndex];
};
isCellEditable metodu
Şöyle yaparız.
public boolean isCellEditable(int rowIndex, int columnIndex)
{
  return true;
}
setValueAt metodu

Şöyle yaparızDüzenleme (Editing) işlemi bitince bu metod tetiklenir.
public void setValueAt(Object newValue, int rowIndex, int columnIndex){
  data.get(rowIndex)[columnIndex] = newValue;
  fireTableDataChanged();
}
Kendi metodumuz
Şöyle yaparız.
public void addRows (ArrayList<Object[]> rows) {
  for (int i = 0; i < rows.size(); i++) {
    Object[] clone = rows.get(i).clone();
    data.add(clone);
  }
  fireTableDataChanged();
}

30 Mart 2020 Pazartesi

JDBC DriverManager Sınıfı

Giriş
Şu satırı dahil ederiz.
import java.sql.DriverManager;
Bu sınıf DataSource ile aynı işi görür. Yeni kodlarda DriverManager yerine DataSource arayüzünden kalıtan sınıfları kullanmak lazım.

registerDriver metodu - eski kodlarda

1.1 JDBC 4'ten sonra
Artık Class.ForName()'i çağırmaya gerek yok. JVM driver'ı otomatik olarak yüklüyor.

1.2  JDBC 4'ten önce - Class.forName yöntemi
Eğer jar dosyası CLASSPATH içinde yoksa şöyle bir exception atar.
java.sql.SQLException:
No suitable driver found for jdbc:mysql://localhost:3306/mydb
SQL Server şöyle bir hata fırlatır.
java.lang.ClassNotFoundException: com/microsoft/jdbc/sqlserver/SQLServerDriver
Şöyle yaparız.
DriverManager.registerDriver (new oracle.jdbc.OracleDriver());
Bir çok kodda registerDriver çağrısı yerine Class.forName () çağrısı yapılır. Bu çağrı kendi içinde registerDriver işlemini yerine getirir.

Yani şöyle yapmaya gerek yok.
Driver d = (Driver)Class.forName("...").newInstance());
DriverManager.registerDriver (d);
Access
Şöyle yaparız.
Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");
MySQL
Şöyle yaparız.
Class.forName("com.mysql.jdbc.Driver");
Oracle
odbc*.jar dosyasının classpath içinde olması gerekir. * karakteri yerine bir sayı gelir. Örneğin ojdbc6.jar şeklinde olabilir. Oracle sitesinde bir sürü jar mevcut. Bunların farkları şöyle
  • ojdbc*.jar - all the classes to support basic functionality for the Thin and OCI drivers
  • ojdbc*_g.jar - same as ojdbc*.jar except compiled with the -g option to include debugging information and with java.util.logging calls included.
  • ojdbc*dms.jar - same as ojdbc*.jar except includes code to support Oracle Dynamic Monitoring Service (DMS). Also includes some JDBC logging support. This file can only be used when dms.jar is also in the classpath. The dms.jar file is not shipped as part of the RDBMS product. It is only available as part of the Oracle Application Server product.
  • ojdbc*dms_g.jar - same as ojdbc*dms.jar except compiled with the -g option to include debugging information and with full JDBC logging support.
  • orai18n.jar - contains the configuration information to support all Oracle character sets in Advanced Data Types (objects). If the database character set is one other than UCS2,ASCII, ISO_LATIN_1, UTF8 and AL32UTF8 and the application uses ADTs, then you must include this file in your classpath.
Açıklaması şöyle.
The odjbc is not very easy to locate since it is not on maven central and I was able to download it from http://maven.icm.edu.pl/artifactory/repo/ by including the repositories tag.
odbc*.jar maven central repository'de olmadığı için şöyle yaparız
<repositories>
  <repository>
    <id>central</id>
    <name>Maven Central</name>
    <layout>default</layout>
    <url>https://repo1.maven.org/maven2</url>
    <snapshots>
      <enabled>false</enabled>
    </snapshots>
  </repository>
  <repository>
    <id>icm</id>
    <name>ICM</name>
    <url>http://maven.icm.edu.pl/artifactory/repo/</url>
  </repository>
</repositories>    
Şöyle yaparız.
<dependency>
  <groupId>com.oracle.ojdbc</groupId>
  <artifactId>ojdbc8</artifactId>
  <version>19.3.0.0</version>
</dependency>
Kodda şöyle yaparız.
Class.forName("oracle.jdbc.driver.OracleDriver");
Bu kod çalışınca OracleDriver içindeki statik kod kendisini DriverManager sınıfına ekler. Çünkü OracleDriver içindeki static constructor şuna benzer
public class OracleDriver { 
  static {
    DriverManager.registerDriver(new OracleDriver());
  }
}
PostgreSQL
Şöyle yaparız.
Class.forName("org.postgresql.Driver");
SQLite
Şöyle yaparız.
Class.forName("org.sqlite.JDBC"); 
SQLServer
Şöyle yaparız.
Class.forName("com.microsoft.sqlserver.jdbc.SQLServerDriver");
1.3  JDBC 4'ten önce - registerDriver yöntemi
Oracle
Şöyle yaparız.

DriverManager.registerDriver(new OracleDriver());
getConnection metodu - url

PostgreSQL
Şöyle yaparız.
String url = "jdbc:postgresql://localhost:5435/mydbname?user=..."&pass=...";
Connection con = DriverManager.getConnection (url);
SQLite
Windows'ta şöyle yaparız.
Connection con = DriverManager.getConnection("jdbc:sqlite:‪C:\\database.db");
Windows'ta şöyle yaparız
Connection con = DriverManager.getConnection("jdbc:sqlite:‪C:\\database.sqlite");
Linux'ta şöyle yaparız
Connection con = DriverManager.getConnection("jdbc:sqlite:/"+ myDBpath);
SQL Server
Şöyle yaparız.
String url = "jdbc:sqlserver://localhost:1433;databaseName=CaiMaster";
Connection conn = DriverManager.getConnection(url);
Örnek
Şöyle yaparız.
java.sql.Connection conn = ;
DriverManager.getConnection("jdbc:sqlserver://localhost; integratedSecurity=true;
 databaseName=baessland; user=sa; password=1234;");
Örnek
kerberos doğrulaması için şöyle yaparız.
jdbc:sqlserver://servername=server_name;integratedSecurity=true;
authenticationScheme=JavaKerberos;userName=user@REALM;password=****

getConnection metodu - url + Properties
getConnection metodu yazısına taşıdım.

getConnection metodu - url + user + password
getConnection metodu yazısına taşıdım.

getDrivers metodu
Şöyle yaparız.
Enumeration<Driver> e = DriverManager.getDrivers();

while(e.hasMoreElements()){

  Driver d = e.nextElement();
  System.out.println(d.getClass());
  System.out.println(d.getClass().getName());

}
Çalıştırmak için şöyle yaparız.
java -cp ;ojdbc14.jar; -Djdbc.drivers=oracle.jdbc.OracleDriver MyDriverTest
Çıktı olarak şunu alırız.
class oracle.jdbc.driver.OracleDriver
oracle.jdbc.driver.OracleDriver
getLoginTimeout ve setLoginTimeout metodları
Bu metodlar ile login işlemine zaman aşımı yapmak mümkün.
// Getting timeout value
int timeout = DriverManager.getLoginTimeout();

// Setting timeout value
DriverManager.setLoginTimeout(timeout)