스프링프레임워크 & 마이바티스 ☆ 무.료 강의자료 제공 中

30
Spring Framework & MyBatis 스스스 스스스스스 & 스스스스스 스스 탑탑탑탑탑 탑탑탑탑

Upload: 3-2

Post on 21-Feb-2017

27 views

Category:

Education


10 download

TRANSCRIPT

Page 1: 스프링프레임워크 & 마이바티스 ☆ 무.료 강의자료 제공 中

Spring Framework & My-Batis스프링 프레임워크 & 마이바티스 강의

탑크리에듀 교육센터

Page 2: 스프링프레임워크 & 마이바티스 ☆ 무.료 강의자료 제공 中

CONTENTS

1. 스프링 프레임워크 개요

2. Spring & DI

3. Spring AOP((Spring Asp

4. Spring JDBC

4.3 Spring JDBC 에서 DB 접근하는 방법

4.3.2 Spring JDBC 에서 DB 접근하는 방법 – NamedParameterJdbcTemplate

4.3.3 Spring JDBC 에서 DB 접근하는 방법 - SimpleJdbcTemplate

4.3.4 Spring JDBC 에서 DB 접근하는 방법 – SimpleJdbcCall

4.3.5 Spring JDBC 에서 DB 접근하는 방법 – SqlUpdate

4.3.6 Spring JDBC 에서 DB 접근하는 방법 – StoredProcedure

4.3.7 오라클 시퀀스를 위한 DataFieldMaxValueIncrementer

Page 3: 스프링프레임워크 & 마이바티스 ☆ 무.료 강의자료 제공 中

Chapter 4 Spring JDBC

~ 4.3.7

Page 4: 스프링프레임워크 & 마이바티스 ☆ 무.료 강의자료 제공 中

4. Spring JDBC

: 이름없는 ? 대신 이름을 부여해서 바인드 변수 처리가 가능하다 .

4-3. Spring JDBC 에서 DataSource 취득하는 방법 4-3-2. Spring JDBC 에서 DB 접근하는 방법 – NamedParameterJdbcTem-plate

public class PersonDao { @Autowired private NamedParameterJdbcTemplate namedParameterJdbcTemplate;   @Override public void createPerson(Integer id, String firstname, String lastname) { String SQL = "INSERT INTO person (id, firstname, lastname) VALUES (:id, :firstname, :lastname)";   Map namedParameters = new HashMap(); namedParameters.put(“id", id); namedParameters.put(“firstname", firstname); namedParameters.put(“lastname", lastname);   namedParameterJdbcTemplate.update(SQL, namedParameters); } }

Page 5: 스프링프레임워크 & 마이바티스 ☆ 무.료 강의자료 제공 中

4. Spring JDBC

: JdbcTemplate 의 모든 기능과 NamedParameterJdbcTemplate 의 기능을 합친 것으로 자바 5 의 auto boxing 과 varargs(String…args, 가변길이 매개변수 ) 기능을 포함하고 있다 .

4-3. Spring JDBC 에서 DataSource 취득하는 방법 4-3-3. Spring JDBC 에서 DB 접근하는 방법 - SimpleJdbcTemplate

[JdbcTemplate Style]

public class PersonDao { private JdbcTemplate jdbcTemplate; public void setDataSource(DataSource dataSource) { this.jdbcTemplate = new JdbcTemplate(dataSource); }  public Person findPerson(Integer id, String lastname) { String sql = "select id, firstname, lastname from PERSON where id = ? and lastname = ?"; RowMapper<person> mapper = new RowMapper<person>() { public Person mapRow(ResultSet rs, int rowNum) throws SQLException { Person person = new Person(); person.setId(rs.getLong("id")); person.setFirstName(rs.getString("firstname")); person.setLastName(rs.getString("lastname")); return person; } }; // SELECT 인 경우 Mapper 가 뒤에 오고 그 앞에 매개변수들을 객체배열에 담아 넘긴다 . // Person 타입으로 형 변환도 필요하다 . return (Person) jdbcTemplate.queryForObject(sql, new Object[] {id, lastname}, mapper); }

Page 6: 스프링프레임워크 & 마이바티스 ☆ 무.료 강의자료 제공 中

4. Spring JDBC

: JdbcTemplate 의 모든 기능과 NamedParameterJdbcTemplate 의 기능을 합친 것으로 자바 5 의 auto boxing 과 varargs(String…args, 가변길이 매개변수 ) 기능을 포함하고 있다 .

4-3. Spring JDBC 에서 DataSource 취득하는 방법 4-3-3. Spring JDBC 에서 DB 접근하는 방법 - SimpleJdbcTemplate

 [SimpleJdbcTemplate Style]

public class PersonDao { private SimpleJdbcTemplate simpleJdbcTemplate; public void setDataSource(DataSource dataSource) { this. simpleJdbcTemplate = new SimpleJdbcTemplate (dataSource); } public Person findPerson(Integer id, String lastname) { String sql = "select id, firstname, lastname from PERSON where id = ? and lastname = ?"; RowMapper<person> mapper = new RowMapper<person>() { public Person mapRow(ResultSet rs, int rowNum) throws SQLException { Person person = new Person(); person.setId(rs.getLong("id")); person.setFirstName(rs.getString("firstname")); person.setLastName(rs.getString("lastname")); return person; } }; // SELECT 인 경우 Mapper 가 쿼리문 다음에 오고 그 뒤에 가변길이 매개변수 형태로 넘기는 // 객체배열 형태로 받는다 . Person 타입으로 형 변환도 필요없다 . return simpleJdbcTemplate.queryForObject(sql, mapper, id, lastname); }

Page 7: 스프링프레임워크 & 마이바티스 ☆ 무.료 강의자료 제공 中

4. Spring JDBC

DataBase 에 SQL 로 만들어져 있는 저장함수 , 프로시저를 다루기 위한 클래스로 최소한의 구성으로 DB 함수 , Procedure 에 접근할 수 있다 .

4-3. Spring JDBC 에서 DataSource 취득하는 방법 4-3-4. Spring JDBC 에서 DB 접근하는 방법 - SimpleJdbcTemplate

오라클 서버쪽 패키지 (Package) 및 함수 (Function)

create or replace package types as type currtype is ref cursor; end; /  create or replace function getEmp(v_deptno in number) return types.currtype AS emp_cursor types.currtype; sql_string VARCHAR2(500); BEGIN   sql_string := 'SELECT empno, ename, sal FROM EMP WHERE DEPTNO = :1’ ;   OPEN emp_cursor FOR sql_string USING v_deptno;   RETURN emp_cursor;   CLOSE emp_cursor; END; /

Page 8: 스프링프레임워크 & 마이바티스 ☆ 무.료 강의자료 제공 中

4. Spring JDBC4-3. Spring JDBC 에서 DataSource 취득하는 방법 4-3-4. Spring JDBC 에서 DB 접근하는 방법 - SimpleJdbcTemplate

New Project Spring Legacy Project

Project Name : springjdbcSimple Projects : Simple Spring Maven 

[pom.xml 에 추가 ]

 

<dependences>

<dependency>

<groupId>com.oracle</groupId>

<artifactId>ojdbc6</artifactId>

<version>11.1.0.7.0</version>

</dependency>

</dependences>

<repositories>

<repository>

<id>oracle</id>

<name>ORACLE JDBC Repository</name>

<url>https://maven.oracle.com</url>

</repository>

</repositories>

Page 9: 스프링프레임워크 & 마이바티스 ☆ 무.료 강의자료 제공 中

4. Spring JDBC4-3. Spring JDBC 에서 DataSource 취득하는 방법 4-3-4. Spring JDBC 에서 DB 접근하는 방법 - SimpleJdbcTemplate

DTO 역할을 하는 Emp.javapackage edu.onj.function;public class Emp {private String empno;private String ename;private String sal;public Emp() {}public Emp(String empno, String ename, String sal) {this.empno = empno;this.ename = ename;this.sal = sal;}public void setEmpno(String empno) {this.empno = empno;} public void setEname(String ename) {this.ename = ename;}public void setSal(String sal) {this.sal = sal;}public String getEmpno() {return empno; public String getEname() {return ename;}public String getSal() {return sal;}} 

DAO 서 비 스 를 위 한 인 터 페 이 스[EmpDao.java]

package edu.onj.function; import java.util.List;import javax.sql.DataSource;public interface EmpDao {public void setDataSource(DataSource ds);public int[] createEmpList(final List<Emp> emps);public List<Emp> listEmp(Integer empno);} 

Page 10: 스프링프레임워크 & 마이바티스 ☆ 무.료 강의자료 제공 中

4. Spring JDBC4-3. Spring JDBC 에서 DataSource 취득하는 방법 4-3-4. Spring JDBC 에서 DB 접근하는 방법 - SimpleJdbcTemplate

DAO 서비스를 위한 클래스 [EmpDao.java]package edu.onj.function; import java.sql.PreparedStatement;import java.sql.SQLException;import java.sql.Types;import java.util.List;import java.util.Map;import javax.sql.DataSource;import oracle.jdbc.OracleTypes;import org.springframework.jdbc.core.BatchPreparedState-mentSetter;import org.springframework.jdbc.core.JdbcTemplate;import org.springframework.jdbc.core.SqlOutParameter;import org.springframework.jdbc.core.SqlParameter;import org.springframework.jdbc.core.namedparam.MapSql-ParameterSource;import org.springframework.jdbc.core.namedparam.SqlPa-rameterSource;import org.springframework.jdbc.core.simple.SimpleJdbcCall;public class EmpDaoImpl implements EmpDao {private DataSource dataSource;private JdbcTemplate jdbcTemplate;public void setDataSource(DataSource dataSource) {this.dataSource = dataSource;this.jdbcTemplate = new JdbcTemplate(dataSource);}public DataSource getDataSource() {return dataSource;} /*

* 여런건의 EMP 데이터를 BatchPreparedStatementSetter 를 이용하여 일괄 인서트*/@Overridepublic int[] createEmpList(final List<Emp> emps) {String SQL = "insert into emp(empno, ename, sal) values (?, ?, ?)";BatchPreparedStatementSetter setter = null;setter = new BatchPreparedStatementSetter() {@Overridepublic int getBatchSize() {return emps.size();}@Override public void setValues(PreparedStatement ps, int index) throws SQLException {Emp emp = emps.get(index);int parameterIndex = 1;ps.setString(parameterIndex++, emp.getEmpno());ps.setString(parameterIndex++, emp.getEname());ps.setString(parameterIndex++, emp.getSal());}};return jdbcTemplate.batchUpdate(SQL, setter);}

Page 11: 스프링프레임워크 & 마이바티스 ☆ 무.료 강의자료 제공 中

4. Spring JDBC4-3. Spring JDBC 에서 DataSource 취득하는 방법 4-3-4. Spring JDBC 에서 DB 접근하는 방법 - SimpleJdbcTemplate

DAO 서비스를 위한 클래스 [EmpDao.java] /* 오라클 Stored Function 을 호출하여 10 번 부서 사원리스트 출력 (REF CURSOR) */@Overridepublic List<Emp> listEmp(Integer deptno) {SimpleJdbcCall simpleJdbcCall = new SimpleJdbcCall(this.dataSource).withSchemaName("scott").withFunctionName("getEmp").declareParameters(new SqlOutParameter("emp_cursor", OracleTypes.CURSOR, new EmpMapper()),new SqlParameter("v_deptno", Types.INTEGER)).withoutProcedureColumnMetaDataAccess();SqlParameterSource params = new MapSqlParameterSource("v_deptno", deptno); //execute 메서드는 Map 형태러 리턴한다 .Map<String, Object> resultSet = simpleJdbcCall.execute(params);return (List<Emp>) resultSet.get("emp_cursor");}}

 

매퍼 클래스 [EmpMapper.java]package edu.onj.function; import java.sql.ResultSet;import java.sql.SQLException;import org.springframework.jdbc.core.RowMapper;public class EmpMapper implements RowMapper<Emp> {@Overridepublic Emp mapRow(ResultSet rs, int rowNum) throws SQLException {Emp emp = new Emp();emp.setEmpno(rs.getString("empno"));emp.setEname(rs.getString("ename"));emp.setSal(rs.getString("sal"));return emp;}} 

Page 12: 스프링프레임워크 & 마이바티스 ☆ 무.료 강의자료 제공 中

4. Spring JDBC4-3. Spring JDBC 에서 DataSource 취득하는 방법 4-3-4. Spring JDBC 에서 DB 접근하는 방법 - SimpleJdbcTemplate

XML 설정 파일 [src/main/resources/jd-bc.xml]<?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-4.2.xsd "> <!-- Initialization for data source --> <bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close">

<property name="driverClassName">

<value>oracle.jdbc.driver.OracleDriver</value></property><property name="url">

<value>jdbc:oracle:thin:@192.168.0.27:1521:onj</value></property><property name="username">

<value>scott</value>

</property><property name="password">

<value>tiger</value></property>

</bean> <bean id="empDao" class=" edu.onj.function.Emp-DaoImpl"> <property name="dataSource" ref="dataSource" /> </bean> </beans> 

 

Page 13: 스프링프레임워크 & 마이바티스 ☆ 무.료 강의자료 제공 中

4. Spring JDBC4-3. Spring JDBC 에서 DataSource 취득하는 방법 4-3-4. Spring JDBC 에서 DB 접근하는 방법 - SimpleJdbcTemplate

클라이언트 main 함수 [JdbcClient.java]

package edu.onj.function; 

import java.util.ArrayList;

import java.util.List;

import org.springframework.context.support.GenericXmlApplication-

Context;

public class JdbcClient {

public static void main(String[] args) {

GenericXmlApplicationContext ctx = new GenericXmlApplicationCon-

text();

ctx.load("jdbc.xml");

ctx.refresh(); 

EmpDaoImpl empDao = (EmpDaoImpl)ctx.getBean("empDao");

//1. EMP TABLE 에서 부서코드가 10 인 데이터 추출List<Emp> emps = empDao.listEmp(10);System.out.println("------------------ all select ------------------");for (Emp emp : emps) {System.out.println("empno-->" + emp.getEmpno());System.out.println("ename-->" + emp.getEname());System.out.println("sal -->" + emp.getSal());}emps.clear(); //2. BatchPreparedStatementSetter 를 이용하여 List 에 있는 것을 일괄 Insert emps.add(new Emp("9701", "1001 길동 ", "10010"));emps.add(new Emp("9702", "1002 길동 ", "10020"));emps.add(new Emp("9703", "1003 길동 ", "10030"));emps.add(new Emp("9704", "1004 길동 ", "10040"));emps.add(new Emp("9705", "1005 길동 ", "10050"));empDao.createEmpList(emps); //3.spring JDBC SimpleJdbcCall 을 이용한 오라클 함수 (ref cursor 리턴 ) 호출을 통한 10 번 부서 EMP 추출ArrayList<Emp> emps2 = (ArrayList<Emp>)empDao.listEmp(new Integer(10));for(Emp e: emps2) {System.out.println(e.getEmpno() + ":" + e.getEname() + ":" + e.getSal());}ctx.close();}}   

Page 14: 스프링프레임워크 & 마이바티스 ☆ 무.료 강의자료 제공 中

4. Spring JDBC4-3. Spring JDBC 에서 DataSource 취득하는 방법 4-3-4. Spring JDBC 에서 DB 접근하는 방법 - SimpleJdbcTemplate

위 예제의 listEmp() 메소드를 기존 자바 JDBC 의 CallableStatementCallback 을 이용한 방식으로 변경하면 다음과 같다 .

@Overridepublic List<Emp> listEmp2(final Integer deptno){

CallableStatementCallback<List<Emp>> cb = new CallableStatementCallback<List<Emp>>() {

@Overridepublic List<Emp> doInCallableStatement(CallableStatement cs)

throws SQLException, DataAccessException {cs.registerOutParameter(1, OracleTypes.CURSOR);cs.setInt(2, deptno);cs.execute();ResultSet rs = (ResultSet) cs.getObject(1);

 List<Emp> emps = new ArrayList<Emp>();EmpMapper mapper = new EmpMapper();

for (int i = 0; rs.next(); i++) {emps.add(mapper.mapRow(rs, i));

return emps;}};

 return jdbcTemplate.execute("{? = call getEmp(?)}", cb);} 

Page 15: 스프링프레임워크 & 마이바티스 ☆ 무.료 강의자료 제공 中

4. Spring JDBC4-3. Spring JDBC 에서 DataSource 취득하는 방법 4-3-5. Spring JDBC 에서 DB 접근하는 방법 - SimpleJdbcTemplate

재사용 가능한 SQL Update 구문을 생성하며 , 이를 위해 SqlUpdate 클래스를 상속받아서 구현해야 한다 . SqlUpdate 를 상속받은 하위 클래스의 생성자에서 SQL 쿼리 구문 (DML : insert, update, delete), 파라미터를 생성하고

compile() 메소드를 호출하여 컴파일 한다 . 마지막으로 update() 메소드를 호출하여 해당 DML 쿼리를 실행한다 .

public class PersonUpdate extends SqlUpdate { public PersonUpdate(final DataSource ds) { setDataSource(ds);//SqlUpdate 의 메소드 호출 setSql("update Person set firstname = ?, lastname = ? where id = ?"); //SqlUpdate 메소드호출 declareParameter(new SqlParameter(Types.VARCHAR)); //SqlUpdate 메소드호출 declareParameter(new SqlParameter(Types.VARCHAR)); declareParameter(new SqlParameter(Types.INTRGER));  compile(); //SqlUpdate 의 메소드 호출 }

Page 16: 스프링프레임워크 & 마이바티스 ☆ 무.료 강의자료 제공 中

4. Spring JDBC4-3. Spring JDBC 에서 DataSource 취득하는 방법 4-3-5. Spring JDBC 에서 DB 접근하는 방법 - SimpleJdbcTemplate

//update 구문 실행

public int run(final Person person) { Object[] params = new Object[] { person.getFirstName(), person.getLastName(), person.getId()};  return update(params); }}

 public class PersonInsert extends SqlUpdate { public PersonInsert(final DataSource ds) { setDataSource(ds); setSql("insert into Person(id, firstname, lastname) values(?, ?, ?)"); declareParameter(new SqlParameter(Types.INTEGER)); declareParameter(new SqlParameter(Types.VARCHAR)); declareParameter(new SqlParameter(Types.VARCHAR)); compile(); }  // insert 구문 실행 public int run(final Person person) { Object[] params = new Object[] { pserson.getId(), person.getFirstName(), person.getLastName()};  return update(params); }}

Page 17: 스프링프레임워크 & 마이바티스 ☆ 무.료 강의자료 제공 中

4. Spring JDBC4-3. Spring JDBC 에서 DataSource 취득하는 방법 4-3-6. Spring JDBC 에서 DB 접근하는 방법 – StoredProcedure

Spring JDBC 의 StoredProcedure 를 상속받아서 서버쪽의 저장함수나 프러시저에 접근 가능하다 .

[Emp.java]package edu.onj.function2;public class Emp {private String empno;private String ename;private String sal;public Emp() {}public Emp(String empno, String ename, String sal) {this.empno = empno;this.ename = ename;this.sal = sal;}public void setEmpno(String empno) {this.empno = empno;} public void setEname(String ename) {this.ename = ename;}

[Emp.java] 이어서public void setEname(String ename) {this.ename = ename;}public void setSal(String sal) {this.sal = sal;}public String getEmpno() {return empno; public String getEname() {return ename;}public String getSal() {return sal;}}

Page 18: 스프링프레임워크 & 마이바티스 ☆ 무.료 강의자료 제공 中

4. Spring JDBC4-3. Spring JDBC 에서 DataSource 취득하는 방법 4-3-6. Spring JDBC 에서 DB 접근하는 방법 – StoredProcedure

Spring JDBC 의 StoredProcedure 를 상속받아서 서버쪽의 저장함수나 프러시저에 접근 가능하다 .

[EmpDao.java]package edu.onj.function2; import java.util.List;import javax.sql.DataSource;public interface EmpDao {public void setDataSource(DataSource ds);public List<Emp> listEmp(Integer deptno);}

[EmpMapper.java]package edu.onj.function2; import java.sql.ResultSet;import java.sql.SQLException;import org.springframework.jdbc.core.RowMap-per;public class EmpMapper implements RowMap-per<Emp> {@Overridepublic Emp mapRow(ResultSet rs, int rowNum) throws SQLException {Emp emp = new Emp();emp.setEmpno(rs.getInt("empno"));emp.setEname(rs.getString("ename"));emp.setSal(rs.getInt("sal"));return emp;}}

Page 19: 스프링프레임워크 & 마이바티스 ☆ 무.료 강의자료 제공 中

4. Spring JDBC4-3. Spring JDBC 에서 DataSource 취득하는 방법 4-3-6. Spring JDBC 에서 DB 접근하는 방법 – StoredProcedure

Spring JDBC 의 StoredProcedure 를 상속받아서 서버쪽의 저장함수나 프러시저에 접근 가능하다 .

[EmpJDBCTemplate.java]package edu.onj.function2; import java.sql.Types;import java.util.*;import javax.sql.DataSource;import oracle.jdbc.OracleTypes;import org.springframework.jdbc.core.SqlOutParameter;import org.springframework.jdbc.core.SqlParameter;import org.springframework.jdbc.object.StoredProcedure;public class EmpJDBCTemplate extends StoredProcedure implements EmpDao {private DataSource dataSource;private static final String SQL = "getEmp";public EmpJDBCTemplate(DataSource dataSource) {super(dataSource, SQL);setFunction(true);declareParameter(new SqlOutParameter("emp_cursor", OracleType-s.CURSOR, newEmpMapper()));declareParameter(new SqlParameter("v_deptno", Types.INTEGER));} @Overridepublic List<Emp> listEmp(Integer deptno) {Map<String, Object> resultSet = execute(deptno);ArrayList<Emp> list = (ArrayList) resultSet.get("emp_cursor");return list;}}

[JdbcClient.java]package edu.onj.function2; import java.sql.SQLException;import java.util.ArrayList;import java.util.List;import onj.edu.jdbc1.Customer;import org.springframework.context.ApplicationContext;import org.springframework.context.support.ClassPathXmlAppli-cationContext;public class JdbcClient {public static void main(String[] args) {ApplicationContext ctx = new ClassPathXmlApplicationContext("jdbc2.xml");EmpJDBCTemplate empJDBCTemplate =(EmpJDBCTemplate)ctx.getBean("empJDBCTemplate");ArrayList<Emp> list = new ArrayList<Emp>();list = (ArrayList<Emp>) empJDBCTemplate.listEmp(20);for (Emp emp:list){System.out.println("empno --> "+emp.getEmpno()+"ename --> "+emp.getEname()+" sal --> "+emp.getSal() );}}}

Page 20: 스프링프레임워크 & 마이바티스 ☆ 무.료 강의자료 제공 中

4. Spring JDBC4-3. Spring JDBC 에서 DataSource 취득하는 방법 4-3-6. Spring JDBC 에서 DB 접근하는 방법 – StoredProcedure

[jdbc2.xml]<?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-4.2.xsd"><bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource" de-stroymethod="close"><property name="driverClassName"><value>oracle.jdbc.driver.OracleDriver</value></property><property name="url"><value>jdbc:oracle:thin:@192.168.0.27:1521:onj</value></property><property name="username"><value>scott</value></property><property name="password"><value>tiger</value></property></bean> <bean id="empJDBCTemplate" class=" edu.onj.function2.EmpJDBCTemplate"><constructor-arg ref="dataSource"/></bean></beans>

Page 21: 스프링프레임워크 & 마이바티스 ☆ 무.료 강의자료 제공 中

4. Spring JDBC4-3. Spring JDBC 에서 DataSource 취득하는 방법 4-3-7. 오라클 시퀀스를 위한 DataFieldMaxValueIncrementer

DataFieldMaxValueIncrementer 인터페이스는 DB 테이블의 칼럼값을 MAX VALUE 까지 자동증분 하기 위한 용도로 사용되는 스프링의 인터페이스 이다 . 오라클 DB 라면 시퀀스를 스프링에서 사용할 수 있게 해 준다 .

인터페이스의 구조는 다음과 같다 .

public interface DataFieldMaxValueIncrementer {public int nextIntValue() throws DataAccessException; public long nextLongValue() throws DataAccessException; public String nextStringValue() throws DataAccessExcep-tion;}

스프링배치에서는 기본적으로 , Oracle, DB2, Derby, Hsql, Mysql, Postgres, MS-SQL Server, Sybase 등의 주요 DB 에 대한 DataFieldMaxValueIncrementer 의 구현 클래스가 제공되고 있다 . 

사용절차는 다음과 같다 .

Page 22: 스프링프레임워크 & 마이바티스 ☆ 무.료 강의자료 제공 中

4. Spring JDBC4-3. Spring JDBC 에서 DataSource 취득하는 방법 4-3-7. 오라클 시퀀스를 위한 DataFieldMaxValueIncrementer

1. Spring 설정파일에서 사용할 incrementer 에 대해 정의DB2 는 SequenceMaxValueIncrementer, MySQL 은 MySQLMaxValueIncrementer, PostgreSQL 이라면 Post-greSQLSequenceMaxValueIncrementer, 오라클인 경우 OracleSequenceMaxValueIncrementer 를 사용한다 . 

<bean id="incrementer" class="org.springframework.jdbc.support.incrementer.OracleSequenceMaxValueIncrementer"> <property name="dataSource"> <ref bean="dataSource"/> </property> <property name="incrementerName"> <value>SEQ_SID</value> <!– 오라클에 만들어 놓은 시퀀스 이름 - </property></bean>

2. Insert SQL 문을 실행하는 부분에서 정의된 incrementer 사용 

private DataFieldMaxValueIncrementer incrementer; public void setIncrementer(DataFieldMaxValueIncrementer incrementer) { this.incrementer = incrementer;}….String strQuery = "INSERT INTO BOARD VALUES ( ?, ?, ?, ?, ?, sysdate) ";int currentSid =new Integer(incrementer.nextIntValue());

Page 23: 스프링프레임워크 & 마이바티스 ☆ 무.료 강의자료 제공 中

4. Spring JDBC4-3. Spring JDBC 에서 DataSource 취득하는 방법 4-3-7. 오라클 시퀀스를 위한 DataFieldMaxValueIncrementer

사용 예제1. [CustomerDao.java]

package onj.edu.jdbc1; import java.util.List; import javax.sql.DataSource;  public interface CustomerDAO { public void setDataSource(DataSource ds); public void create(Integer id, String name, Integer age); public Customer getCustomer(Integer id); public List<Customer> listCustomer(); public void delete(Integer id); public void update(Integer id, Integer age); }

Page 24: 스프링프레임워크 & 마이바티스 ☆ 무.료 강의자료 제공 中

4. Spring JDBC4-3. Spring JDBC 에서 DataSource 취득하는 방법 4-3-7. 오라클 시퀀스를 위한 DataFieldMaxValueIncrementer

사용 예제2. [CustomerJDBCTemplate.java]

package onj.edu.jdbc1; import java.util.List;import javax.sql.DataSource;import org.springframework.jdbc.core.JdbcTemplate;import org.springframework.jdbc.support.incrementer.DataFieldMaxValueIncrementer; public class CustomerJDBCTemplate implements CustomerDAO {

private DataSource dataSource;private JdbcTemplate jdbcTemplate;private DataFieldMaxValueIncrementer incrementer;

 public void setIncrementer(DataFieldMaxValueIncrementer incrementer) {

this.incrementer = incrementer;}

 public void setDataSource(DataSource ds) {

this.dataSource = ds;this.jdbcTemplate = new JdbcTemplate(ds);

public void create(Integer id, String name, Integer age) {String SQL = "insert into customer(id, name, age) values (?, ?, ?)";jdbcTemplate.update(SQL, new Integer(incrementer.nextIntValue()), name, age);System.out.println("<<<Customer insert ok ::: " + name + "," + age);

Page 25: 스프링프레임워크 & 마이바티스 ☆ 무.료 강의자료 제공 中

4. Spring JDBC4-3. Spring JDBC 에서 DataSource 취득하는 방법 4-3-7. 오라클 시퀀스를 위한 DataFieldMaxValueIncrementer

사용 예제2. [CustomerJDBCTemplate.java]

 

public Customer getCustomer(Integer id) {String SQL = "select * from customer where id = ?";Customer customer = jdbcTemplate.queryForObject(SQL, new Object[] { id }, new Cus-

tomerMapper());return customer;

public List<Customer> listCustomer() {String SQL = "select * from customer";List<Customer> customer = jdbcTemplate.query(SQL, new CustomerMapper());return customer;

public void delete(Integer id) {String SQL = "delete from customer where id = ?";jdbcTemplate.update(SQL, id);System.out.println("<<< customer delete ok ::: id = " + id);

public void update(Integer id, Integer age) {String SQL = "update customer set age = ? where id = ?";jdbcTemplate.update(SQL, age, id);System.out.println("<<< customer update ok ::: id = " + id);

} }

Page 26: 스프링프레임워크 & 마이바티스 ☆ 무.료 강의자료 제공 中

4. Spring JDBC4-3. Spring JDBC 에서 DataSource 취득하는 방법 4-3-7. 오라클 시퀀스를 위한 DataFieldMaxValueIncrementer

사용 예제3. [CustomerMapper.java]

 

package onj.edu.jdbc1; 

import java.sql.ResultSet; import java.sql.SQLException; import org.springframework.jdbc.core.RowMapper;  public class CustomerMapper implements RowMapper<Customer>{ @Override public Customer mapRow(ResultSet rs, int arg1) throws SQLException { Customer customer = new Customer(); customer.setId(rs.getInt("id")); customer.setName(rs.getString("name")); customer.setAge(rs.getInt("age")); return customer; } }

Page 27: 스프링프레임워크 & 마이바티스 ☆ 무.료 강의자료 제공 中

4. Spring JDBC4-3. Spring JDBC 에서 DataSource 취득하는 방법 4-3-7. 오라클 시퀀스를 위한 DataFieldMaxValueIncrementer

사용 예제4. [jdbc3.xml]

 

<?xml version="1.0" encoding="UTF-8"?><beans xmlns="http://www.springframework.org/schema/beans"

xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:aop="http://www.springframe-work.org/schema/aop"

xmlns:context="http://www.springframework.org/schema/context"xmlns:jdbc="http://www.springframework.org/schema/jdbc" xmlns:util="http://

www.springframework.org/schema/util"xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframe-

work.org/schema/beans/spring-beans.xsdhttp://www.springframework.org/schema/aop http://www.springframework.org/

schema/aop/spring-aop-4.2.xsdhttp://www.springframework.org/schema/context http://www.springframework.org/

schema/context/spring-context-4.2.xsdhttp://www.springframework.org/schema/jdbc http://www.springframework.org/

schema/jdbc/spring-jdbc-4.2.xsdhttp://www.springframework.org/schema/util http://www.springframework.org/

schema/util/spring-util-4.2.xsd"> 

<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource"destroy-method="close"><property name="driverClassName">

<value>oracle.jdbc.driver.OracleDriver</value></property><property name="url">

<value>jdbc:oracle:thin:@192.168.0.27:1521:onj</value></property><property name="username">

<value>scott</value></property>

Page 28: 스프링프레임워크 & 마이바티스 ☆ 무.료 강의자료 제공 中

4. Spring JDBC4-3. Spring JDBC 에서 DataSource 취득하는 방법 4-3-7. 오라클 시퀀스를 위한 DataFieldMaxValueIncrementer

사용 예제4. [jdbc3.xml]

 <property name="password">

<value>tiger</value></property>

</bean><bean id="customerJDBCTemplate" class="onj.edu.jdbc1.CustomerJDBCTemplate">

<property name="dataSource" ref='dataSource'></property><property name="incrementer" ref = "incrementer"></property>

</bean><bean id="incrementer"

class="org.springframework.jdbc.support.incrementer.OracleSequenceMaxValueIncrementer"><property name="dataSource">

<ref bean="dataSource" /></property><property name="incrementerName">

<value>SEQ_SID</value> <!-- 오라클에 만들어 놓은 시퀀스 이름 --></property>

</bean></beans>

Page 29: 스프링프레임워크 & 마이바티스 ☆ 무.료 강의자료 제공 中

4. Spring JDBC4-3. Spring JDBC 에서 DataSource 취득하는 방법 4-3-7. 오라클 시퀀스를 위한 DataFieldMaxValueIncrementer

사용 예제5. [JdbcClient.java]

package onj.edu.jdbc1; 

import java.util.List; import org.springframework.context.ApplicationContext; import org.springframework.context.support.ClassPathXmlApplicationContext;  public class JdbcClient { public static void main(String[] args) { ApplicationContext ctx = new ClassPathXmlApplicationContext("jdbc3.xml");  

CustomerJDBCTemplate jdbcTemplate = (CustomerJDBCTemplate)ctx.getBean("customerJDBCTemplate");  

jdbcTemplate.create(4, "4 길동 ", 4); jdbcTemplate.create(5, "5 길동 ", 5); jdbcTemplate.create(6, "6 길동 ", 6);  

List <Customer> customers = jdbcTemplate.listCustomer(); System.out.println("------------------ all select ------------------"); for(Customer customer:customers){ System.out.println("id ----> "+customer.getId()); System.out.println("name ----> "+customer.getName()); System.out.println("age ----> "+customer.getAge()); } jdbcTemplate.update(4, 99);  

Customer customer = jdbcTemplate.getCustomer(4); System.out.println("--------- 변경된 4 번 데이터 -------------"); System.out.println("id ----> "+customer.getId()); System.out.println("name ----> "+customer.getName()); System.out.println("age ----> "+customer.getAge());  

+ 이어서jdbcTemplate.delete(5);  customers = jdbcTemplate.listCustomer(); System.out.println("--------- 5 번 삭제 후 ----------"); for(Customer customer1:customers){ System.out.println("id ----> "+customer1.getId()); System.out.println("name ----> "+customer1.getName()); System.out.println("age ----> "+customer1.getAge()); } }

Page 30: 스프링프레임워크 & 마이바티스 ☆ 무.료 강의자료 제공 中

Any Questions ?

THANK YOU FOR YOUR ATTENTION

무료국비지원교육 / 구로자바학원 _ 탑크리에듀 교육센터 http://www.-topcredu.co.kr