Bildiğiniz gibi NamedQuery sayesinde sorguları sürekli yazmaktan kurtuluyorduk.Entity sınıflarımız içerisinde tanımlayarak istediğimiz zaman bu sorgulara erişim sağlayabiliyorduk.Önceki yazımda parametresiz NamedQuery’den bahsetmiştik.Bu yazımda ise NamedQuery içerisine parametre gönderme işleminden bahsedeğiz.
1)Maven projesi oluşturalım ve pom.xml dosyamız içerisine bağımlılıklarımızı ekleyelim.
[code lang=”xml”]
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>0003-Blog-com.enesbyc.NamedQuery-Parametreli</groupId>
<artifactId>0003-Blog-com.enesbyc.NamedQuery-Parametreli</artifactId>
<version>0.0.1-SNAPSHOT</version>
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>3.8.1</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-core</artifactId>
<version>4.3.5.Final</version>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.6</version>
</dependency>
</dependencies>
<build>
<sourceDirectory>src</sourceDirectory>
<resources>
<resource>
<directory>src</directory>
<excludes>
<exclude>**/*.java</exclude>
</excludes>
</resource>
</resources>
<plugins>
<plugin>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.5.1</version>
<configuration>
<source>1.7</source>
<target>1.7</target>
</configuration>
</plugin>
</plugins>
</build>
</project>
[/code]
2)Projemize tekrar sağ tıklayarak File -> New -> Other -> XML File adımlarını izleyelim.XML seçip hibernate.cfg.xml dosyamızı projemize ekleyelim.Burada isim önemli farklı bir isimde açarsak proje bu xml dosyasını görmeyecektir ve hibernate configrasyon yapılamayacaktır.Hibernate dosyamız içerisinde veritabanı bağlantı bilgilerinde veritabanı adı , bağlanacağımız kullanıcı adı ve şifre alanlarını kendi veritabanımıza göre dolduralım.
[code lang=”xml”]
<?xml version=’1.0′ encoding=’utf-8′?>
<!DOCTYPE hibernate-configuration PUBLIC "-//Hibernate/Hibernate Configuration DTD 3.0//EN" "http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd">
<hibernate-configuration>
<session-factory>
<!– Database connection settings –>
<property name="connection.driver_class">com.mysql.jdbc.Driver</property>
<property name="connection.url">jdbc:mysql://localhost:3306/deneme</property>
<property name="connection.username">root</property>
<property name="connection.password"></property>
<!– JDBC connection pool (use the built-in) –>
<property name="connection.pool_size">1</property>
<!– SQL dialect –>
<property name="dialect">org.hibernate.dialect.MySQLDialect</property>
<!– Disable the second-level cache –>
<property name="cache.provider_class">org.hibernate.cache.internal.NoCacheProvider</property>
<!– Echo all executed SQL to stdout Sql kodlarını consolda gösterir.–>
<property name="show_sql">true</property>
<!– Drop and re-create the database schema on startup Eğer önceden böyle bir tablo varsa silip yeni oluşturur. –>
<property name="hbm2ddl.auto">create</property>
<mapping class="com.enesbyc.Student"/>
</session-factory>
</hibernate-configuration>
[/code]
3) com.enesbyc paketi oluşturalım ve içerisinde Student sınıfımızı oluşturalım.Bu sınıf içerisinde veritabanımızda haritalanması için Entity anotasyonunu sınıfımızın üst kısmına yazalım. Ayrıca bu sınıf içerisindeki alanların özelliklerini belirtelim.Burada belirtilen özelliklere göre veritabanında haritalama işlemi yapacaktır.NamedQueries anotasyonu ile içerisine birden fazla NamedQuery yazabiliyoruz.Student.findByStudentID isminde bir query oluşturduk.Bir sonraki adımda main dosyamız içerisiden bu isim sayesinde sorgumuza ulaşacağız.Bu query içerisine ‘:studentID’ isminde bir parametre göndereceğimizi belirtiyoruz ve gönderdiğimiz studentID değeri tablomuz içerisindeki studentID ile işleşen verileyi return ediyor.
[code lang=”java”]
package com.enesbyc;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import org.hibernate.annotations.NamedQueries;
import org.hibernate.annotations.NamedQuery;
@Entity
@NamedQueries({
@NamedQuery(name="Student.findByStudentID",query="SELECT s FROM Student s WHERE s.studentID=:studentID")})
public class Student {
@Id//Primary Key alani oldugunu belirtiyoruz.
@GeneratedValue(strategy=GenerationType.AUTO)//Id degerinin otomatik artmasini sagliyoruz.
@Column(name="Student_ID")
private int studentID;
@Column(name="Student_Name")
private String name;
@Column(name="Student_Surname")
private String surname;
public int getStudentID() {
return studentID;
}
public void setStudentID(int studentID) {
this.studentID = studentID;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getSurname() {
return surname;
}
public void setSurname(String surname) {
this.surname = surname;
}
}
[/code]
4)Test sınıfımızı oluşturalım ve içerisinde yazdığımız Query’yi çağıralım.
[code lang=”java”]
package com.enesbyc.test;
import org.hibernate.Query;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.cfg.Configuration;
import com.enesbyc.Student;
public class Test {
@SuppressWarnings({ "deprecation"})
public static void main(String[] args) {
//2 adet ögrenci olusturuyoruz.
Student student=new Student();
student.setName("Enes");
student.setSurname("Boyaci");
Student student2=new Student();
student2.setName("Ekrem");
student2.setSurname("Günes");
SessionFactory sessionFactory=new Configuration().configure().buildSessionFactory();
Session session=sessionFactory.openSession();
session.beginTransaction();
//Oluþturdugumuz öðrencileri veritabanina kaydedelim.
session.save(student);
session.save(student2);
//NamedQuery’de olusturdugumuz Student.findByStudentID içerisindeki sorgu ifadesini çalistiracak.
Query query = session.getNamedQuery("Student.findByStudentID");
//Student ID’si 1 olan degeri bize geri döndürecektir.
query.setParameter("studentID", 1);
//Student.findByStudentID sorgusu içerisinden gelen degeri foundStudent içerisine atalim.
Student foundStudent=(Student) query.list().get(0);
System.out.println(foundStudent.getName()+" "+foundStudent.getSurname() );
session.getTransaction().commit();
}
}
[/code]
5)Projemizi çalıştıralım ve konsol üzerinden çıktımızı kontrol edelim.Çıktımızdada gördüğümüz gibi named query sayesinde sorguları tekrar tekrar yazmaktan kurtuluyoruz.
