22 Mayıs 2017 Pazartesi

EntityManager Sınıfı

Giriş
Şu satırı dahil ederiz.
import javax.persistence.EntityManager;
Bu sınıfı EntityManagerFactory tarafından yaratılır. Açıklaması şöyle
In general you need a single Entity Manager per transaction. And this Entity Manager must not be used in two transactions at the same time.
Bu sınıf @PersistenceContext Anotasyonu tarafından inject edilebilir.

constructor
Şöyle yaparız.
EntityManagerFactory emf = ...;
EntityManager em = emf.createEntityManager();
close metodu
Şöyle yaparız.
em.close();
createNamedQuery metodu
JQL kullanan bir Query nesnesi döner. JQL cümlesine isim ile erişiriz. Şöyle yaparız.
Query q = em.createNamedQuery("Card.findPrefix");
createNativeQuery metodu
SQL kullanan bir Query nesnesi döner. Şöyle yaparız.
Query q = em.createNativeQuery("select count(*) from your_table_name")
createQuery metodu
JQL kullanan bir Query nesnesi döner. Şöyle yaparız.
Query q = em.createQuery("SELECT s FROM Status s WHERE s.statusName =:status");
Dışarından alınacak parametreler ":" karakteri ile başlayan değişkenlerle belirlenir. Bu değişkenlere değerleri setParameter() metodu ile atanır.

find metodu
Şöyle yaparız.
Foo foo = em.find(Foo.class, fooId);
find ve getReference farkı şöyle
// will return the persistent instance and never returns an uninitialized instance
em.find(Owner.class, id);

// might return a proxied instance that is initialized on-demand
em.getReference(Owner.class, id);
Benzer mantık Hibernate Session sınıfında da var.
// will return the persistent instance and never returns an uninitialized instance
session.get(Owner.class, id);

// might return a proxied instance that is initialized on-demand
session.load(Owner.class, id);
flush metodu
Şöyle yaparız.
em.flush();
getTransaction metodu
EntityTransaction nesnesi döner. Şöyle yaparız.
EntityManager em = entityManagerFactory.createEntityManager();
em.getTransaction().begin();

em.persist(...);
em.persist(...);
em.persist(...);

em.getTransaction().commit();
joinTransaction metodu
Açıklaması şöyle
The purpose of entityManager.joinTransaction(); is to notify the persistence context to synchronize itself with the current transaction.
Şöyle yaparız.
em.joinTransaction();
merge metodu
OneToMany ilişikilerde CascadeType = MERGE ise yeni bir child eklenirse, yeni nesneyi kaydeder ve sonuç olarak döner.
Copy the state of the given object onto the persistent object with the same identifier. If there is no persistent instance currently associated with the session, it will be loaded. Return the persistent instance. If the given instance is unsaved, save a copy of and return it as a newly persistent instance. The given instance does not become associated with the session. This operation cascades to associated instances if the association is mapped withcascade="merge".
persist metodu
@Entity olarak işaretli bir nesnesi veritabanına kaydeder. Şöyle yaparız.
em.getTransaction().begin();
  Foo foo = new  Foo(...);
  em.persist(k);
em.getTransaction().commit();
unwrap metodu
Ne işe yaradığını anlamadım. Şu satırı dahil ederiz.
import org.hibernate.Session;
Şöyle yaparız.
Session session = em.unwrap(Session.class);



@PersistenceContex Anotasyonu

unitName
Elimizde şöyle bir XML olsun.
<persistence xmlns="http://java.sun.com/xml/ns/persistence"
  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xsi:schemaLocation="http://java.sun.com/xml/ns/persistence
    http://java.sun.com/xml/ns/persistence/persistence_2_0.xsd"
  version="2.0">
  <persistence-unit name="manager1" transaction-type="RESOURCE_LOCAL">
    <provider>org.hibernate.ejb.HibernatePersistence</provider>

    <properties>
      <property name="javax.persistence.jdbc.driver"
        value="com.mysql.jdbc.Driver"/>
      <property name="javax.persistence.jdbc.user" value="root"/>
      <property name="javax.persistence.jdbc.password" value="mypassword"/>
      <property name="javax.persistence.jdbc.url"
         value="jdbc:mysql://localhost/ptbrowserdb"/>
      <property name="hibernate.dialect"
        value="org.hibernate.dialect.MySQLDialect"/>
  </properties>
  </persistence-unit>
</persistence>
Şöyle yaparız.
@PersistenceContext(unitName = "manager1")
private EntityManager entityManager;

21 Mayıs 2017 Pazar

Scanner Sınıfı

Giriş
Şu satırı dahil ederiz.
import java.util.Scanner;
Scanner stream'den okuma yapmamızi sağlar

constructor - File
Şöyle yaparız
File file = ...
Scanner sc = new Scanner (file); 
constructor - Stream
Şöyle yaparız.
Scanner sc = new Scanner(System.in);
close metodu
Nesneyi ve sarmaladığı stream'i kapatır. Stream'den bir daha okuma yapılamaz. Şu kod System.in kapatıldığı için hata verir.
Scanner sc=new Scanner(System.in);
sc.close();
Scanner sc1=new Scanner(System.in);
sc1.nextInt();
hasNextDouble metodu
Şöyle yaparız.
while (sc.hasNextDouble()){
  double negNum = sc.nextDouble();
  ...       
}
hasNextInt metodu
Şöyle yaparız.
while (sc.hasNextInt()){
  int num = nsc.nextInt();
  ...       
}
Pozitif bir sayı okumak için şöyle yaparız.
int number;
do {
  System.out.println("Input Number ");
  while (!sc.hasNextInt()) {
    System.out.println(" not a number!");
    sc.next(); 
  }
  number = sc.nextInt();
} while (number <= 0);
locale metodu
Locale nesnesi döner. Şöyle yaparız.
Locale lc = new Scanner(System.in).locale();
nextX metodları
Bu metodları çağırmadan önce hasX ile okuma işleminin yapılıp yapılamayacağını kontrol etmek iyi olabilir. Eğer nextX çağrısı ile istenilen token tipi eşleşmezse
java.util.InputMismatchException
fırlatılır. Eğer stream'in sonuna geldiysek
java.util.NoSuchElementException
fırlatılır.

next metodu
Bir sonraki kelimeyi döndürür. Dosyamız şöyle olsun
foo bar foo
bar baz
Her next()'i çağırışımızda foobarfoobarbar kelimelerini alırız

nextInt metodu
Şöyle yaparız
Scanner sc =new Scanner(System.in);
System.out.println("Enter your integer here");
int i = sc.nextInt();
nextLine metodu
Açıklaması şöyle. Satır sonuna kadar olan her şeyi okur.
Advances this scanner past the current line and returns the input that was skipped. This method returns the rest of the current line, excluding any line separator at the end. The position is set to the beginning of the next line.
Tüm satırı okumak için şöyle yaparız
Scanner sc = new Scanner(System.in);
System.out.print("Enter file path: ");
String filepath = sc.nextLine();
Boş string dönebilir. Şöyle kontrol ederiz.
String lastName = sc.nextLine();
if(lastName.isEmpty()){...}
Eğer aynı satırda int ve double varsa ve diğer satıra geçmek istiyorsak şöyle yaparız.
int i = sc.nextInt();double d = sc.nextDouble();sc.nextLine(); // This line
reset metodu
Açıklaması şöyle
Resets the "metadata" associated with the scanner - its whitespace, delimiter characters, and so on. It does not change the state of its input,
Ayrıca şöyle
Only "resets" locale, radix and delimiter settings. It does not do anything to the data it already read.
Şöyle yaparız.
sc.reset();
useDelimeter metoduAçıklaması şöyle
useDelimiter
public Scanner useDelimiter(String pattern)
Sets this scanner's delimiting pattern to a pattern constructed from the specified String.
Ayraç düzenli ifadedir (regular expression - regex)

1.Satır satır alan okuma yapacaksak \n karakterini mutlaka dahil etmek gerekir. Şöyle yaparız.
sc.useDelimiter (",|\n");
Elimizde şöyle bir dosya olsun
JAKIE JOHNSON,2051.59
SAMUEL PAUL SMITH,10842.23
ELISE ELLISON,720.54
Birinci alan şöyledir
JAKIE JOHNSON,2051.59
^^^^^^^^^^^^^
İkinci alan şöyledir. Yeni satır da ayraç olduğu için satır sonunda okuma durur.
JAKIE JOHNSON,2051.59
              ^^^^^^^
Eğer yeni satırı ayraç olarak vermezsek şöyle olur. Okuma bir sonraki satırda durur ve hata oluşur!
JAKIE JOHNSON,2051.59
              ^^^^^^^
SAMUEL PAUL SMITH,10842.23
^^^^^^^^^^^^^^^^^
2. Eğer çift satır atlamak istersek şöyle yaparız.
Scanner sc = ...;
sc.useDelimiter("\n\n");   
3. Tek bir satırda alan okumak istersek şöyle yaparız.
// \\s* means 0 or more repetitions of any whitespace character 
 // fish is the pattern to find
sc.useDelimiter("\\s*fish\\s*");
Düzenli ifade olarak şu değerler kullanılabilir.
abc    Letters
123    Digits
\d      Any Digit
\D      Any Non-digit character
.       Any Character
\.      Period
[abc]   Only a, b, or c
[^abc]  Not a, b, nor c
[a-z]   Characters a to z
[0-9]   Numbers 0 to 9
\w      Any Alphanumeric character
\W      Any Non-alphanumeric character
{m}     m Repetitions
{m,n}   m to n Repetitions
*       Zero or more repetitions
+       One or more repetitions
?       Optional character
\s      Any Whitespace
\S      Any Non-whitespace character
^…$     Starts and ends
(…)     Capture Group
(a(bc)) Capture Sub-group
(.*)    Capture all
(ab|cd) Matches ab or cd
useLocale metodu
Şöyle yaparız.
sc.useLocale(Locale.US);