29 Haziran 2015 Pazartesi

Hibernate sql sorgu parametrelerini görüntülemek

Merhaba arkadaşlar,
bu yazımda sizlere küçük fakat önemli bir ayrıntıdan bahsedeceğim.
Hibernate ile veri tabanı işlemleri yaparken eğer özel bir ayar yapmadıysaınız sorgu parametrelerini göremezsiniz. Bazı durumlarda bu parametreleri görüntüleme ihtiyacınız doğabilir. Örneğin veri tabanına insert edilen değerleri debug yöntemiyle görmek isteyebilirsiniz. bu durumda yapmanız gereken iki adım var.

1-)hibernate.cfg.xml dosyasında sql cümlesini görüntülemek için  aşağıdaki ayarı yapın
 <property name="show_sql">true</property>

2-) log4j.properties dosyasında hibernate log level ını INFO yada ALL seviyesine çekin.


log4j.logger.org.hibernate=INFO

veya


 log4j.logger.org.hibernate.type=ALL

bu işlemler sonunda  hibernate ile yaptığınız db operasyonlarının parametre bazlı inceleyebilirsiniz.

üstteki ayarlardan önce:
  insert into persons (age, createdate, lastname, name) values (?, ?, ?, ?)

ayar yaptıktan sonra :
 Hibernate: insert into persons (age, createdate, lastname, name) values (?, ?, ?, ?)
00:25:37,219 TRACE BasicBinder:82 - binding parameter [1] as [INTEGER] - 33
00:25:37,228 TRACE BasicBinder:82 - binding parameter [2] as [DATE] - Mon Jun 29 00:25:37 EEST 2015
00:25:37,242 TRACE BasicBinder:82 - binding parameter [3] as [VARCHAR] - veli
00:25:37,242 TRACE BasicBinder:82 - binding parameter [4] as [VARCHAR] - ali


Bir önceki yazım için hazırladığım projede üstteki ayarları yapmıştım. Aşağıdaki linkten bu projeye erişebilirsiniz.

kaynak dosyalar(github) : indirmek için tıklayın







Hibernate ile CRUD işlemleri

Merhaba,
bu yazımda sizlere hibernate ile veritabanı üzerinde  CRUD(kayıt oluşturma ,silme , güncelleme , listeleme) nasıl yapıldığını göstereceğim.

Aşağıda dikkat etmeniz gereken noktaların açıklamalarını yazacağım ve yazının sonunda da projenin kaynak kodlarını yine sizlerle paylaşıyor olacağım.

1 -) java application projesi oluşturun. Dizin yapısının alışılagelmiş biçimde olması için ben spring application projesi oluşturdum. Normalde bu yazının spring ile bir bağlantısı yoktur.

proje yapısı aşağıdaki gibi olacaktır:




2 -) Pom.xml 'e hibernate ve mysql bağımlılığını tanımlayın. Ayrıca hibernate in bağımlılıklarından biri de log4j dir.

 <!--MySQL database driver-->
<dependency>
    <groupId>mysql</groupId>
    <artifactId>mysql-connector-java</artifactId>
    <version>5.1.9</version>
</dependency>



 <!--Hibernate -->
<dependency>
    <groupId>org.hibernate</groupId>
    <artifactId>hibernate-core</artifactId>
    <version>3.6.3.Final</version>
</dependency>

<dependency>
    <groupId>javassist</groupId>
    <artifactId>javassist</artifactId>
    <version>3.12.1.GA</version>
</dependency>


 <!-- slf4j-log4j -->
<dependency>
    <groupId>org.slf4j</groupId>
    <artifactId>slf4j-log4j12</artifactId>
    <version>1.6.1</version>
</dependency>



3 -) hibernate.cfg.xml ile hibernate erişim ayarlarını yapın. Hangi veri tabanına bağlanacağını , hangi entity ile işlem yapacağını , kullanıcı adını , şifresini ve veri tabanı türünü belirtin.

<hibernate-configuration>
    <session-factory>
        <property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property>
        <property name="hibernate.connection.url">jdbc:mysql://localhost/test_spring</property>
        <property name="hibernate.connection.username">root</property>
        <property name="hibernate.connection.password">12345678</property>
        <property name="hibernate.dialect">org.hibernate.dialect.MySQLDialect</property>
        <property name="show_sql">true</property>
        <mapping class="com.company.entities.Person" ></mapping>
    </session-factory>
</hibernate-configuration> 






4 -)  HibernateUtil.java dosyasında bir static session oluşturalım. Hibernate bilgileri session üzerinde güncelleyerek veri tabanıyla eşleştirir.



 public class HibernateUtil {

    private static final SessionFactory SESSION_FACTORY  = new Configuration().configure().buildSessionFactory();


    public static SessionFactory getSession(){
        return SESSION_FACTORY;
    }

    public static void closeSession(){
        getSession().close();
    }

}


5 -)  Create(oluşturma) İşlemi

         Session session = HibernateUtil.getSession().openSession();

//        CREATE
        session.beginTransaction();
        Person person = new Person();

        person.setCreatedate(new Date());
        person.setAge(33);
        person.setName("ali");
        person.setLastname("veli");

        session.save(person);
        session.getTransaction().commit();


SQL:
 CREATE TABLE `persons` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `name` varchar(255) DEFAULT NULL,
  `lastname` varchar(255) DEFAULT NULL,
  `age` int(11) DEFAULT NULL,
  `createdate` date NOT NULL,
  PRIMARY KEY (`id`)
)

Yazı kısa olsun diye daha fazla detaya girmiyorum. anlaşılmayan bir yer olursa çekinmeden sorabilirsiniz.

kaynak dosyalar(github) : indirmek için tıklayın

14 Haziran 2015 Pazar

Spring - Apache Tiles Entegrasyonu (Template Oluşturma)

Merhaba,
şuana kadarki yazılarımdaki örnekleri incelediğinizde işlemlerin tamamını  tek bir Jsp  sayfasında  yaptığımı göreceksiniz. Bu yazımda ise bir Jsp sayfası içerisine başka sayfalarında dahil edilmesi işleminden bahsedeceğim. Template oluşturma yapısından bahsediyorum(alttaki görüntü)

Aslında bütün web ve yazılım  projelerinde ortak kullanılan alanlar(Header,Footer,Menu) belirlenerek ilgili sayfada çağrılır. Bu şekilde her sayfada aynı kodların yazılmasının önüne geçilmiş olur. Esasında her sayfa için aynı kodları yazarak ta sonuca gidebilirsiniz ancak bakım,tutum ve yeni eklenecek özellikleri de(geliştirme) göz önünde bulundurursak bu yazımda anlatacağım yöntem ilginizi çekecektir diye düşünüyorum. Evet anahtar kelimeyi paylaşıyorum : Apache tiles (Döşeme)

Öncelikle bu yapıyı kullanmak için illede Apache Tiles kullanmak durumunda değilsiniz.
<jsp:include page="WEB-INF/common/header.jsp" /> 
 Şeklinde ki direktiflerle de ortak kullanılan kısımları tek sayfada toplayabilirsiniz.  Güzel ama daha  iyi bir yolu yok mu bu işin diye soracağınızı düşünerek sizlere Apache Tiles Kullanmanızı tavsiye ediyorum. Nasıl kullanacağız sorusuna cevaben  bu yazıda Spring ile entegre ederek bu işlemi gerçekleştireceğiz.

1-  Projemize intelliJ ile bir web projesi oluşturarak başlıyoruz.

2-  log4j yi  pom.xml'e  ekleyin.


<!-- Logging -->
<dependency>
    <groupId>org.slf4j</groupId>
    <artifactId>slf4j-api</artifactId>
    <version>${org.slf4j-version}</version>
</dependency>
<dependency>
    <groupId>org.slf4j</groupId>
    <artifactId>jcl-over-slf4j</artifactId>
    <version>${org.slf4j-version}</version>
    <scope>runtime</scope>
</dependency>
<dependency>
    <groupId>org.slf4j</groupId>
    <artifactId>slf4j-log4j12</artifactId>
    <version>${org.slf4j-version}</version>
    <scope>runtime</scope>
</dependency>


3- tiles'ı  pom.xml e ekleyin
<!-- Tiles -->
<dependency>
    <groupId>org.apache.tiles</groupId>
    <artifactId>tiles-extras</artifactId>
    <version>${tiles-version}</version>
</dependency>



4- mvc-dispatcher-servlet.xml    üzerinden spring/apache-tiles bağlantısını yapın
<!-- Tiles configuration -->
<bean id="tilesConfigurer"
      class="org.springframework.web.servlet.view.tiles3.TilesConfigurer">
    <property name="definitions">
        <list>
            <value>/WEB-INF/tiles/tiles-definitions.xml</value>
        </list>
    </property>
</bean>

<bean id="viewResolver"
      class="org.springframework.web.servlet.view.UrlBasedViewResolver">
    <property name="viewClass" value="org.springframework.web.servlet.view.tiles3.TilesView" />
</bean>



5- tiles-definitions.xml  dosyasında layout yapısını tasarlıyoruz.
<?xml version="1.0" encoding="ISO-8859-1" ?>
<!DOCTYPE tiles-definitions PUBLIC
        "-//Apache Software Foundation//DTD Tiles Configuration 3.0//EN"
        "http://tiles.apache.org/dtds/tiles-config_3_0.dtd">
<tiles-definitions>

    <definition name="singleLayout" template="/WEB-INF/template/singleLayout.jsp" />


    <definition name="mainLayout" template="/WEB-INF/template/mainLayout.jsp">
        <put-attribute name="header" value="/WEB-INF/template/fragments/header.jsp" />
        <put-attribute name="menu" value="/WEB-INF/template/fragments/menu.jsp" />
        <put-attribute name="footer" value="/WEB-INF/template/fragments/footer.jsp" />
    </definition>

</tiles-definitions>



burada singleLayout ve mainLayout diye iki tanım yaptım. Birinde sade bir sayfa yapısı olacak diğerinde üst menü ve footer bilgileri de gelecek.

Ben bu projede header ve footer alanlarına bootstrap kaynaklarını ekledim. Yavaş yavaş görsel tarafada ağırlık verelim istedim.

Sayfalarda yukarıda tanımladığımız layout-tiles çağrısı yapıldıktan sonra içerik sayfaya özgü olarak girilir.

örnek sayfa içeriği  aşağıdaki gibidir:
about.jsp:
<%@ taglib uri="http://tiles.apache.org/tags-tiles" prefix="tiles" %>

<tiles:insertDefinition name="mainLayout">
    <tiles:putAttribute name="body">


        <h1>About page !</h1>

        <p>Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore
            magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea
            commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat
            nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit
            anim id est laborum.</P>


    </tiles:putAttribute>
</tiles:insertDefinition>


AboutController.java
package com.company.controller;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.servlet.ModelAndView;

/**
 * Created by root on 6/14/15.
 */
@Controller
public class AboutController {

    private static final Logger logger = LoggerFactory.getLogger(AboutController.class);

    @RequestMapping(value = "/about", method = RequestMethod.GET)
    public ModelAndView about(){
        ModelAndView mv = new ModelAndView("about");
        return mv;
    }

}


NOT: log4j kütüphanesi apache tiles ın gereksinimlerinden biridir. projenize log4j yi dahil etmeniz gerekmektedir.

NOT2: Tiles versiyonları önemlidir. Burada ben tiles3 kullandım. Diğer versiyonlarda ki  ufak tefek farklılıklar başlangıç aşamasında  kafanızı karıştırabilir. ilk aşamada benimle aynı spring versiyonunu ve apache-tiles versiyonunu kullanmanızı tavsiye ediyorum

kaynak dosyalar(github) : indirmek için tıklayın

Spring ile sayfa kaynaklarına mapping yöntemiyle erişim

Merhaba, bu yazımda sizlere spring projelerinize kaynak(css, js, png,.. vs) dosyaları nasıl dahil edeceğinizi anlatacağım.

1- öncelikli olarak bir spring web projesi oluşturun.

2- webapp dizini altında resources dizini ve onun altında da erişmek istediğiniz kaynakları  oluşturun
ÖRN: css/custom.css
resources/css/custom.css


3- beans xml dosyasının en üst kısmına(defination yapılan kısma) alttaki  satırları ekleyin. bu sayede spring mvc ile resources mapping (kaynak haritalama-tanımlama) işlemi gerçekleştireceğiz
xmlns:mvc="http://www.springframework.org/schema/mvc"

(xsi:schemaLocation kısmınada bu satırları eklemelisiniz)
http://www.springframework.org/schema/mvc
http://www.springframework.org/schema/mvc/spring-mvc.xsd


4- resoources dizinindeki tüm kaynakları static path olarak map edin.
<!--resources access(mapping)--><mvc:resources mapping="/static/**" location="/resources/"/>
<mvc:annotation-driven/>

üstteki tanımın,  resources/ dizinindeki tüm kaynaklara static sözcüğü(path) ile erişeceğim demektir.


5-  Aşağıdaki şekilde kaynak(css) dosyaları sayfanıza dahil edebilirsiniz.
<link rel="stylesheet" href="${pageContext.request.contextPath}/static/css/custom.css">

6- Aşğağıdaki tanımla da png dosyalarını syfanıza çağırabilirsiniz.
<img src="${pageContext.request.contextPath}/static/img/spring.png" />

sonrasında çağırmak istediğiniz dosyaları yine benzer şekilde çağırabilirsiniz


NOT: Üstteki şekilde map ederek kaynakları sayfalarda çağırmanız durumunda;  oluşan html sayfalarında sağ tıklayıp kaynağı görüntüle dendiğinde kaynak dosyaların gerçek dizinleri değil map edilmiş dizinleri görünecektir. Bu da projenizi güvenlik konularında bir adım daha öne taşıyacaktır.


kaynak dosyalar(github) : indirmek için tıklayın