JDBC Api vs Spring Jdbc Template
JDBC Api
Java’da ilişkisel veritabanı(Relational Database) işlemleri jdbc(Java database connectivity) Api ile yapılmaktadır. Yani JDBC bizi veritabanına bağlayan yapıdır.
Resimde sadece Oracle veritabanı gösterilsede jdbc api bize diğer veritabanlarıyla da bağlantı kurmamızı sağlar zaten asıl amacı da dediğim gibi bizi veritabanına bağlamasıdır burda işlemler veritabanı bağımsız yapar yani biz hangi ilişkisel veritabanı ile çalışırsak o veritabanının dirverı bağlanmamış için yeterli olacaktır. Jdbc’nin driverları bulunan veritanbaları aşağıda verilmiştir.
- Oracle
- MySql
- PostgreSql
- Sybase
- DB2
- Microsoft SQL Server
Kısa bir Jdbc Api ile giriş yaptıktan sonra nasıl veritabanına kayıt yapabiliriz hemen bakalım.
Yapılması gereken adımlar;
- MySql WorkBench kurulumu ve dolayısıyla bunu ayağa kaldırmak için XAMPP ya da WAMP server.
- Örnek bir veritabanı oluşturma
- Kayıt yapabilmek için oluşturulan veritabanına tablo oluşturma.
- Bir maven projesi oluşturma
Projemizi de oluşturduktan sonra pom.xml dosyamıza şunları ekliyoruz.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 |
<dependencies> <!-- https://mvnrepository.com/artifact/org.springframework/spring-core --> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-core</artifactId> <version>4.3.9.RELEASE</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-context</artifactId> <version>4.3.9.RELEASE</version> </dependency> <!-- https://mvnrepository.com/artifact/org.springframework/spring-jdbc --> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-jdbc</artifactId> <version>4.3.9.RELEASE</version> </dependency> <!-- https://mvnrepository.com/artifact/mysql/mysql-connector-java --> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>5.1.6</version> </dependency> </dependencies> |
Görüldüğü üzere bu projede bir karşılaştırma yapacağımız için sadece mysql connector değil projemizin devamında gerekecek bağımlılıklarımızda eklenmiştir.
Bir model class’ı oluşturuyoruz. Bütün bütün getter setter metodlarını ekliyoruz ve toString() metodunu override ediyoruz.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 |
public class Employee { private int id; private String name; private String surname; private String phone; public Employee() { } public Employee(int id, String name, String surname, String phone) { this.id = id; this.name = name; this.surname = surname; this.phone = phone; } public int getId() { return id; } public void setId(int id) { this.id = id; } 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; } public String getPhone() { return phone; } public void setPhone(String phone) { this.phone = phone; } @Override public String toString() { return "Employee{" + "id=" + id + ", name='" + name + ''' + ", surname='" + surname + ''' + ", phone='" + phone + ''' + '}'; } } |
Bir interface oluşturarak burda oluşturacağımız metodlarımı tanımlıyoruz.
1 2 3 4 5 6 7 8 9 |
public interface IEmployeeDAO { void insertEmployee(Employee employee); } |
Şimdi ise bu interface’den implement edilen class’ımızda bu metodu gerçekleştirmekte.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 |
public class EmployeeDAOImpl implements IEmployeeDAO { static final String JDBC_DRIVER = "com.mysql.jdbc.Driver"; static final String DB_URL = "jdbc:mysql://localhost/testdb"; static final String USER = "root"; static final String PASS = ""; public void insertEmployee(Employee employee) { Connection connection; PreparedStatement preparedStatement; try { Class.forName("com.mysql.jdbc.Driver"); System.out.println("Connecting to a selected database..."); connection = DriverManager.getConnection(DB_URL, USER, PASS); System.out.println("Connected database successfully..."); System.out.println("Inserting records into the table..."); String sql = "INSERT INTO Employee VALUES (?,?,?,?)"; preparedStatement = (PreparedStatement) connection.prepareStatement(sql); preparedStatement.setInt(1,employee.getId()); preparedStatement.setString(2,employee.getName()); preparedStatement.setString(3,employee.getSurname()); preparedStatement.setString(4,employee.getPhone()); preparedStatement.executeUpdate(); System.out.println("Inserted record into the table..."); } catch (ClassNotFoundException e) { e.printStackTrace(); } catch (SQLException e) { e.printStackTrace(); } } } |
Not: DB_URİ, USER ve PASS değerleri benim veritabanı ismim ve o veritabanına bağlanmam için gereken bilgiler siz bu bilgileri kendiniz için değiştirin.
Görüldüğü üzere bir kayıt işlemi için;
- Connection
- Statement
- Sorguyu çalıştır
- Sonuçları al
- Connection kapat
Bu işlemler basit bir kayıt işlemi için yapılmıştır. Bu kayıt işlemine log’lama ve gerçekleştirilme zamanı gibi bilgilerde eklenebilir.
- Kod zamanla okunurluğu azalır
Spring Jdbc Template
Spring framework yukarı bashedilen işlemlerden yazılımcıyı soyutlar ve bunu nasıl yaptığını ise şimdi bir göz atalım.
Aynı şekilde daha önceden oluşturduğumuz interfaceden implement eden bir class oluşturuyoruz.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 |
import jdbc_api.dao.IEmployeeDAO; import model.Employee; import org.springframework.jdbc.core.JdbcTemplate; import javax.sql.DataSource; /** * Created by cem */ public class EmployeeJdbcTemplateDAOImpl implements IEmployeeDAO { private DataSource dataSource; private JdbcTemplate jdbcTemplate; public void setDataSource(DataSource dataSource) { this.dataSource = dataSource; this.jdbcTemplate = new JdbcTemplate(dataSource); } public void insertEmployee(Employee employee) { String sql = "insert into employee (id,name,surname,phone) values (?,?,?,?)"; jdbcTemplate.update(sql,employee.getId(),employee.getName(),employee.getSurname(),employee.getPhone()); System.out.println("inserted record : " + employee.toString()); } } |
Görüldüğü üzere Jdbc ile yazdığımız koda göre;
- Kısa
- Anlaşılır
- Asıl yapması gerektiği işi yapan yani metodun tek bir sorumluluğu var
Peki ya Spring hangi veritabanına yazacağını, kullanıcı bilgilerini nerden biliyor?
Cevabı ise aşağıda verilen Bean.xml dosyasında. src/resources altına Bean.xml dosyası açıyoruz ve ayarlarımızı aşadağıdaki gibi konfigüre ediyoruz.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 |
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd"> <!-- Initialization for data source --> <bean id="dataSource" class = "org.springframework.jdbc.datasource.DriverManagerDataSource"> <property name = "driverClassName" value = "com.mysql.jdbc.Driver"/> <property name = "url" value = "jdbc:mysql://localhost:3306/testdb"/> <property name = "username" value = "root"/> <property name = "password" value = ""/> </bean> <!-- Definition for employeeJdbcTemplateDAO bean --> <bean id = "employeeJdbcTemplateDAO" class = "spring_jdbc_template.EmployeeJdbcTemplateDAOImpl"> <property name = "dataSource" ref = "dataSource" /> </bean> </beans> |
Sonuç
Java’da veritabanı işlemleri için hangi framework kullanırsak kullanalım yapılan iş Jdbc’ye dayanır. Kullandığımız bu frameworkler sadece bizleri bazı işlerden soyutlar. Bir mühendis adayı olarak bizlerin framework bağımlısı birer yazılımcı yerine işlerin arka planda nasıl yürüdüğünü bilen sorun çıktığında ya da kullandığımız framework bize bazı bazı avantajlar sağlarken bazı eksileri olduğunu anlarsak ve bu eksilerin bize neler kaybettirdiğini bilirsek, ne zaman kullanıp ne zaman kullanmamızın gerekliliğini fark edersek iyi birer yazımlıcı olacağımızı düşünüyorum. Spring gibi framework’leri kullanıp hayatında reflection duymamak bizleri sadece bu frameworklere bağımlı yapar.
Projenin kodları : https://github.com/cemdrman/SpringJdbcTemplateEx
İsterseniz projeyi fork edip üzerinde değişiklikler yapabilir ve bu projeyi geliştirme amaçlı kullanıbilirsiniz yapacağınız pull-request’leri kabul edebilirim.
Kaynaklar
• Alper AKALIN Enterprise Java : https://kimkorkarjavadan.com/enterprise-java/
• Özcan ACAR Pratik Spring : http://www.pratikprogramci.com/urun/pratik-spring-core-ozcanacar/