MySQL Veritabanı
MySQL oldukça yaygın olarak kullanılan bir veritabanı yönetim sistemidir. MySQL ile çalışmaya başlamak oldukça kolaydır, ancak şüphesiz yetenekli bir ürün olması beraberinde detayları da getirmektedir. Burada MySql veritabanı yönetim sistemi temel noktada ele alınacak ve bundan sonraki uygulamalarda bu veritabanı yönetim sistemi kullanılacaktır.
MySQL vt kullanabilmek için MySQL resmi sitesinden yararlanılabilir. VTYS ile uğraşan uygulamacılar, genelde konsol ortam çalışmayı severler ancak MySQL workbench isimli görsel bir program ile işlemler kolaylıkla yapılabilir. Workbench ile veritabanı oluşturmak oldukça kolaydır. Öncelikle Username ve Password ile bağlanılması gerekmektedir.
Workbench uygulamasının SQL editoru yardımıyla çeşitli komutlar burada da kullanılabilmektedir. SQL editorunde "use" komutuyla kullanılacak veritabanı yönetim sisteminde ismi belirtilebilir. "use" komutu kullanmak yerine aktif veritabanı belirlenerek ilgili komutlar kullanılabilir.
JDBC Kullanarak MySQL Erişimi
JDBC kullanabilmek için öncelikle bir Connector-jar dosyasına ihtiyaç bulunmaktadır. MySQL resmi sitesinden bu jar dosyasına erişilebilir. Buna göre MySql erişimi için driver ve url erişiminde ilişkin yollar aşağıdaki gibidir.
private static final String JDBC_DRIVER = "com.mysql.jdbc.Driver";
private static final String DB_URL = "jdbc:mysql://localhost:3306/mydictionarydb";
private static final String USER_NAME = "root";
private static final String PASSWORD = "csd1993"
Connection conn = DriverManager.getConnection(DB_URL, USER_NAME, PASSWORD); Statement stmt = conn.createStatement()
- Anahtar Not: Genel olarak bir projede katmanlı mimari yaygın olarak kullanılabilir. Buna göre özelikle veritabanı işlemlerinde veritabanın kendisine erişen data access layer katmanı ve bu data access layer katmanını kullanan bir servis katmanı da yazılabilir. Servis katmanı genel olarak veritabanın kendisinin nasıl çalıştığıyla ilgilenmez. Bunun örneği JSP uygulamasında yapılacaktır.
MySQL veritabanı erişim ( examples içinde)
package org.csystem;
public class App {
public static void main(String[] args)
{
try {
DictionaryDBHelper helper = new DictionaryDBHelper();
for (WordInfo wi : helper.getWords())
System.out.println(wi);
System.out.println("*************************");
WordInfo wi = new WordInfo(3, "glass");
helper.getMeaning(wi);
System.out.println(wi);
}
catch (Throwable ex) {
System.err.println(ex.getMessage());
}
}
}
package org.csystem;
import java.util.ArrayList;
import java.util.List;
public class WordInfo {
private int m_id;
private String m_word;
private List<Meaning> m_meanings;
public WordInfo(int id, String word)
{
super();
m_id = id;
m_word = word;
m_meanings = new ArrayList<>();
}
public boolean add(Meaning m)
{
if (m == null)
throw new IllegalArgumentException("Invalid arguments");
return m_meanings.add(m);
}
public int getId()
{
return m_id;
}
public void setId(int id)
{
m_id = id;
}
public String getWord()
{
return m_word;
}
public void setWord(String word)
{
m_word = word;
}
public Meaning get(int index)
{
return m_meanings.get(index);
}
@Override
public String toString()
{
return String.format("%s:%s", m_word, m_meanings.isEmpty() ? "" : m_meanings);
}
}
package org.csystem;
public class Meaning {
private int m_id;
//...
private String m_meaning;
public Meaning(int id, String meaning)
{
super();
m_id = id;
m_meaning = meaning;
}
public int getId()
{
return m_id;
}
public void setId(int id)
{
m_id = id;
}
public String getMeaning()
{
return m_meaning;
}
public void setMeaning(String meaning)
{
m_meaning = meaning;
}
@Override
public String toString()
{
return m_meaning;
}
}
package org.csystem;
import java.sql.*;
import java.util.ArrayList;
import java.util.List;
public class DictionaryDBHelper {
private static final String JDBC_DRIVER = "com.mysql.jdbc.Driver";
private static final String DB_URL = "jdbc:mysql://localhost:3306/mydictionarydb";
private static final String USER_NAME = "root";
private static final String PASSWORD = "csd1993";
public DictionaryDBHelper() throws ClassNotFoundException, SQLException
{
Class.forName(JDBC_DRIVER);
}
public List<WordInfo> getWords() throws Exception
{
String sql = "select * from words";
List<WordInfo> result = new ArrayList<>();
try (Connection conn = DriverManager.getConnection(DB_URL, USER_NAME, PASSWORD); Statement stmt = conn.createStatement()) {
ResultSet rs = stmt.executeQuery(sql);
while (rs.next())
result.add(new WordInfo(rs.getInt(1), rs.getString(2)));
}
catch (Exception ex) {
throw ex;
}
return result;
}
public WordInfo getMeaning(WordInfo wi) throws Exception
{
String sql = "select * from meanings where word_id=" + wi.getId();
try (Connection conn = DriverManager.getConnection(DB_URL, USER_NAME, PASSWORD); Statement stmt = conn.createStatement()) {
ResultSet rs = stmt.executeQuery(sql);
while (rs.next())
wi.add(new Meaning(rs.getInt(1), rs.getString(3)));
}
catch (Exception ex) {
throw ex;
}
return wi;
}
public int insertWord(WordInfo w) throws Exception
{
String sql = "insert into words (word) values (?)";
int result = 0;
try (Connection conn = DriverManager.getConnection(DB_URL, USER_NAME, PASSWORD); PreparedStatement stmt = conn.prepareStatement(sql)) {
stmt.setString(1, w.getWord());
result = stmt.executeUpdate();
}
catch (Exception ex) {
throw ex;
}
return result;
}
public int updateWord(WordInfo wi) throws Exception
{
String sql = "update words set word=? where words_id=?";
int result = 0;
try (Connection conn = DriverManager.getConnection(DB_URL, USER_NAME, PASSWORD); PreparedStatement stmt = conn.prepareStatement(sql)) {
stmt.setString(1, wi.getWord());
stmt.setInt(2, wi.getId());
result = stmt.executeUpdate();
}
catch (Exception ex) {
throw ex;
}
return result;
}
public int deleteWord(WordInfo wi) throws Exception
{
String sql = "delete from words where word=?";
int result = 0;
try (Connection conn = DriverManager.getConnection(DB_URL, USER_NAME, PASSWORD); PreparedStatement stmt = conn.prepareStatement(sql)) {
stmt.setString(1, wi.getWord());
result = stmt.executeUpdate();
}
catch (Exception ex) {
throw ex;
}
return result;
}
}
Dinamik Web Projelerinde Veritabanı Erişimi
Dinamik web projelerinde MySQL erişimi için ilgili JAR dosyasının web-content içerisindeki web-inf içindeki lib dizinine atılıp bu dizinde de build-path olarak eklenmesi gerekmektedir. Buildpath e eklemek için JAR üzerinde sağ tuş ile add build path seçeneği kullanılabilir.
Sınıf Çalışması
Bir önceki uygulamada JSP sayfası ile toplam bağlantı sayısını ve session sayısını bir tabloda saklayan programı yazınız.
Bu uygulamada sözlüğe kelime ekleyen form'u html dosyası olarak ve ekleme kısmını da bir servlet'le karşılayınız.
Çözüm: **006-SimpleMySqlUsage**
Veritabanı ile programlamada otomatik artan ID'ler için insert etme işleminde insert edildikten hemen sonraki ona atanmış ID'yi almak çoğu zaman gerekmektedir. Bu problemin çözümü, veritabanı yönetim sistem yazılımları arasında farklılık göstermektedir. MySQL ile çözümü aşağıdaki gibidir:
try (Connection conn = DriverManager.getConnection(DB_URL, USER_NAME, PASSWORD); PreparedStatement stmt = conn.prepareStatement(sql, PreparedStatement.RETURN_GENERATED_KEYS)) {
stmt.setString(1, w.getWord());
result = stmt.executeUpdate();
ResultSet rs = stmt.getGeneratedKeys();
if (rs.next())
result = rs.getInt(1);
w.setId(result);
}
catch (Exception ex) {
throw ex;
}
Burada PreparedStatement'a 2. parametre olarak, otomatik oluşturulmuş olan anahtarları ver seçeneği ile yeni bir ResultSet elde edilmektedir. Bu ResultSet yardımıyla son id elde edilmektedir.