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
Leave a Reply