Spring – 19 – JdbcTemplate

Merhaba Arkadaslar
Onceki bolumde Spring ‘te JDBC kullanimini incelemeye baslamistik. Bu bolumde org.springframework.jdbc.core.JdbcTemplate sinifini inceleyecegiz.
JdbcTemplate sinifi ile daha temiz/clean kod yazabiliriz.

JDBC Configuration

Onceki bolumde Maven Dependency’leri eklemistik. Bu bolumde de ayni dosyayi kullanacagiz.

jdbc.properties

## Oracle configuration

jdbc.driverClassName=oracle.jdbc.driver.OracleDriver
jdbc.url=jdbc:oracle:thin:@localhost:1521:xe
jdbc.username=Levent
jdbc.password=123456

## MySQL configuration

##jdbc.driverClassName=com.mysql.jdbc.Driver //is deprecated
#jdbc.driverClassName=com.mysql.cj.jdbc.Driver
#jdbc.url=jdbc:mysql://localhost:3306/springjdbc?serverTimezone=UTC      
#jdbc.username=root
#jdbc.password=

Domain Object / Model

Ornegimizi uygulamaya baslayalim , bir onceki ornegimizde oldugu gibi ;

Person.java

package _25.jdbcTemplate.model;

public class Person {

	private int id;
	private String name;
	private String surname;
	private int birthYear;
	public Person(int id, String name, String surname, int birthYear) {
		super();
		this.id = id;
		this.name = name;
		this.surname = surname;
		this.birthYear = birthYear;
	}
        //getters and setters
....
}

Retrieving Domain Objects with RowMapper<T>

SQL sorgumuz sonucu cogu zaman birden fazla row/kayit gelecektir. Her bir kaydi ilgili domain objesine donusturmek gerekir.
Bunun icin Spring, RowMapper<T> arabirimini destekler. Boylelikle JDBC result set ile POJO’lar map edilir.

PersonRowMapper.java
RowMapper arabirimi uyguluyoruz/implements ve mapRow metodunu override edelim.

package _25.jdbcTemplate.dao;

import java.sql.ResultSet;
import java.sql.SQLException;

import org.springframework.jdbc.core.RowMapper;

import _25.jdbcTemplate.model.Person;

public class PersonRowMapper implements RowMapper<Person> {

	@Override
	public Person mapRow(ResultSet resultSet, int rowNum) throws SQLException {
		
		int id = resultSet.getInt("id");
		String name = resultSet.getString("name");
		String surname = resultSet.getString("surname");
		int birthYear = resultSet.getInt("birthYear");
		
		Person person = new Person(id, name, surname, birthYear);	
		return person;
	}

}

DAO(Data Access Object) Design & Implementation

Onceki ornegimizde olan metotlari burada da kullanabiliriz.

PersonDAO.java

package _25.jdbcTemplate.dao;

import java.util.List;

import _25.jdbcTemplate.model.Person;

public interface PersonDAO {

	public void insert(Person person);

	public Person getPersonById(int id);

	public List<Person> getAllPersons();

	public void update(Person person);

	public void delete(int id);

	public void deleteAllPersons();
}

PersonDAOImpl.java

package _25.jdbcTemplate.dao;

import java.util.List;

import javax.sql.DataSource;

import org.springframework.jdbc.core.JdbcTemplate;

import _25.jdbcTemplate.model.Person;

public class PersonDAOImpl implements PersonDAO {

	// Watch out for mysql;
	// http://stackoverflow.com/questions/8147447/use-mysql-lower-case-table-names-to-1
	private final static String INSERT_PERSON = "insert into person (id, name, surname,birthYear) values (?, ?, ?,?)";
	private final static String SELECT_BYID = "select * from person where id=?";
	private final static String ALL_SELECT = "select * from person";
	private final static String UPDATE_PERSON = "update person set name=? , surname=? , birthYear=? where id=?";
	private final static String DELETE_PERSON = "delete from person where id=?";
	private final static String DELETE_PERSON_ALL = "delete from person";

	private JdbcTemplate jdbcTemplate;

	public void setDataSource(DataSource dataSource) {
		jdbcTemplate = new JdbcTemplate(dataSource);
	}

	@Override
	public void insert(Person person) {

		Object[] insertParams = new Object[] { person.getId(), person.getName(), person.getSurname(),
				person.getBirthYear() };
		jdbcTemplate.update(INSERT_PERSON, insertParams);
		// logging
		System.out.println("Person is inserted... " + person);

	}

	@Override
	public Person getPersonById(int id) {
		Object[] selectParams = new Object[] { id };

		Person person = jdbcTemplate.queryForObject(SELECT_BYID, selectParams, new PersonRowMapper());
		// logging
		System.out.println("Person is found... " + person);
		return person;
	}

	@Override
	public List<Person> getAllPersons() {
		List<Person> personList = jdbcTemplate.query(ALL_SELECT, new PersonRowMapper());

		// logging
		System.out.println("Person list...");
		for (Person person : personList) {
			System.out.println(person);
		}

		return personList;
	}

	public void update(Person person) {
		Object[] insertParams = new Object[] { person.getName(), person.getSurname(), person.getBirthYear(),
				person.getId() };
		jdbcTemplate.update(UPDATE_PERSON, insertParams);
		// logging
		System.out.println("Person is updated... " + person);
	}

	@Override
	public void delete(int id) {
		jdbcTemplate.update(DELETE_PERSON, id);
		// logging
		System.out.println("Person is deleted... Id :" + id);
	}

        @Override
	public void deleteAllPersons() {
		jdbcTemplate.update(DELETE_PERSON_ALL);
		//
		System.out.println("All persons are deleted. ");
	}

}

Kodlari inceleyecek olursak , JdbcTemplate sinifi tipinde bir instance variable tanimliyoruz.
setDataSource metodunda yeni bir JdbcTemplate objesi olusturuyoruz. XML konfigurasyonumuz ile setter injection teknigini gerceklestirdigimizde JdbcTemplate objesi olusacaktir.

Sorgularimiz ayni sekilde kaldi.

insert metodunu inceleyecek olursak update metoduna Object[] argumani geciyoruz. Bu insertParams soru isareti (?) yerine gececek olan parametreleri temsil etmektedir.

insert islemi icin update metodunu kullanabiliriz.

getPersonById metotunda sorguda kullanilacak parametrelerle birlikte PersonRowMapper objesini arguman olarak veriyoruz.

25.jdbcTemplate.xml
Onceki ornegimizde oldugu gibi PropertyPlaceHolderConfiguration bean tanimini kullaniyoruz.
Yine benzer sekilde DriverManagerDataSource bean tanimini yapiyoruz.

<?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">

	<bean
		class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
		<property name="location">
			<value>jdbc/jdbc.properties</value>
		</property>
	</bean>

	<bean id="dataSourceId"
		class="org.springframework.jdbc.datasource.DriverManagerDataSource">
		<property name="driverClassName" value="${jdbc.driverClassName}" />
		<property name="url" value="${jdbc.url}" />
		<property name="username" value="${jdbc.username}" />
		<property name="password" value="${jdbc.password}" />
	</bean>

	<bean id="personDAOImplId" class="_25.jdbcTemplate.dao.PersonDAOImpl">
		<property name="dataSource" ref="dataSourceId" />
	</bean>
</beans>

JdbcTemplateTest.java

package _25.jdbcTemplate.test;

import java.sql.SQLException;

import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

import _25.jdbcTemplate.dao.PersonDAO;
import _25.jdbcTemplate.model.Person;

public class JdbcTemplateTest {

	public static void main(String[] args) throws SQLException {
		ApplicationContext ctx = new ClassPathXmlApplicationContext("25.jdbcTemplate.xml");

		PersonDAO personDAO = ctx.getBean(PersonDAO.class);

		// create person object
		Person person = new Person(1, "Lvnt", "Erguder", 1989);

		// insert
		personDAO.insert(person);

		// find
		personDAO.getPersonById(1);

		// update
		person.setName("Levent");
		personDAO.update(person);

		// delete
		personDAO.delete(1);

		Person person2 = new Person(12, "James", "Gosling", 1955);
		Person person3 = new Person(13, "Joshua", "Bloch", 1961);

		personDAO.insert(person2);
		personDAO.insert(person3);

		// getAllPersons
		personDAO.getAllPersons();

		// deleteAllPersons
		personDAO.deleteAllPersons();
		((ClassPathXmlApplicationContext) ctx).close();

	}
}

Ornegimizi calistirdigimizda ;

Person is inserted... Person [id=1, name=Lvnt, surname=Erguder, birthYear=1989]
Person is found... Person [id=1, name=Lvnt, surname=Erguder, birthYear=1989]
Person is updated... Person [id=1, name=Levent, surname=Erguder, birthYear=1989]
Person is deleted... Id :1
Person is inserted... Person [id=12, name=James, surname=Gosling, birthYear=1955]
Person is inserted... Person [id=13, name=Joshua, surname=Bloch, birthYear=1961]
Person list...
Person [id=12, name=James, surname=Gosling, birthYear=1955]
Person [id=13, name=Joshua, surname=Bloch, birthYear=1961]
All persons are deleted.

Github kaynak dosyalar/ source folder
leventerguder/injavawetrust-spring-tutorial

Yazimi burada sonlandiriyorum.
Herkese Bol Javali Gunler dilerim.
Be an oracle man , import java.*;
Levent Erguder
OCP, Java SE 6 Programmer
OCE, Java EE 6 Web Component Developer

Print Friendly, PDF & Email

Leave a Reply

Your email address will not be published. Required fields are marked *