Merhaba arkadaşlar.

Benim de ilgili duyduğum NoSQL teknolojilerinden birisi olan MongoDB’nin diğer çok sevdiğim ortam olan Java ile nasıl kullanıldığına dair bilgilerimi tazelemek istedim ve bu yazı ile beraber 3 ya da 4 yazıda temel işlemlerden bahsedeceğim. Bu yazıda sizlere MongoDB veritabanına Java ile nasıl kayıt eklendiğini anlatmaya çalışacağım. MongoDB ve Java ile ilgili diğer yazılarımdan haberdar olmak için beni Twitter hesabımdan takip edebilirsiniz. Şimdi öncelikle kısaca MongoDB hakkında bilgi vereyim.

MongoDB Nedir?

MongoDB’yi anlamak için öncelikle NoSql‘in ne olduğunu anlamalıyız. Açılımı Not Only Sql olan NoSql günümüzde çokça kullanılan ilişkisel veritabanı mantığı yerine döküman tabanlı veri tutma yolunu tercih eden veritabanı yönetim şeklidir. Veriler JSon ya da Xml formatında tutulur. NoSql’de Join ve Foreign Key yoktur.  Bugün Big Data kavramını çok sıkça duyuyoruz ve bu kavramın beraberinde gelen verileri analiz etmek için günümüz ilişkisel veri tabanlarının yetersiz kalacağı, bu analizin ancak NoSql ile yapılabileceği söylenmekte. İnternette her an, her saniye veri üretilmekte ve devasa hale gelen bu verilerin işlenmesi için de NoSql kullanılmakta. Google ve Amazon gibi dev şirketler verileriniz NoSql tabanlı veritabanlarında tutmaktalar. Yalnız NoSql için verilerin çok mühim olduğu yerlerde (örneğin bankalarda) kullanılmaması yönününde düşünceler belirtiliyor. NoSql ilişkisel veritabanlarına göre daha performanslıdır ve bunu RAM üzerinde çalışmasına borçludur. Bu nedenle NoSql’in güncelleme ve yedekleme sistemlerine fazla güvenmemek gerekir.

MongoDB ise son zamanlarda popülaritesi gittikçe artan NoSql’in bir çeşit veri tabanı uygulamasıdır. Açık kaynak kodlu olan MongoDB verileri JSon formatında tutar ve daha çok ilişkisel veritabanlarının yetersiz kaldığı yerlerde imdada yetişmektedir. İlişkisel veritabaları gibi Indexleme özelliğine sahiptir. MongoDB Java’nın yanında C ,C++, Python, PHP ve bunlara ek bir kaç dil tarafından desteklenmektedir.

Bu kısa MongoDB bilgilendirmesinden sonra Java ile MongoDB’nin nasıl kullanılacağına geçelim.

Öncelikle Windows için buradan, OS X için de buradanişletim sisteminize uygun kurulum tamitlarını uygulayıp MongoDB’yi kurun arkadaşlar. Benim elimdeki OS X için

brew update
brew install mongodb

komutları MongoDB’yi kurmak için yetti. Windows altında kurulum da kolay. İndireceğiniz bir MSI dosyası ile kurulumu hemen yapabilirsiniz. Linux için de kurulum talimatlarını okumanızı tavsiye ederim. Kurulumu yaptıktan sonra terminalinizden cd komutu ile kök dizininize gelin ve

sudo mkdir -p /data/db (OS X İçin)
mkdir \data\db (Windows İçin)

komutlarından uygun olanı verin. Son olarak Windows’da Program Files\MongoDb\Server\SürümNo\bin altındaki mongod‘yi çalıştırın. OS X’de terminalden direk mongod komutunu verebilirsiniz. MongoDB’yi çalıştırdıktan sonra sıra Java bağlantısı yapmaya geliyor.

Geliştirme ortamınızda bir Java projesi ya da bir Maven oluşturun. İsterseniz https://oss.sonatype.org/content/repositories/releases/org/mongodb/mongo-java-driver/2.13.2/ adresinden mongo-java-driver-2.13.2.jar’ı indirin ve proje kütüphanenize ekleyin, isterseniz de aşağıdaki bağımlılığı pom.xml dosyasına ekleyerek projenize kütüphaneyi tanıtın.

<!-- https://mvnrepository.com/artifact/org.mongodb/mongo-java-driver -->
<dependency>
    <groupId>org.mongodb</groupId>
    <artifactId>mongo-java-driver</artifactId>
    <version>3.3.0</version>
</dependency>

Şimdi projemiz MongoDB’yi tanıdığı için kod yazabiliriz. Aşağıdaki MongoTest sınıfı basit bir MongoDB kullanımı içeriyor. Kodun satır satır açıklaması kodun altındadır.

MongoRecordInserting.java Kodu

    package io.github.ilkgunel.mongodb;

    /**
     *
     * @author ilkaygunel
     */
    import org.bson.Document;

    import com.mongodb.Block;
    import com.mongodb.MongoClient;
    import com.mongodb.client.FindIterable;
    import com.mongodb.client.MongoDatabase;

    import static java.util.Arrays.asList;

    import java.text.DateFormat;
    import java.text.SimpleDateFormat;
    import java.util.Date;
    import java.util.Locale;

    /**
     *
     * @author ilkaygunel
     */
    public class MongoRecordInserting {

        public static void main(String[] args) {
            MongoClient mongoClient;
            DateFormat format = new SimpleDateFormat("dd-MM-yyyy", Locale.ENGLISH);
            try {
                mongoClient = new MongoClient("localhost", 27017);
                MongoDatabase database = mongoClient.getDatabase("MongoDB");

                database.getCollection("Records").insertOne(
                        new Document("address",
                                new Document()
                                .append("street", "2 Avenue")
                                .append("zipcode", "10075")
                                .append("building", "1480")
                                .append("coord", asList(-73.9557413, 40.7720266)))
                        .append("borough", "Manhattan")
                        .append("cuisine", "Italian")
                        .append("grades", asList(
                                new Document()
                                .append("date", format.format(new Date()))
                                .append("grade", "A")
                                .append("score", 11),
                                new Document()
                                .append("date", format.format(new Date()))
                                .append("grade", "B")
                                .append("score", 17)))
                        .append("name", "Vella")
                        .append("restaurant_id", "41704620"));
            } catch (Exception e) {
                System.err.println("Bir Hata Meydana Geldi!");
                System.out.println("Hata" + e);
            }
        }
    }

Kodumuzu adım adım inceleyerek devam edelim arkadaşlar.

  1. MongoDB veritabımıza MongoClient sınıfından bir nesne ile bağlantı kuruyoruz. MongoClient kullanmak istediğimizde Checked Exception işin içine girdiğinden kodlarımızı try-catch bloğu içinde yazıyoruz.
  2. Local makinede çalıştığımız için hostumuz localhost oluyor. MongoDB de kurulum ayarları itibari ile 27017 portu üzerinden hizmet veriyor ve biz de bu portu parametre olarak veriyoruz.
  3. mongoClient.getDatabase(“VeritabanıAdı”); diyerek MongoDB veritabanımızla bağlantı kuruyoruz ve dönen sonucu bir MongoDatabase sınıfı türünden değişkene atıyoruz. Burada veritabanını daha önce oluşturmamış olmanız önemli değil. Sizin için yoksa oluşturuyor.
  4. Oluşturmuş olduğumuz MongoDatabase nesnesinin getCollection("CollectionAdı") metodu ile koleksiyona bağlantı sağlıyoruz. Koleksiyonu tam olarak olmasa da ilişkisel veri tabanı yapısındaki tabloya karşılık geliyor diye düşünebiliriz. Veritabanı gibi koleksiyon da yoksa oluşturuluyor.
  5. Koleksiyona bağlantı sağladıktan sonra ona bir kayıt eklemek istiyoruz ve bunun için insertOne metodunu kullanıyoruz.  İlişkisel veritabanındaki tablodaki sütunlar tek bir çeşit veri tutabilirler. MongoDB'de ise JSON'dan gelen bir özellik olarak içiçe (nested) alanlar kullanılabiliyor. Örneğin burada address bir kolon olarak düşünülürse onun içinde başka bilgiler de, alt bilgiler de barınıyor. Street, zipcode gibi.
  6. append metodu ise yeni kolonlar ekliyor olarak düşünülebilir. borough ve cuisine alanları örneğin yeni birer sütunlar.
  7. Bir alan eğer birden fazla alt değer tutacaksa bunu asList metodu sağlayabiliriz. Örneğin grades alanı altına iki döküman eklenecek. address alanında tek döküman eklemiştik, grades'de ise iki döküman yani iki farklı değer eklenecek. Bu bu dökümanların asList metodu içinde yazılması ile sağlanabilir.
  8. catch'in hemen üzerinde görülen iki append metodu ise tıpkı borough ve cuisine gibi iki yeni kolon (aslında property) ekliyor.

Ekran Çıktısı

Kodumuzu çalıştırıp MongoClient üzerinden dökümanımızı kontrol ettiğimizde sonuç şöyle:

Yukarıdaki kodumuz tek bir kayıt eklemek için kullanılabilecek bir durumdur. Peki birden çok kaydı bir seferde eklemek istersek ne yapmalıyız? Bu durumda da insertMany metodunu kullanmamız gerekir.

package io.github.ilkgunel.mongodb;

/**
 *
 * @author ilkaygunel
 */
import org.bson.Document;

import com.mongodb.Block;
import com.mongodb.MongoClient;
import com.mongodb.client.FindIterable;
import com.mongodb.client.MongoDatabase;

import static java.util.Arrays.asList;

import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.Locale;

/**
 *
 * @author ilkaygunel
 */
public class MongoDBBasicUsage {

    public static void main(String[] args) {
        MongoClient mongoClient;
        DateFormat format = new SimpleDateFormat("dd-MM-yyyy", Locale.ENGLISH);
        try {
            mongoClient = new MongoClient("localhost", 27017);
            MongoDatabase database = mongoClient.getDatabase("MongoDB");

            List<Document> documents = new ArrayList<>();

            for(int i=0;i<=4;i++){
                documents.add(new Document("address",
                            new Document()
                            .append("street", "2 Avenue")
                            .append("zipcode", "10075")
                            .append("building", "1480")
                            .append("coord", asList(-73.9557413, 40.7720266)))
                    .append("borough", "Manhattan")
                    .append("cuisine", "Italian")
                    .append("grades", asList(
                            new Document()
                            .append("date", format.format(new Date()))
                            .append("grade", "A")
                            .append("score", 11),
                            new Document()
                            .append("date", format.format(new Date()))
                            .append("grade", "B")
                            .append("score", 17)))
                    .append("name", "Vella")
                    .append("restaurant_id", "41704620"));
            }

            database.getCollection("Records").insertMany(documents);
        } catch (Exception e) {
            System.err.println("Bir Hata Meydana Geldi!");
            System.out.println("Hata" + e);
        }
    }
}

Kodumuz içerisinde öncelikle Documents tipinde bir liste oluşuturuyoruz. Akabinde for döngüsü ile döküman oluşuturup dökümanı listeye ekliyoruz. Son aşamada ise oluşutup doldurduğumuz bu listeyi insertMany metoduna parametre olarak veriyoruz.

Ekran Çıktısı

insertMany metodu ile kayıt eklediğimizde de durum şöyledir:

Resimde gördüğünüz gibi az önce eklediğimiz 1 kayıt ve insertMany ile eklenen 5 kayıt ile toplam 6 kayıt veri tabanında görünüyor.

Bu yazımızda bu kadar sevgili arkadaşlar. Gelecek yazıda kayıt çekme işlemlerini anlatmaya çalışacağım.. Sağlıcakla kalın.

Selam ve Sevgilerimle

Yararlandığım Bazı Kaynaklar:

http://aslitonbul.blogspot.com.tr/2014/01/nosql-nedir.html

http://www.yunusmete.com/2014/02/09/mongodb-ve-nosql/

http://yazilimdersi.info/makaleler/detay/61/java-ile-mongodb-kullanimi

http://www.mertsarac.com/blog/post/nosql-nedir-nasil-kullaniliyor